1. 程式人生 > >Androd整合微信支付和支付寶支付

Androd整合微信支付和支付寶支付

文章目錄

前言

我們在做App的時候,可能需要接入支付功能,常見的支付有微信支付支付寶支付。這裡只說明下前端的程式碼邏輯。

微信支付

微信支付開發文件

  1. 需要申請appId,申請的時候需要填寫包名(packagename),簽名等資訊。

  2. 在AndroidStudio中加入依賴(as3.1.3版本)

    //微信支付
    // gradle3.0以下使用compile,以上可以api
    api 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
    
  3. 初始化支付

    private void regToWx() {
        IWXAPI api;
        WX_APP_ID = "xxxxxxxxxx";//這裡寫你的appId
        api = WXAPIFactory.createWXAPI(this, WX_APP_ID, true);
        api.registerApp(WX_APP_ID);
    }
    
  4. 調起支付
    這裡需要請求後臺伺服器返回訂單資訊,一一賦值就行

    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);
    
  5. 支付結果回撥
    在當前包名下新建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。

支付寶支付

支付寶支付文件

  1. 需要申請appId,申請的時候需要填寫包名(packagename),簽名等資訊。

  2. 加入依賴jar包
    支付寶依賴

  3. 調起支付

        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();
    
  4. 支付結果處理

 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;
            }
        }
    };