Android 微信支付開發流程

一:介紹

項目中要用到支付功能,須要支付寶支付、微信支付、銀聯支付,因此打算總結一下,方便之後的查閱,也方便你們, 用到的地方避免再次被坑。 今天咱們就主要介紹一下微信支付,其餘支付也寫了對應教程,而且給出了鏈接。php

集成前首先要看看文檔,微信支付開發文檔裏面有詳細的字段和說明。 微信支付是須要簽名的,跟支付寶同樣,能夠在客戶端簽名,也能夠在後臺簽名(固然,爲了安全仍是推薦在服務器上作簽名,邏輯也比較好理解)html

二:業務流程

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

交互時序圖

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

    1. 用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。
    1. 商戶後臺收到用戶支付單,調用微信支付統一下單接口。
    1. 統一下單接口返回正常的prepay_id,再按簽名規範從新生成簽名後,將數據傳輸給APP。參與簽名的字段名爲appid,partnerid,prepayid,noncestr,timestamp,package。
    1. 商戶APP調起微信支付。
    1. 商戶後臺接收支付通知。
    1. 商戶後臺查詢支付結果。

三:下載微信SDK

微信開放平臺下載SDK 建議把Android頭文件和支付示例都下載下來後端

下載微信SDK

四:後臺設置

商戶在微信開放平臺申請開發應用後,微信開放平臺會生成APP的惟一標識APPID。因爲須要保證支付安全,須要在開放平臺綁定商戶應用包名和應用簽名,設置好後才能正常發起支付。設置界面在【開放平臺】中的欄目【管理中心 / 修改應用 / 修改開發信息】裏面。以下圖:api

102.png

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

package="net.sourceforge.simcpux"
複製代碼

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

簽名工具下載地址服務器

open.weixin.qq.com/zh_CN/htmle…微信

103.png

net.sourceforge.simcpux 是項目包名

五:導入開發SDK

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

5.1 若是項目開發使用的Eclipse軟件,導入步驟以下:

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

201.png

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

202.png

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

203.png

將上圖的支付寶sdk更換成微信sdk便可

5.2 若是項目開發使用的Android Studio軟件,導入步驟以下:

1.將微信SDK拷貝到項目libs文件夾下,若是沒有libs文件夾,就新建一個。

301.png

2.若是sdk使用過程當中,提示找不到文件。 進行以下操做,選中sdk文件,右擊選擇Reveal in Finder

302.png

六:修改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 (msg.what == SDK_PAY_WECHAT) {

                ChargeWXBean charge =  (ChargeWXBean) msg.obj;
                String packsges = charge.getResult().getCredential().getPackages();
                String appid = charge.getResult().getCredential().getAppid();
                String partenerid = charge.getResult().getCredential().getPartnerid();
                String prepayid = charge.getResult().getCredential().getPrepayid();
                String noncestr = charge.getResult().getCredential().getNoncestr();
                String timestamp = charge.getResult().getCredential().getTimestamp();
                String sign = charge.getResult().getCredential().getSign();
//              商戶APP工程中引入微信JAR包,調用API前,須要先向微信註冊您的APPID,代碼以下:
                final IWXAPI msgApi = WXAPIFactory.createWXAPI(ThirdActivity.this, null);
               // 將該app註冊到微信   
                msgApi.registerApp(appid);

                PayReq req = new PayReq();
                req.appId = appid;
                req.partnerId = partenerid;
                req.prepayId = prepayid;
                req.nonceStr = noncestr;
                req.timeStamp = timestamp;
                req.packageValue = packsges;
                req.sign = sign;
                msgApi.sendReq(req);

            }
        }
    };
複製代碼
  1. 支付結果回調

參照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路徑中實現WXPayEntryActivity類(包名或類名不一致會形成沒法回調),在WXPayEntryActivity類中實現onResp函數,支付完成後,微信APP會返回到商戶APP並回調onResp函數,開發者須要在該函數中接收通知,判斷返回錯誤碼,若是支付成功則去後臺查詢支付結果再展現用戶實際支付結果。注意必定不能以客戶端返回做爲用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果爲準。(net.sourceforge.simcpux爲你的項目包名)代碼示例以下:

@Override
    public void onResp(BaseResp resp) {
        Log.d(TAG,"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爲取消支付

調起支付頁面截圖

002.png

關注 【網羅開發】微信公衆號,網羅天下方法,方便你我開發,更多Android技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!

但願能夠幫助你們

若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議

如需轉載請聯繫我,通過受權方可轉載,謝謝

相關文章
相關標籤/搜索