天天看點

Android 微信支付開發流程

一:介紹

項目中要用到支付功能,需要支付寶支付、微信支付、銀聯支付,是以打算總結一下,友善以後的查閱,也友善大家, 用到的地方避免再次被坑。

今天我們就主要介紹一下微信支付,其他支付也寫了對應教程,并且給出了連接配接。

內建前首先要看看文檔,​​微信支付開發文檔​​裡面有詳細的字段和說明。

微信支付是需要簽名的,跟支付寶一樣,可以在用戶端簽名,也可以在背景簽名(當然,為了安全還是推薦在伺服器上做簽名,邏輯也比較好了解)

二:業務流程

以下是互動時序圖,統一下單API、支付結果通知API和查詢訂單API等都涉及簽名過程,調用都必須在商戶伺服器端完成。

Android 微信支付開發流程

商戶系統和微信支付系統主要互動說明:

  1. 使用者在商戶APP中選擇商品,送出訂單,選擇微信支付。
  2. 商戶背景收到使用者支付單,調用微信支付統一下單接口。
  3. 統一下單接口傳回正常的prepay_id,再按簽名規範重新生成簽名後,将資料傳輸給APP。參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。
  4. 商戶APP調起微信支付。
  5. 商戶背景接收支付通知。
  6. 商戶背景查詢支付結果。

三:下載下傳微信SDK

​​微信開放平台下載下傳SDK​​

建議把Android頭檔案和支付示例都下載下傳下來

Android 微信支付開發流程

四:背景設定

商戶在微信開放平台申請開發應用後,微信開放平台會生成APP的唯一辨別APPID。由于需要保證支付安全,需要在開放平台綁定商戶應用包名和應用簽名,設定好後才能正常發起支付。設定界面在【開放平台】中的欄目【管理中心 / 修改應用 / 修改開發資訊】裡面。如下圖:

Android 微信支付開發流程

應用包名:是在APP項目配置檔案AndroidManifest.xml中聲明的package值,例如DEMO中的。

package="net.sourceforge.simcpux"      

應用簽名:根據項目的應用包名和編譯使用的keystore,可由簽名工具生成一個32位的md5串,在調試的手機上安裝簽名工具後,運作可生成應用簽名串,如下圖所示,綠色串即應用簽名。

簽名工具下載下傳位址

​​open.weixin.qq.com/zh_CN/htmle…​​

Android 微信支付開發流程
net.sourceforge.simcpux 是項目包名

五:導入開發SDK

導入sdk流程同支付寶導入流程一樣,這裡就借用支付寶導入流程進行介紹。

5.1 如果項目開發使用的Eclipse軟體,導入步驟如下:

1.将alipaySDK-20150602.jar包放入商戶應用工程的libs目錄下,如下圖。

Android 微信支付開發流程

2.進入商戶應用工程的Java Build Path,将libs目錄下的alipaySDK-20150602.jar導入,如下圖。

Android 微信支付開發流程

3.選中Order and Export,勾選alipaySDK-20150602.jar,如下圖。

Android 微信支付開發流程
将上圖的支付寶sdk更換成微信sdk即可

5.2 如果項目開發使用的Android Studio軟體,導入步驟如下:

1.将微信SDK拷貝到項目libs檔案夾下,如果沒有libs檔案夾,就建立一個。

Android 微信支付開發流程

2.如果sdk使用過程中,提示找不到檔案。

進行如下操作,選中sdk檔案,右擊選擇Reveal in Finder

Android 微信支付開發流程

六:修改AndroidManifest.xml配置

1.在商戶應用工程的AndroidManifest.xml檔案裡面添加聲明:

<!--微信-->
<activity
     android:name=".wxapi.WXPayEntryActivity"
     android:exported="true"
     android:launchMode="singleTop">
</activity>      

和權限聲明:

<!--微信-->
<uses-permission android:name="android.permission.INTERNET"/>      
到這裡,微信支付的前期配置已經完成,下面需要完成支付代碼編寫。

七:支付接口調用

  1. 在點選支付按鈕的點選事件中,我提供的是從後端擷取訂單資訊。
  2. 需要在新線程中調用支付接口。代碼如下:
//    微信按鈕
    public void onClick(View view) {
        //起一個線程
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                String data = null;
                PayBean payBean = new PayBean();
                payBean.setOrderTime("");
                String json = new Gson().toJson(payBean);
                //json為擷取後端結果時需要提供給後端訂單資訊,例如:時間、金額、訂單屬性等
                Log.i("charge request", json);
                try {
                    //data為後端傳回資料,其中包括訂單字元串
                    data = postJson(CHARGE_URL, json);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // Json解析data
                ChargeWXBean charge = new Gson().fromJson(data.replace("package", "packages"), ChargeWXBean.class);
                //在mHandler中處理微信調起支付和傳回結果回調
                Message msg = new Message();
                msg.what = SDK_PAY_WECHAT;
                msg.obj = charge;
                mHandler.sendMessage(msg);
            }
        };
        // 必須異步調用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }      
  1. 在mHandler中處理調起支付
private Handler mHandler = new Handler() {

        public void handleMessage(Message msg) {
            if      
  1. 支付結果回調

參照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路徑中實作WXPayEntryActivity類(包名或類名不一緻會造成無法回調),在WXPayEntryActivity類中實作onResp函數,支付完成後,微信APP會傳回到商戶APP并回調onResp函數,開發者需要在該函數中接收通知,判斷傳回錯誤碼,如果支付成功則去背景查詢支付結果再展示使用者實際支付結果。注意一定不能以用戶端傳回作為使用者支付的結果,應以伺服器端的接收的支付通知或查詢API傳回的結果為準。(net.sourceforge.simcpux為你的項目包名)代碼示例如下:

"onPayFinish,errCode="+resp.errCode);

        // 判斷resultStatus 為“0”則代表支付成功,具體狀态碼代表含義可參考接口文檔
        if (resp.errCode.equals("0")) {
            Toast.makeText(ThirdActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
        }else if (resp.errCode.equals("-1")){

            // -1為支付失敗,包括使用者主動取消支付,或者系統傳回的錯誤
            Toast.makeText(ThirdActivity.this, "支付失敗", Toast.LENGTH_SHORT).show();

        }else if (resp.errCode.equals("-2")){

            // -2為取消支付,或者系統傳回的錯誤
            Toast.makeText(ThirdActivity.this, "取消支付", Toast.LENGTH_SHORT).show();

        }else {
            // 其他為系統傳回的錯誤
            Toast.makeText(ThirdActivity.this, "支付錯誤", Toast.LENGTH_SHORT).show();

        }

    }      

以下三種為常用結果判斷

0為支付成功

-1為支付失敗

-2為取消支付

調起支付頁面截圖

Android 微信支付開發流程

關注 【網羅開發】微信公衆号,網羅天下方法,友善你我開發,更多Android技術幹貨等待領取,所有文檔會持續更新,歡迎關注一起成長!