Androd整合微信支付和支付寶支付
阿新 • • 發佈:2018-11-06
文章目錄
前言
我們在做App的時候,可能需要接入支付功能,常見的支付有微信支付
和支付寶支付
。這裡只說明下前端的程式碼邏輯。
微信支付
-
需要申請appId,申請的時候需要填寫包名(packagename),簽名等資訊。
-
在AndroidStudio中加入依賴(as3.1.3版本)
//微信支付 // gradle3.0以下使用compile,以上可以api api 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
-
初始化支付
private void regToWx() { IWXAPI api; WX_APP_ID = "xxxxxxxxxx";//這裡寫你的appId api = WXAPIFactory.createWXAPI(this, WX_APP_ID, true); api.registerApp(WX_APP_ID); }
-
調起支付
這裡需要請求後臺伺服器返回訂單資訊,一一賦值就行IWXAPI api; PayReq request = new PayReq(); request.appId = "wxd930ea5d5a258f4f"; request.partnerId = "1900000109"; request.prepayId= "1101000000140415649af9fc314aa427",; request.packageValue = "Sign=WXPay"; request.nonceStr= "1101000000140429eb40476f8896f4c9"; request.timeStamp= "1398746574"; request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B"; api.sendReq(request);
-
支付結果回撥
在當前包名下新建wxapi
包,建立WXPayEntryActivity
類,記得在清單檔案中宣告
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI api; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, getResources().getString(R.string.wx_appid)); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { LogUtil.d("onPayFinish, errCode = " + resp.errCode); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { PayEvent payEvent = new PayEvent(); payEvent.payType = PayEvent.WECHAT; payEvent.code = resp.errCode;// 0成功 ,-1失敗, -2取消 EventBus.getDefault().post(payEvent);//這裡使用EventBus去通知支付結果 } finish(); } }
錯誤碼說明表
名稱 | 描述 | 解決方案 |
---|---|---|
0 | 成功 | 展示成功頁面 |
-1 | 錯誤 | 可能的原因:簽名錯誤、未註冊APPID、專案設定APPID不正確、註冊的APPID與設定的不匹配、其他異常等。 |
-2 | 使用者取消 | 無需處理。發生場景:使用者不支付了,點選取消,返回APP。 |
支付寶支付
-
需要申請appId,申請的時候需要填寫包名(packagename),簽名等資訊。
-
加入依賴jar包
-
調起支付
final String orderInfo = aliEntity.payStr; // 訂單資訊 Runnable payRunnable = new Runnable() { @Override public void run() { PayTask alipay = new PayTask(Activity.this); Map<String, String> result = alipay.payV2(orderInfo, true); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必須非同步呼叫 Thread payThread = new Thread(payRunnable); payThread.start();
-
支付結果處理
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
case SDK_PAY_FLAG: {
@SuppressWarnings("unchecked")
PayResult payResult = new PayResult((Map<String, String>) msg.obj);
/**
對於支付結果,請商戶依賴服務端的非同步通知結果。同步通知結果,僅作為支付結束的通知。
*/
String resultInfo = payResult.getResult();// 同步返回需要驗證的資訊
String resultStatus = payResult.getResultStatus();
// 判斷resultStatus 為9000則代表支付成功
if (TextUtils.equals(resultStatus, "9000")) {
// 該筆訂單是否真實支付成功,需要依賴服務端的非同步通知。
// Toast.makeText(UserAccountRechargeActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
} else {
// 該筆訂單真實的支付結果,需要依賴服務端的非同步通知。
Toast.makeText(UserAccountRechargeActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();
}
break;
}
case SDK_AUTH_FLAG: {
@SuppressWarnings("unchecked")
AuthResult authResult = new AuthResult((Map<String, String>) 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
// 傳入,則支付賬戶為該授權賬戶
Toast.makeText(UserAccountRechargeActivity.this,
"授權成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
.show();
} else {
// 其他狀態值則為授權失敗
Toast.makeText(UserAccountRechargeActivity.this,
"授權失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
}
break;
}
default:
break;
}
}
};