支付宝支付流程。
1.流程:1.app下订单提交给后台服务器生成订单信息,带有签名。2.提交上述返回数据到支付宝,唤起支付。3.支付宝向app返回支付结果。向服务端异步返回支付结果。
2.关于应用私钥和支付宝公钥
关于私钥,官方要求一定不能放到app客户端。
一定要配对。所谓配对就是选择一种算法的私钥,要使用对应的支付宝公钥。
在以前的api中,签名是在app端完成的。最新的api已不建议这样做。目前最新版本是15.3.5。签名放在服务器端完成,由服务器按照规则返回一个字符串。app端拿着这个串去调用支付宝支付。
需要注意的是,支付需要app状态是上线状态,否则只能使用沙箱测试。具体请看相关文档。
3.支付关键代码:
/** * 支付宝支付 *@paramorderInfo */privatevoidaliPay(finalString orderInfo){ Runnable payRunnable =newRunnable() {@Overridepublicvoidrun() { PayTask alipay =newPayTask(getActivity()); Map result = alipay.payV2(orderInfo,true); Message msg =newMessage(); msg.what =SDK_ALI_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; Thread payThread =newThread(payRunnable); payThread.start(); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
privateHandler mHandler =newHandler() {@SuppressWarnings("unused")publicvoidhandleMessage(Message msg) {switch(msg.what) {caseSDK_ALI_PAY_FLAG: {//支付宝支付PayResult payResult =newPayResult((Map) msg.obj);/**对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。*/String resultInfo = payResult.getResult();// 同步返回需要验证的信息String resultStatus = payResult.getResultStatus();// 判断resultStatus 为9000则代表支付成功if(TextUtils.equals(resultStatus,"9000")) {// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。Toast.makeText(mContext,"支付成功", Toast.LENGTH_SHORT).show(); getActivity().finish(); }else{// 该笔订单真实的支付结果,需要依赖服务端的异步通知。Toast.makeText(mContext,"支付失败"+payResult.getResultStatus()+payResult.getResult(), Toast.LENGTH_LONG).show(); }break; } .... } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
如果你的项目中使用了混淆,还需做一下配置:
#支付宝支付混淆 sdk15.3.5-keep classcom.alipay.android.app.IAlixPay{*;}-keep classcom.alipay.android.app.IAlixPay$Stub{*;}-keep classcom.alipay.android.app.IRemoteServiceCallback{*;}-keep classcom.alipay.android.app.IRemoteServiceCallback$Stub{*;}-keep classcom.alipay.sdk.app.PayTask{ public *;}-keep classcom.alipay.sdk.app.AuthTask{ public *;}-dontwarncom.alipay.**
1
2
3
4
5
6
7
8
9
很简单。有空完善整个流程说明及详细的流程说明。