玩轉微信支付(python)

廢話

github源碼php

碼雲地址html

作了京東,支付寶和微信的python版本支付,發現只有微信支付開發文檔是最用心去作的,講解的很是仔細,還有大量的僞代碼,說實話,實現起來真是沒有難度,只是前期準備的東西有不少,好比要申請各類認證,至少到目前爲止,我沒有發現諸如京東支付或者支付寶支付那樣的測試環境供普通開發者去調試python

技術描點

微信支付方式很是多,詳見:https://pay.weixin.qq.com/wiki/doc/api/index.html。git

我在這裏是用的掃碼支付,用於pc網站。首先要準備的是兩個重要的賬號:公衆賬號ID和商戶號。因此要先去以公司的名義申請商戶資質github

各類申請好了以後,找到【公衆賬號ID】和【商戶號】就可行,【公衆賬號ID】藏的比較隱祕,不太好找,要用心找。json

掃描支付有兩種模式:模式一和模式二:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5api

我推薦使用模式二,應該說也是官方推薦的,由於它簡化了不少步驟,讓流程更容易讓開發者理解服務器

業務流程說明:微信

(1)商戶後臺系統根據用戶選購的商品生成訂單。
(2)用戶確認支付後調用微信支付【統一下單API】生成預支付交易;
(3)微信支付系統收到請求後生成預支付交易單,並返回交易會話的二維碼連接code_url。
(4)商戶後臺系統根據返回的code_url生成二維碼。
(5)用戶打開微信「掃一掃」掃描二維碼,微信客戶端將掃碼內容發送到微信支付系統。
(6)微信支付系統收到客戶端請求,驗證連接有效性後發起用戶支付,要求用戶受權。
(7)用戶在微信客戶端輸入密碼,確認支付後,微信客戶端提交受權。
(8)微信支付系統根據用戶受權完成支付交易。
(9)微信支付系統完成支付交易後給微信客戶端返回交易結果,並將交易結果經過短信、微信消息提示用戶。微信客戶端展現支付交易結果頁面。
(10)微信支付系統經過發送異步消息通知商戶後臺系統支付結果。商戶後臺系統需回覆接收狀況,通知微信後臺系統再也不發送該單的支付通知。
(11)未收到支付通知的狀況,商戶後臺系統調用【查詢訂單API】。
(12)商戶確認訂單已支付後給用戶發貨。

看了上面的流程簡介,是否是感受很是簡單app

一. 統一下單API

接口:https://api.mch.weixin.qq.com/pay/unifiedorder

接口參數說明:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1

二. 簽名

微信的簽名是三種支付方式中最簡單的,沒有使用公私鑰的非對稱加解密驗籤,而是用的MD5(注意在商戶平臺裏設置MD5)。

詳情請見:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3

看看人家的簽名步驟,就差在你背後教你手寫代碼了。仍是公司大啊

簽名完的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>

而後用requests庫發送一個post請求就ok了

三. 生成二維碼

在下單成功以後,會返回二維碼的內容,拿到這個以後,本身在後臺生成一個二維碼圖片給用戶就能夠了,是否是很是簡單。

四. 異步回調

在用戶掃碼並支付成功以後,老規矩會觸發一個異步通知,這個通知會通知支付的狀態,必定要以這個通知爲標準。處理完邏輯以後,必定要記得返回一個確認信息給微信

# 在處理好以後,必定要返回給微信
xml_str = MxPay.get_xml({"return_code": "SUCCESS"})
return HttpResponse(xml_str)

並且必定要記住,當用戶支付成功以後,會不停的往你設定的這個異步回調地址發post請求,直到你回覆了,才中止發送。因此在處理的時候,必定要判斷是否處理過了

五. 申請退款

涉及到退款,那可馬虎不得,微信也說了,下單隨便下,退款那得慢慢來。因此在這裏退款的操做,要特別注意的是須要帶證書(微信支付簽發的)

requests.post(url, data=json.dumps(xml_str, ensure_ascii=False),cert=(self.API_CLIENT_CERT_PATH, self.API_CLIENT_KEY_PATH))

總體來講,微信支付很簡單,看看文檔確定是沒有問題的。

setting文件的一些配置

# 微信分配的公衆帳號ID
APP_ID = "wx6534240dfae560"
# 微信支付分配的商戶號
MCH_ID = "13459829292"
# 私鑰(在商戶後臺設置的就是這個值,注意修改任何一段須要同步修改)
WX_MCH_KEY = "D3EG723wIxgv2jnEgkr38yNJ8cP05D6aoT"

# 異步接收微信支付結果通知的回調地址,通知url必須爲外網可訪問的url,不能攜帶參數。
ASYN_NOTIFY_URL = "http://xxxxxx.com:8888/test/weixin/"

# 統一下單地址
ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder"

# 查詢訂單url
SEARCH_URL = "https://api.mch.weixin.qq.com/pay/orderquery"
# 關閉訂單url
CLOSE_URL = "https://api.mch.weixin.qq.com/pay/closeorder"

# 申請退款url
REFUND_URL = "https://api.mch.weixin.qq.com/secapi/pay/refund"

# 查詢申請退款
SEARCH_REFUND_URL = "https://api.mch.weixin.qq.com/pay/refundquery"

# 服務器存放證書路徑(微信支付簽發的)
API_CLIENT_CERT_PATH = "/path/your/cert/apiclient_cert.pem"
API_CLIENT_KEY_PATH = "/path/your/cert/apiclient_key.pem"

貼一下博客地址

相關文章
相關標籤/搜索