前言:第三方支付已经成为了APP不可或少的部分,目前主流的第三方有支付宝、微信支付、拉卡拉、通联支付等,其中(起码现在)支付宝是处于领先和主导地位的。
今天就借助之前写的一个APP来回顾和熟悉下支付宝的移动支付,至于前期准备工作(如企业认证,商户开通等),在这里就不再叙述了,网上资料很多。这篇文章主要介绍支付宝移动支付的流程与实现,以及在开发过程中遇到的一些坑。。。话不多说,下面开始:
首先,介绍下支付宝支付的流程(非官方)
获取订单列表—创建订单—发起支付—调支付宝APP支付—处理回调
在这个APP的实现中,创建订单是在后台实现的,其实这一部分可以在APP中实现,但是在APP端实现的话有可能会导致用户信息、秘钥信息的泄露。其实前面两步只是为了获取调用支付宝支付SDK所需要的订单信息(加密的),获得订单信息后便可借助SDK发起支付,前面三步就不详细说了。
//调用第三方APP进行支付
private void doPay(final String orderUrl) {
Runnable payRunnable = new Runnable() {
@Override
public void run() {
//调用支付宝
PayTask payTask = new PayTask(WalletActivity.this);
Map<String, String> result = payTask.payV2(orderUrl, true);
Message msg = new Message();
msg.what = SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
}
上面的代码便是调用SDK发起支付相关代码,用过支付宝进行充值的朋友应该了解现在的支付宝支付会自动
检查本地是否安装支付宝APP,如果没有安装则跳转Html5页面,否则调起APP进行支付。回调处理代码如下:
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult = new PayResult((Map<String, String>) (msg.obj));
String resultInfo = payResult.getResult();// 同步返回需要验证的信息
String resultStatus = payResult.getResultStatus();
if (TextUtils.equals(resultStatus, "9000")) {
Toast.makeText(getBaseContext(), "支付成功", Toast.LENGTH_LONG).show();
} else {
// "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认,最终交易是否成功以服<span style="white-space:pre;"> </span>务端异步通知为准(小概率状态)
if (TextUtils.equals(resultStatus, "8000")) {
Toast.makeText(getBaseContext(), "支付结果确认中", Toast.LENGTH_LONG).show();
} else if (TextUtils.equals(resultStatus, "6001")) {
Toast.makeText(getBaseContext(), "交易取消", Toast.LENGTH_LONG).show();
} else if (TextUtils.equals(resultStatus, "6002")) {
Toast.makeText(getBaseContext(), "网络异常", Toast.LENGTH_LONG).show();
} else if (TextUtils.equals(resultStatus, "5000")) {
Toast.makeText(getBaseContext(), "重新请求", Toast.LENGTH_LONG).show();
} else {
// 其他值就可以判断为支付失败
Toast.makeText(getBaseContext(), "支付失败" + resultStatus, Toast.LENGTH_LONG).show();
}
}
break;
}
}
}
};
总结一下,开发过程中需要注意的一些坑:
1、秘钥要保证正确,即APP与后台要保证加密方式以及秘钥的一致
2、金额需要精确到小数点后两位
3、安卓资源清单配置文件中不要忘记声明AuthActivity和H5PayActivity
<activity
android:name="com.alipay.sdk.auth.AuthActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind" />
<activity
android:name="com.alipay.sdk.app.H5PayActivity"
android:configChanges="orientation|keyboardHidden|navigation"
android:exported="false"
android:screenOrientation="behind"
android:windowSoftInputMode="adjustResize|stateHidden" />