###1.注册流程一句带过
- 蚂蚁金服开放平台
- 创建应用
- 签约上线
官方文档:https://docs.open.alipay.com/204/105297/
###2.移动端要做的事
- 获取订单信息
- 调用支付请求
- 支付结果回调
移动端只需要处理好以上3步就可以,并没有太多流程。
###3.开始接入
####3.1 导入并配置SDK
SDK下载链接:https://docs.open.alipay.com/54/104509
1.将jar包复制到工程目录libs下,并添加依赖
2.在AndroidManifest.xml文件中添加声明
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation|screenSize"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name="com.alipay.sdk.app.H5AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />
3.添加权限(注意6.0动态申请)
<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" />
4.添加代码混淆(proguard-rules.pro)
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}
5.同步工程
做完以上步骤就完成了SDK的所有配置。
####3.2 现在可以调用API了
因为订单信息涉及到加密运算,通常是由服务器处理后返回给APP端,APP端只需要上传商品信息。但为了演示整体流程,我们在APP端加密了一条订单信息以供使用(需要APPID与RES私钥,本次使用的是RES2加密)。
demo中这三个类就是加密订单信息的工具类,正常开发中APP端不需要用到。
Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, true);
String orderParam = OrderInfoUtil2_0.buildOrderParam(params);
String sign = OrderInfoUtil2_0.getSign(params, RSA2_PRIVATE, true);
final String orderInfo = orderParam + "&" + sign;
orderInfo 就是加密后的订单信息了
接下来就是调用支付宝的API请求支付订单了,注意这里必须在子线程异步调用。
Runnable payRunnable = new Runnable() {
@Override
public void run() {
PayTask payTask = new PayTask(ACTIVITY);
Map<String, String> result = payTask.payV2(orderInfo, true);
Message msg = new Message();
msg.what = PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
最后就是回调支付结果
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
String resultStatus = payResult.getResultStatus();
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(CONTEXT, "支付成功", Toast.LENGTH_SHORT).show();
//成功处理
} else {
Toast.makeText(CONTEXT, "支付失败: " + resultStatus, Toast.LENGTH_SHORT).show();
//失败处理
}
PayResult 是demo中的一个类,封装了回调的数据类型,直接用就可以。注意的是 resultStatus 为支付宝同步回调给APP端的支付结果,同时支付宝会异步的回调给服务端一个支付结果,这两个结果极小概率会出现不等情况,且几乎无时差。但实际开发中通常以服务端的结果为主,毕竟和钱打交道。