支付寶Android客戶端集成流程
https://opendocs.alipay.com/open/204/105296
SDK&DEMO
https://opendocs.alipay.com/open/54/104509
1. 第一步:導入支付寶SDK
libs
alipaySdk-15.7.4-20200228192259.aar
2. 第二步:項目build.gradle中將libs目錄作爲依賴倉庫
allprojects{
repositories{
// 支付寶 SDK AAR 包所需的配置
flatDir{
dirs'libs'
}
}
3. 第三步:
build.gradle(:app)
dependencies{
//...
// 支付寶 SDK AAR 包所需的配置
implementation(name:'alipaySdk-15.7.4-20200228192259',ext:'aar')
}
4. 第四步:添加權限
android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
5. 接口調用
主要代碼片段
final String orderInfo = pay.getJsonStr();//本地接口返回支付寶訂單信息json字符串
final Runnable payRunnable = () -> {
PayTask alipay =new PayTask(OrderPayActivity.this);
Map result = alipay.payV2(orderInfo, true);
LogUtil.i("msp:" + result.toString());
Message msg =new Message();
msg.what =SDK_PAY_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
};
// 必須異步調用
Thread payThread =new Thread(payRunnable);
payThread.start();
private static final int SDK_PAY_FLAG =1;
private static final int SDK_AUTH_FLAG =2;
private HandlermHandler =new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
PayResult payResult =new PayResult((Map) msg.obj);
/**
* 對於支付結果,請商戶依賴服務端的異步通知結果。同步通知結果,僅作爲支付結束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 爲9000則代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 該筆訂單是否真實支付成功,需要依賴服務端的異步通知。
//
showAlert(OrderPayActivity.this, "Payment success:" + payResult);
payResult(true);
}else if (TextUtils.equals(resultStatus, "6001")) {
//取消支付
doBack();
}else {
// 該筆訂單真實的支付結果,需要依賴服務端的異步通知。
//
showAlert(OrderPayActivity.this, "Payment failed:" + payResult);
payResult(false);
}
break;
}
case SDK_AUTH_FLAG: {
AuthResult authResult =new AuthResult((Map) msg.obj, true);
String resultStatus = authResult.getResultStatus();
// 判斷resultStatus 爲“9000”且result_code
// 爲“200”則代表授權成功,具體狀態碼代表含義可參考授權接口文檔
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 獲取alipay_open_id,調支付時作爲參數extern_token 的value
// 傳入,則支付賬戶爲該授權賬戶
showAlert(OrderPayActivity.this, "Authentication success:" + authResult);
}else {
// 其他狀態值則爲授權失敗
showAlert(OrderPayActivity.this, "Authentication failed:" + authResult);
}
break;
}
default:
break;
}
};
};
private void payResult(boolean success) {
DialogUtils.showMsg(this, "提示", "訂單支付" + (success ?"成功" :"失敗,重新支付"),
(context, builder, dialog, dialogId, which, editText) -> {
EventBus.getDefault().post(new EventBean(Constant.Event_Msg.PAY_SUCCESS));
finish();
},
(context, builder, dialog, dialogId, which, editText) -> {
if (success) {
EventBus.getDefault().post(new EventBean(Constant.Event_Msg.PAY_SUCCESS));
finish();
}
}, !success, "取消", "確定", false);
}
private void doBack() {
DialogUtils.showMsg(this, "提示", "您的訂單還未支付完成,請儘快完成支付。",
(context, builder, dialog, dialogId, which, editText) -> {
EventBus.getDefault().post(new EventBean(Constant.Event_Msg.PAY_SUCCESS));
finish();
}, (context, builder, dialog, dialogId, which, editText) -> {
}, true, "確認離開", "繼續支付", false);
}