1.下载SDK
下载地址:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
解压并导入jar包,并Add As Library.
2.添加声明
AndroidManifest.xml文件里面添加声明(支付宝客户端调用和H5页面调用)
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"/>
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"/>
3.调用处理
在去支付的按钮点击事件里面加入下面代码
Runnable payRunnable = new Runnable() {
@Override
public void run() {
//调用支付宝
PayTask payTask = new PayTask(这里是上下文);
String result = payTask.pay(orderBean.payUrl, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
payTask.pay(orderBean.payUrl, true)中的orderBean.payUrl是服务器返回给我的数据,也就是支付宝需要的参数(后台封装好的,支付宝也不建议前台去搞),都在里面了,只需要拿数据去请求就行了。
第二个参数true,表示在请求支付的时候是否加入Loading的dialog
返回结果在Handler中处理
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((String) msg.obj);
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
if (TextUtils.equals(resultStatus, "9000")) {
MyUtil.showToast("支付成功");
} else {
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服务端异步通知为准
if (TextUtils.equals(resultStatus, "8000")) {
MyUtil.showToast("支付结果确认中");
}
else if (TextUtils.equals(resultStatus, "6001")) {
MyUtil.showToast("支付取消");
}
else if (TextUtils.equals(resultStatus, "6002")) {
MyUtil.showToast("网络异常");
}
else if (TextUtils.equals(resultStatus, "5000")) {
MyUtil.showToast("重复请求");
}
else {
// 其他值就可以判断为支付失败
MyUtil.showToast("支付失败");
}
}
break;
}
}
}
};
加入上面的代码就需要一个PayResult 类去接收返回结果了(直接copy下载的sdk中的demo里面的就行)
PayResult payResult = new PayResult((String) msg.obj);如果这句报错,就是类型转换的问题,有的是String,有的是Map的,去实体类中改就好了,在类型转换的时候改也行。
所以接入支付宝SDK只需要3个步骤:
- 添加jar包
- manifest中添加声明
- 加入上面两段代码和一个实体类
以上皆为Android客户端的接入
接入中遇到支付失败,code 4000,报错ALI59
按照官网的解决方案去检查了一遍,最后发现是参数格式的问题
支付宝请求参数中的订单总金额单位为元,精确到小数点后两位,如果是10.0000这样的就会报错ALI59,正确10.00
而微信支付的请求参数中的总金额单位为分,对账单中的交易金额单位是为元的。