Android接入支付完全解析,太全了~
今天來聊聊,android中接入支付的需求,肯定有人會說,這多簡單呀,還在這裡扯什麼,趕快去洗洗睡吧~~
那我就不服了,要是說這簡單的,你知道支付官網多少嗎,要是你一百度,下面全是廣告,哈哈,你一不小心就掉坑去了,在簡單的事,只要你想把他做好,其實也是很複雜的~
簡介
首先我們來到支付官網瞅瞅:
可以看到這就是支付首頁,下面有幾種支付方式,而我們今天的主角就是APP支付,我們可以直接點進去,或者從左上方接入指引-APP支付,進去的文檔式樣的,這是這個文檔的位置如所示:
肯定有人說,你貼這麼有毛用呀,還浪費我流量…
別急讓我給你說說這圖有什麼用,首先從這圖你能看出從註冊開發平台帳號到完成支付接入需要哪些步驟,哪些資料,這樣你可以讓相關的人員事先去準備這些資料,而不是填完一步資料,在去找下一步資料,記住時間就是金錢,另外你領導說來給我講講支付那準備哪些資料,你沒看過這文檔,那我就只能呵呵了O(∩_∩)O~。另外哪些說支付簡單的,有幾個知道這張圖,又有誰認真看過~~
可以看到是要加300塊的,還需要企業的一些資料。
另外支付有兩個平台分別是開發人員平台和商戶平台
開發人員平台:主要是針對開發人員,比如:建立應用,擷取appid
商戶平台:主要是商戶上面的一些管理,比如:可以查看流水,訂單呀
建立應用
這裡我只是示範怎麼建立應用,最後不會用這個帳號的,因為我這是個人帳號,沒法申請支付,只是給不會建立的朋友做一個示範,需要哪些資料而已,會的可略過~
首先我們來到開發人員平台,沒有帳號的先註冊,這個我想不用示範了,直接示範怎麼建立應用,首先你的登入完帳號,點擊管理中心-行動裝置 App:
點擊左上方的建立行動裝置 App,到如下介面,因為這裡是測試,所有資料都是隨便填啦
點擊下一步就來到了
這一步讓你填寫,需要的平台,以及平台資訊,我這裡只懸著android,填入包名和簽名,另外這裡他沒有想微博那樣可以填入多個簽名,那麼這裡我建議你一開始填入debug的簽名,等調試通過了在填寫正式簽名,簽名的擷取方法和接入第三方登入是一樣的。最後提交審核,等審核完以後,我們點擊到應用詳情,應該是這樣的效果
個人帳號建立的應用審核通過後只有,分享功能,如果還需要支付,可以點擊申請,然後認證帳號並上傳一些資料,這又是一個漫長的過程,這裡我們就不了那麼多了,現在直接說怎麼在代碼實現吧
運行官方demo
記住這裡的支付demo是在商戶平台的協助裡面下載,地址在這裡,而不是開發人員平台下載的那個demo(以前是可以,現在這裡下載的demo,裡面剔除了支付),如,是這個頁面:
第一個是基礎庫,點擊後會跳到開發人員平台,第二個參數支付demo,當然裡面也包含了分享等一些功能,可以說如果你既要做支付又要做分享,那麼你只需要這個一個demo就行了,當然還得需要我這篇文章呀
下載完匯入eclipse,替換debug.keystore然後運行,就可以看到如下介面,終於看到支付了,激動不已是不是
然後我們就可以點擊“跳轉到支付介面”,看看什麼效果呀,是騾子是馬總的溜溜吧,看到這一面,感覺神清氣爽,因為demo跑通了,呵呵~
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
配置回調activity
調用支付
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什麼啥的交個朋友也是不錯的,另外,微博都會不定期發一些優質的文章,感謝大家的支援~~,連絡方式在我的個人介紹裡啦