Android接入微信支付完全解析,太全了~

今天來聊聊,android中接入微信支付的需求,肯定有人會說,這多簡單呀,還在這里扯什么,趕快去洗洗睡吧~~

那我就不服了,要是說這簡單的,你知道微信支付官網多少嗎,要是你一百度,下面全是廣告,哈哈,你一不小心就掉坑去了,在簡單的事,只要你想把他做好,其實也是很復雜的~

簡介

首先我們來到微信支付官網瞅瞅:

Paste_Image.png

可以看到這就是微信支付首頁,下面有幾種支付方式,而我們今天的主角就是APP支付,我們可以直接點進去,或者從左上角接入指引-APP支付,進去的文檔式樣的,這是這個文檔的位置如下圖所示:

Paste_Image.png

肯定有人說,你貼這么有毛用呀,還浪費我流量...

別急讓我給你說說這圖有什么用,首先從這圖你能看出從注冊開發平臺賬號到完成支付接入需要哪些步驟,哪些資料,這樣你可以讓相關的人員事先去準備這些資料,而不是填完一步資料,在去找下一步資料,記住時間就是金錢,另外你領導說來給我講講微信支付那準備哪些資料,你沒看過這文檔,那我就只能呵呵了O(∩_∩)O。另外哪些說支付簡單的,有幾個知道這張圖,又有誰認真看過~

可以看到是要加300塊的,還需要企業的一些資料。

另外微信支付有兩個平臺分別是開發者平臺商戶平臺

開發者平臺:主要是針對開發者,比如:創建應用,獲取appid
商戶平臺:主要是商戶上面的一些管理,比如:可以查看流水,訂單呀

創建應用

這里我只是演示怎么創建應用,最后不會用這個賬號的,因為我這是個人賬號,沒法申請支付,只是給不會創建的朋友做一個演示,需要哪些資料而已,會的可略過~

首先我們來到開發者平臺,沒有賬號的先注冊,這個我想不用演示了,直接演示怎么創建應用,首先你的登錄完賬號,點擊管理中心-移動應用:

Paste_Image.png

點擊左上角的創建移動應用,到如下界面,因為這里是測試,所有資料都是隨便填啦

Paste_Image.png

點擊下一步就來到了

Paste_Image.png

這一步讓你填寫,需要的平臺,以及平臺信息,我這里只懸著android,填入包名和簽名,另外這里他沒有想微博那樣可以填入多個簽名,那么這里我建議你一開始填入debug的簽名,等調試通過了在填寫正式簽名,簽名的獲取方法和接入第三方登錄是一樣的。最后提交審核,等審核完以后,我們點擊到應用詳情,應該是這樣的效果

Paste_Image.png

個人賬號創建的應用審核通過后只有,分享功能,如果還需要支付,可以點擊申請,然后認證賬號并上傳一些資料,這又是一個漫長的過程,這里我們就不了那么多了,現在直接說怎么在代碼實現吧

運行官方demo

記住這里的支付demo是在商戶平臺的幫助里面下載,地址在這里,而不是開發者平臺下載的那個demo(以前是可以,現在這里下載的demo,里面剔除了支付),如下圖,是這個頁面:

Paste_Image.png

第一個是基礎庫,點擊后會跳到開發者平臺,第二個參數支付demo,當然里面也包含了分享等一些功能,可以說如果你既要做支付又要做分享,那么你只需要這個一個demo就行了,當然還得需要我這篇文章呀

下載完導入eclipse,替換debug.keystore然后運行,就可以看到如下界面,終于看到支付了,激動不已是不是

Paste_Image.png

然后我們就可以點擊“跳轉到支付界面”,看看什么效果呀,是騾子是馬總的溜溜吧,看到這一面,感覺神清氣爽,因為demo跑通了,呵呵~

Paste_Image.png

demo也看了,錢也付了,那我們現在就該開始接入支付了

正式接入支付

首先還是得上一張流程圖呀,不然你知道怎么個邏輯?

這是這個文檔的官方地址

,這是官方的解釋

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

步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付。

步驟2:商戶后臺收到用戶支付單,調用微信支付統一下單接口。參見【統一下單API】。

步驟3:統一下單接口返回正常的prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給APP。參與簽名的字段名為appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式為Sign=WXPay

步驟4:商戶APP調起微信支付。api參見本章節【app端開發步驟說明】

步驟5:商戶后臺接收支付通知。api參見【支付結果通知API】

步驟6:商戶后臺查詢支付結果。,api參見【查詢訂單API】

首要微信支付暴露給我的是兩步,一步是生成預支付訂單,然后那個預支付訂單id再去調用微信支付,所以說這里就有兩種實現方式了,一種是客戶端處理這所有步驟,另外一種肯定是服務端創建與支付訂單和簽名,然后返回給我們,我們才拿著這些參數去調用微信支付。實際應用中,推薦使用服務那種,但是我這里講的是本地怎么實現支付,如果你們是在服務端支付,那么你的告訴他你需要什么參數,他怎么創建預支付訂單等服務端下單參考這里

配置

這是官方的app支付開發步驟,另外這里由于我沒有可用的支付所以,寫demo我用的包名和key都是微信demo的

配置權限

配置activity

<uses-permission android:name="android.permission.INTERNET"/>

配置回調activity

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

調用支付

public void testWxPay(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android";
            ToastUtil.shortToastInBackgroundThread(getActivity(), "獲取訂單中...");
            try {
                byte[] buf = Util.httpGet(url);
                if (buf != null && buf.length > 0) {
                    String content = new String(buf);
                    Log.e("get server pay params:", content);
                    JSONObject json = new JSONObject(content);
                    if (null != json && !json.has("retcode")) {
                        req = new PayReq();
                        //req.appId = "wxf8b4f85f3a794e77";  // 測試用appId
                        req.appId = json.getString("appid");
                        req.partnerId = json.getString("partnerid");
                        req.prepayId = json.getString("prepayid");
                        req.nonceStr = json.getString("noncestr");
                        req.timeStamp = json.getString("timestamp");
                        req.packageValue = json.getString("package");
                        req.sign = json.getString("sign");
                        req.extData = "app data"; // optional
                        ToastUtil.shortToastInBackgroundThread(getActivity(), "正常調起支付");
                        toPay();
                    } else {
                        Log.d("PAY_GET", "返回錯誤" + json.getString("retmsg"));
                        ToastUtil.shortToastInBackgroundThread(getActivity(), "返回錯誤" + json.getString("retmsg"));
                    }
                } else {
                    Log.d("PAY_GET", "服務器請求錯誤");
                    ToastUtil.shortToastInBackgroundThread(getActivity(), "服務器請求錯誤");
                }
            } catch (Exception e) {
                Log.e("PAY_GET", "異常:" + e.getMessage());
                ToastUtil.shortToastInBackgroundThread(getActivity(), "異常:" + e.getMessage());
            }
        }
    }).start();

}

private void toPay() {
    // 在支付之前,如果應用沒有注冊到微信,應該先調用IWXMsg.registerApp將應用注冊到微信
    api.sendReq(req);
}

到這里如果你按照我的配置的話,正常情況下試可用調起支付界面了,如果出現-1,請檢查是不是替換了debug.keystore,如果替換了,還是這樣記得清空微信緩存

以上測試代碼都在github上,官方的下載的sdk包也在該倉庫的docs目錄下

如果我的文章對來帶來的幫助,可加我微信,微博,QQ什么啥的交個朋友也是不錯的,另外微信,微博都會不定期發一些優質的文章,感謝大家的支持~~,聯系方式在我的個人介紹里啦

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,349評論 25 708
  • 今日推薦 經常閱讀博客是個好習慣推薦鴻洋CSDN的博客 微信支付相關文章 詳細介紹Android開發集成微信支付(...
    MrQ_Android閱讀 6,203評論 9 52
  • 其實我才不會像喜歡小爺那樣喜歡你。 因為你在我的票圈。 如果我真的這樣做,有兩種結果?;蛟S你對我也有好感,那么。。...
    桌子和1106閱讀 297評論 0 0
  • 起風了,樹木搖曳,簌簌的聲音在林間響起,如似有人深處低吟,枝葉之間,蜘蛛在陰影中布下陷阱,等待著獵物上門。一只不幸...
    蔣遠方閱讀 472評論 0 5
  • 初見東坡時,是在西湖。那時正是晴天,陽光照射在大地上,萬物都有了光輝。西湖水光粼粼,與周圍參加宴會的構成一副美好的...
    櫻桃小斑馬閱讀 443評論 0 0