前言
我們在做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;
}
}
};