第三方支付之支付宝支付
2016-08-05 本文已影响457人
fengyongge
前言
App开发中用到的支付有支付宝、微信、银联卡、pos等,但最常见的方式就是支付宝和微信支付,尤其电商项目。闲来没事总结一下,以下是集成支付宝支付的个人心得。
首先App添加支付宝支付功能,需要满足两点条件。
1:签约成为支付宝商户
签约地址:https://b.alipay.com/, 只有成为签约商户的开发者才能具备集成支付宝app支付的资格。 签约资料:1)营业执照 2)APP说明文档 3)商户经营信息、商户联系人等信息
2:集成APP代码
2.1:导入jar包资源
Eclipse将lib包复制到lib文件夹下,Android studio在gradle中可以添加依赖
compile files('libs/alipaySdk-20160223.jar')
2.2:修改AndroidManifest.xml清单
声明activity
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" >
</activity>
添加权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2.3:根据情况添加支付宝混淆规则
2.4:添加主要代码(重要)
支付宝数据交互流程图主要流程分为:
1:app通过下单调用后台接口,然后后台服务器返回签名后订单信息
2:app调起支付宝支付,传签名的订单信息,用户输入支付宝密码进行支付
3:支付宝返回支付结果,app进行支付结果展示,支付宝服务端异步回调商户服务端即我们自己后台服务端,后台更改订单状态
生成签名后的订单信息官方建议安全起见,在后台服务端生成,在此我在app端生成方面讲解整个流程。
//生成订单所需信息
public String getOrderInfo(String order_id,String order_sn, String price) {
// 签约合作者身份ID
String orderInfo = "partner=" + "\"" + Keys.DEFAULT_PARTNER + "\"";
// 签约卖家支付宝账号
orderInfo += "&seller_id=" + "\"" + Keys.DEFAULT_SELLER + "\"";
// 商户网站唯一订单号
orderInfo += "&out_trade_no=" + "\"" + order_id+"-"+getTimeByCalendar()+ "\"";
// 商品名称
orderInfo += "&subject=" + "\"" + order_sn + "\"";
// 商品详情
orderInfo += "&body=" + "\"" + order_id + "\"";
// 商品金额
orderInfo += "&total_fee=" + "\"" + price + "\"";
// 服务器异步通知页面路径
orderInfo += "¬ify_url=" + "\"" + payUrlBean.getAlipay_order_pay_notify()
+ "\"";
// 服务接口名称, 固定值
orderInfo += "&service=\"mobile.securitypay.pay\"";
// 支付类型, 固定值
orderInfo += "&payment_type=\"1\"";
// 参数编码, 固定值
orderInfo += "&_input_charset=\"utf-8\"";
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
orderInfo += "&it_b_pay=\"30m\"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
orderInfo += "&return_url=\"m.alipay.com\"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&paymethod=\"expressGateway\"";
return orderInfo;
}
// 对订单信息做RSA 签名
String sign = sign(orderInfo);
try {
// 仅需对sign 做URL编码
sign = URLEncoder.encode(sign, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 完整的符合支付宝参数规范的订单信息
final String payInfo = orderInfo + "&sign=\"" + sign + "\"&"+ getSignType();
然后app需要调起支付宝上传订单信息
Runnable payRunnable = new Runnable() {
@Override
public void run() {
// 构造PayTask 对象
PayTask alipay = new PayTask(OrderConfirmActivity.this);
boolean exist = alipay.checkAccountIfExist();
// 调用支付接口,获取支付结果
String result = alipay.pay(payInfo);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
根据支付宝返回的支付结果展示信息
private Handler mHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case RQF_PAY:
//支付成功
break;
case RQF_LOGIN:
//支付失败
break;
case SDK_PAY_FLAG:
PayResult payResult = new PayResult((String) msg.obj);
// 支付宝返回此次支付结果及加签,建议对支付宝签名信息拿签约时支付宝提供的公钥做验签
String resultInfo = payResult.getResult();
String resultStatus = payResult.getResultStatus();
// 判断resultStatus 为“9000”则代表支付成功,具体状态码代表含义可参考接口文档
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(OrderConfirmActivity.this, "支付成功",
Toast.LENGTH_SHORT).show();
//支付成功
} else {
// 判断resultStatus 为非“9000”则代表可能支付失败
// “8000”代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(OrderConfirmActivity.this, "支付结果确认中",
Toast.LENGTH_SHORT).show();
} else {
// 其他值就可以判断为支付失败,包括用户主动取消支付,或者系统返回的错误
Toast.makeText(OrderConfirmActivity.this, "支付失败",
Toast.LENGTH_SHORT).show();
}
}
break;
default:
break;
}
};
};