Android微信掃碼支付

weixin_34146805發表於2018-02-09

微信掃碼支付模式二:

微信文件:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
其實做支付的都知道微信文件是個巨坑,我也踩了不少坑但是最後還是解決了,於是打算總結一下。
我相信一般做微信掃碼支付的一般都是網頁版,或者PC端,反正我就很少看到APP裡面掃碼支付的。

準備:要先去微信開發者平臺申請AppID,其次要去申請開通支付,開通支付必須要成為開發者,300/年,然後就是填一些必要的資料,什麼收款賬戶之類的那些東西,總之最後會得到以下這三個必要的東西:

1.AppID.
2.商戶號.
3.商戶金鑰

開發:

微信掃碼支付有兩種模式,我們使用的是第二種模式(文件在上面那個地址),看了文章我們就可以知道我們需要用的API


7403980-18d0cae1a5d85be0.png
TIM圖片20180209150104.png
統一下單,支付結果通知等等
統一下單:

https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
統一下單的文件,看完可以得到的資訊就是,我們需要 post 微信需要的引數請求到統一下單這個介面,介面:URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder(統一下單)。
注意:其中兩個引數 notify_url 這個引數設定的地址,是支付結果回撥通知的網址,這個回撥地址還需要在商戶平臺的開發配置那裡配置,配置地址和上面引數是一樣的

7403980-ad1b28a7f79d6656.png
3.png

回撥是微信非同步發給我們的,需要我們去接收,它是一個流傳輸過來的。
sign 這個引數是要通過簽名演算法計算得出的簽名值 ,具體怎麼算微信引數描述那有說明的,其他引數 注意一下微信後面需要的要求,例如需要加密什麼的。最後需要把我們的引數,轉換成XML格式,在傳送給下單介面。
例如:

<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <attach>支付測試</attach>
   <body>JSAPI支付測試</body>
   <mch_id>10000100</mch_id>
   <detail><![CDATA[{ "goods_detail":[ { "goods_id":"iphone6s_16G", "wxpay_goods_id":"1001", "goods_name":"iPhone6s 16G", "quantity":1, "price":528800, "goods_category":"123456", "body":"蘋果手機" }, { "goods_id":"iphone6s_32G", "wxpay_goods_id":"1002", "goods_name":"iPhone6s 32G", "quantity":1, "price":608800, "goods_category":"123789", "body":"蘋果手機" } ] }]]></detail>
   <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
   <notify_url>http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url>
   <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
   <out_trade_no>1415659990</out_trade_no>
   <spbill_create_ip>14.23.150.211</spbill_create_ip>
   <total_fee>1</total_fee>
   <trade_type>JSAPI</trade_type>
   <sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>

微信會給我們放回

<xml>
   <return_code><![CDATA[SUCCESS]]></return_code>
   <return_msg><![CDATA[OK]]></return_msg>
   <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
   <mch_id><![CDATA[10000100]]></mch_id>
   <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
   <openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid>
   <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
   <result_code><![CDATA[SUCCESS]]></result_code>
   <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
   <trade_type><![CDATA[JSAPI]]></trade_type>
   <code_url>![CDATA[weixin://wxpay/s/An4baqw]]</code_url>
</xml>

這裡放回來後我們為了簡便 要把XML轉換成json資料。

上面提到的 引數轉XML, XML轉json這些工具類,網上很多我就不發了。知道思路就可以了。

我們需要的就是<code_url>,這個標籤下的這個連結,這個連結就是我們生成收款碼的東西,。
之後我們就需要我們的 Zxing,不懂就去搜尋一下,因為我們今天只是說微信掃碼支付,其他必要知識不會細說,而且其實網上有很多生成二維碼的工具類,最後會返回一個 Bitmap. 最後讓ImageView顯示出來就可以了。

支付結果通知

文件:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7
看懂微信文件這段話就可以了:
支付完成後,微信會把相關支付結果和使用者資訊傳送給商戶,商戶需要接收處理,並返回應答。
對後臺通知互動時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,微信會通過一定的策略定期重新發起通知,儘可能提高通知的成功率,但微信不保證通知最終能成功。 (通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)
注意:同樣的通知可能會多次傳送給商戶系統。商戶系統必須能夠正確處理重複的通知。
推薦的做法是,當收到通知進行處理時,首先檢查對應業務資料的狀態,判斷該通知是否已經處理過,如果沒有處理過再進行處理,如果處理過直接返回結果成功。在對業務資料進行狀態檢查和處理之前,要採用資料鎖進行併發控制,以避免函式重入造成的資料混亂。
特別提醒:商戶系統對於支付結果通知的內容一定要做簽名驗證,並校驗返回的訂單金額是否與商戶側的訂單金額一致,防止資料洩漏導致出現“假通知”,造成資金損失。

由於涉及到交易問題,我這邊需要存到資料庫,所以回撥通知這方面是後臺去接收,然後我再請求後臺檢視支付結果。

相關文章