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

Android 支付寶和微信支付整合

場景

隨著移動支付的興起,在我們的app中,會經常有整合支付的需求.這時候一般都會採用微信和支付寶的sdk 來整合

支付寶支付

在使用支付寶支付的過程中,我們是在伺服器端生成訂單,客戶端訪問介面,得到訂單資訊.然後調起支付,支付成功後支付寶會分別 非同步呼叫伺服器端,同步呼叫客戶端返回支付結果.

開發步驟

①註冊支付寶賬號——進行實名認證——提交稽核資料——稽核通過

注意

  1. 申請要上傳你的apk和產品說明文件,產品截圖、介面使用場景、資費說明等,稽核通過後會得到商戶PID和私鑰。

  2. 開發者可以通過支付寶公鑰驗證訊息來源,同時可使用自己的私鑰對資訊進行加密。

  3. 商戶收款賬號即用於接收付款的賬號

② 下載官方Sdk Demo ,裡面包含文件.將該Demo中的PID,支付寶收款賬戶和使用者私鑰替換. 執行demo,檢視sdk呼叫方式,

PID對應的金鑰一共有三種加密方式,分別是MD5、RSA、DSA。Java開發者需要將金鑰轉換成PKCS8格式,並將公鑰上傳到支付寶.生成方式見文件.[支付寶開放平臺]

③ 匯入專案,客戶端呼叫,.首先將支付寶demo中的jar包匯入到專案中,可以參照,demo中拼接引數,

支付寶demo類匯入

//方法名稱:payTask.pay

//方法原型:
PayTask payTask = new PayTask(activity);  String result = payTask.pay(orderInfo);

//方法功能:提供給商戶訂單支付功能。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

請求引數以鍵值對的形式拼裝到一個String中,引數具體說明詳見官方文件.

注意

  1. 除去sign、sign_type兩個引數外,其他需要使用到的引數皆是要簽名的引數
  2. sign值要做utf-8 URLencode

④ 修改Manifest,新增com.alipay.sdk.app.H5PayActivityuses-permission,並在proguard-project.txt中新增相關的混淆規則即可.

⑤回撥處理,詳見 支付寶同步通知引數說明.out_trade_no可以作為唯一標誌和伺服器端進行互動,當支付寶同步 通知後,客戶端通過out_trade_no詢問伺服器端是否支付成功,因為真正的成功標誌是需要伺服器端來驗證的.

 public AliPayResultS(String result) {
        if (TextUtils.isEmpty(result))
            return;

        String[] resultParams = result.split("&");
        for (String resultParam : resultParams) {
            if (resultParam.startsWith("out_trade_no")) {
                out_trade_no = gatValue(resultParam, "out_trade_no");
            }
        }

    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

微信支付

同樣,有了支付寶支付,呢麼微信支付也不可缺少,微信支付和支付寶支付流程,大體相同,通過伺服器端獲取訂單資訊返回給客戶端,客戶端呼叫sdk進行支付,支付完成後進行同步和非同步回撥.

開發步驟

①獲取appId 
同樣需要獲取appid,登記並選擇移動應用進行設定後,將該應用提交稽核,只有稽核通過並獲取appId的應用才能進行開發。

②下載Android 微信支付demo. 
微信支付

我們所需要關注的依舊是PayActivity.使用微信的登陸和支付,大家都知道,需要在專案下新建一個wxapi資料夾來實現回撥.

③專案整合,首先我們需要將libammsdk.jar匯入到lib目錄下,這個是核心jar包.同時修改Manifest

  <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"/>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

④介面呼叫.

首先我們需要初始化一個IWXAPI api,並註冊到應用,

api.registerApp(Constants.APP_ID); 
PayReq req = new PayReq();
//....拼接req引數
api.sendReq(req);// 呼叫支付
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

注意

  1. 微信支付並不會像支付寶那樣,支付寶沒有安裝預設會呼叫H5PayActivity
  2. 微信支付前,最好判斷下是否安裝微信
//判斷是否安裝微信
private boolean isWXAppInstalledAndSupported(IWXAPI msgApi) {
        msgApi.registerApp(Constants.APP_ID);

        boolean sIsWXAppInstalledAndSupported = msgApi.isWXAppInstalled()
                && msgApi.isWXAppSupportAPI();

        return sIsWXAppInstalledAndSupported;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

⑤支付回撥.

在支付回撥類WXPayEntryActivityonResp(BaseResp resp)方法中我們可以得到 客戶端 和伺服器 唯一標誌prepayid引數,來實現支付成功的後續處理.

  // 支付成功
                if (resp instanceof com.tencent.mm.sdk.modelpay.PayResp) {
                    com.tencent.mm.sdk.modelpay.PayResp payResp = (PayResp) resp;
                    String prepayId = payResp.prepayId;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

ps: 微信支付中需要注意的是支付回撥方法.支付回撥必須在專案中建立一個wxapi目錄,並命名為WXPayEntryActivity(包名或類名不一致會造成無法回撥),回撥方法中獲取prepayId.


 // 第三方應用傳送到微信的請求處理後的響應結果,會回撥到該方法
    @Override
    public void onResp(BaseResp baseResp) {
//        String result = "";
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
//                result = "傳送成功";
            {
                Intent intent = new Intent(Constants.payAction);
                intent.putExtra(Constants.prepayId, ((PayResp) baseResp).prepayId);
                mLocalBroadcastManager.sendBroadcast(intent);
            }
            break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
//                result = "傳送取消";
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
//                result = "傳送被拒絕";
                break;
            default:
//                result = "傳送返回";
                break;
        }
        finish();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

最後,微信支付不能使用debug的,因為要驗證簽名等.否則支付不成功

封裝

為了方便,將上面程式碼進行封裝ShareLoginPay,只需配置好相關的 appid ,即可使用, 
以微信支付為例

//初始化appid
 PayBlock.getInstance().initWechatPay("");

//調起支付
String payInfo = "";
            PayReq req = WechatOderInfo.getWeixinPayReq(payInfo);
                WxpayUtil.weixinPay(req, new WxpayResultListener() {
                    @Override public void payResult(PayResp payResp) {
                        String prepayId = payResp.prepayId;
                        Toast.makeText(MainActivity.this, "prepayid--->" + prepayId,
                            Toast.LENGTH_SHORT).show();
                    }
                    @Override public void onError(int errCode) {
                        Toast.makeText(MainActivity.this, "onError()-->" + errCode,
                            Toast.LENGTH_SHORT).show();
                    }
                    @Override public void onCancel() {
                        Toast.makeText(MainActivity.this, "onCancel()", Toast.LENGTH_SHORT).show();
                    }
                    @Override public void notSupport() {
                        Toast.makeText(MainActivity.this, "沒有安裝微信,或版本太低", Toast.LENGTH_SHORT)
                            .show();
                    }
                });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

完整demo: