国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 微信開發(fā) Python開發(fā)微信支付的注意事項(xiàng)

Python開發(fā)微信支付的注意事項(xiàng)

Feb 25, 2017 am 10:43 AM

前言

微信支付是由微信及財(cái)付通聯(lián)合推出的移動(dòng)支付創(chuàng)新產(chǎn)品。如今,隨著微信支付的全面開放,相關(guān)需求也越來越多,很多開發(fā)人員進(jìn)行微信支付開發(fā)及商家申請(qǐng)微信支付時(shí),面臨著諸多疑惑。

要想開發(fā)順利進(jìn)行,首先要對(duì)業(yè)務(wù)流程有個(gè)清晰的認(rèn)識(shí)。這里以微信公眾號(hào)支付為例,因此也借用微信支付官方文檔中的業(yè)務(wù)流程圖:

Python開發(fā)微信支付的注意事項(xiàng)

接下來來關(guān)注幾個(gè)開發(fā)過程中的關(guān)鍵點(diǎn),包括:

????? 1、生成商戶訂單與調(diào)用統(tǒng)一下單 API

????? 2、微信服務(wù)器交互的數(shù)據(jù)格式

????? 3、公眾號(hào)支付下網(wǎng)頁內(nèi)通過 JS-API 調(diào)起支付

????? 4、異步通知商戶支付結(jié)果(回調(diào))?

一、生成商戶訂單與調(diào)用統(tǒng)一下單 API

這對(duì)應(yīng)業(yè)務(wù)流程中的第 4 和 第 5 步,商戶后臺(tái)首先為用戶生成訂單,然后調(diào)用微信的【統(tǒng)一下單】接口向微信支付系統(tǒng)提交訂單。這里有一個(gè)關(guān)鍵點(diǎn)就是簽名的生成。

簡(jiǎn)單來講分為以下幾個(gè)步驟:

????? 1、將所有有效參數(shù)以“k=v”的形式進(jìn)行拼接,有效參數(shù)是指非空參數(shù),也就是說如果參數(shù)為空,則不參與簽名;

????? 2、將所有的“k=v”對(duì)用“&”連接,得到“k1=v1&k2=v2&k3=v3”這樣的字符串;

????? 3、將微信支付 API 密鑰 拼接在最后,如“k1=v1&k2=v2&k3=v3&key=secret”;

????? 4、對(duì)整體進(jìn)行 MD5 運(yùn)算,即得到簽名。

這種簽名方法有一個(gè)高大上的名字叫做 HMAC(Hash-based Message Authentication Code,基于哈希的消息碼)?;诖怂悸?,可以實(shí)現(xiàn)如下簽名方法:

def?gen_sign(params,?key):
??"""
??簽名生成函數(shù)
?
??:param?params:?參數(shù),dict?對(duì)象
??:param?key:?API?密鑰
??:return:?sign?string
??"""
?
??param_list?=?[]
??for?k?in?sorted(params.keys()):
????v?=?params.get(k)
????if?not?v:
??????#?參數(shù)的值為空不參與簽名
??????continue
????param_list.append('{0}={1}'.format(k,?v))
??#?在最后拼接?key
??param_list.append('key={}'.format(key))
??#?用?&?連接各?k-v?對(duì),然后對(duì)字符串進(jìn)行?MD5?運(yùn)算
??return?md5('&'.join(param_list).encode('utf8')).hexdigest()

參與簽名的參數(shù)中有一個(gè)隨機(jī)字符串,在 Python 中有很多方法,當(dāng)然也可以利用 uuid 庫來生成:

def?gen_nonce_str():
??"""
??生成隨機(jī)字符串,有效字符a-zA-Z0-9
?
??:return:?隨機(jī)字符串
??"""
?
??return?''.join(str(uuid.uuid4()).split('-'))

?

二、微信服務(wù)器交互的數(shù)據(jù)格式

微信服務(wù)器與商戶服務(wù)器之間采用 XML 格式進(jìn)行交互,這就涉及到與語言原生數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換以方便處理。交互的數(shù)據(jù)參數(shù)都是 key-value 的形式,因此在 Python 中使用字典會(huì)更加方便。而要解析 XML,也有一大把第三方庫供使用,比如 BeautifulSoup。

以下是具體實(shí)現(xiàn):

def?trans_xml_to_dict(xml):
??"""
??將微信支付交互返回的?XML?格式數(shù)據(jù)轉(zhuǎn)化為?Python?Dict?對(duì)象
?
??:param?xml:?原始?XML?格式數(shù)據(jù)
??:return:?dict?對(duì)象
??"""
?
??soup?=?BeautifulSoup(xml,?features='xml')
??xml?=?soup.find('xml')
??if?not?xml:
????return?{}
?
??#?將?XML?數(shù)據(jù)轉(zhuǎn)化為?Dict
??data?=?dict([(item.name,?item.text)?for?item?in?xml.find_all()])
??return?data
?
?
def?trans_dict_to_xml(data):
??"""
??將?dict?對(duì)象轉(zhuǎn)換成微信支付交互所需的?XML?格式數(shù)據(jù)
?
??:param?data:?dict?對(duì)象
??:return:?xml?格式數(shù)據(jù)
??"""
?
??xml?=?[]
??for?k?in?sorted(data.keys()):
????v?=?data.get(k)
????if?k?==?'detail'?and?not?v.startswith('<![CDATA[&#39;):
      v = &#39;<![CDATA[{}]]>'.format(v)
????xml.append('<{key}>{value}</{key}>'.format(key=k,?value=v))
??return?'<xml>{}</xml>'.format(''.join(xml))

注意 detail 參數(shù),即商品詳情,其值為 JSON 格式,在轉(zhuǎn)換為 XML 數(shù)據(jù)時(shí)應(yīng)前注意使用 CDATA 標(biāo)簽將其保護(hù)起來。

如:

<detail><![CDATA[{"goods_detail": [{"wxpay_goods_id": "10010001", "price": 1, "goods_num": 1, "goods_name": "\\u82f9\\u679c", "goods_id": "10010001"}, {"wxpay_goods_id": "10010002", "price": 1, "goods_num": 1, "goods_name": "\\u9999\\u8549", "goods_id": "10010002"}]}]]></detail>

三、公眾號(hào)支付下網(wǎng)頁內(nèi)通過 JS-API 調(diào)起支付

這一點(diǎn)對(duì)應(yīng)業(yè)務(wù)流程中的第 7 步。之所以提及它是因?yàn)槲⑿殴俜轿臋n在此給開發(fā)者挖了一個(gè)坑(至少截至我在寫這篇文章時(shí)是的),就是在“網(wǎng)頁端調(diào)起支付API”中關(guān)于 JS 的示例代碼是采用的 WeixinJSBridge,這在很早以前就是 Deprecated 的“玩意兒”,如今更是已經(jīng)不可用了。正確的做法是使用 JS-SDK,可以參考微信公眾號(hào)的 wiki。

使用 JS-SDK 前需要先調(diào)用 config,這里也包含一個(gè)簽名,但注意這個(gè)簽名與之前微信支付的簽名并不相干。其首先需要用微信公眾號(hào)的 APPID 和 APPKEY 來換取 access_token,然后用該 access_token 調(diào)用 JS-SDK 換取 ticket 的接口得到 ticket,最后再使用該 ticket 和用戶當(dāng)前頁面的 URI 通過 sha1 運(yùn)算生成簽名。

在此之后,即可調(diào)用 wx.chooseWXPay 來調(diào)起支付,這里也有一個(gè)坑:timestamp。wx.chooseWXPay 中的參數(shù)要求 timestamp 是全小寫。而微信支付中簽名時(shí)要求 timestamp 中的“s”是大寫。真的是要傻傻分不清了。?

四、異步通知商戶支付結(jié)果(回調(diào))

最后是關(guān)于異步回調(diào),對(duì)應(yīng)業(yè)務(wù)流程中的第 10 步。在用戶支付操作完成后,微信服務(wù)器會(huì)通過回調(diào)的形式告知商戶服務(wù)器支付結(jié)果。回調(diào)的地址與【統(tǒng)一下單】中定義的 notify_url 一致。當(dāng)接收到回調(diào)時(shí),首先應(yīng)驗(yàn)證簽名的有效性以保證“來源可靠”,然后可以通過回調(diào)中所帶的 openid、out_trade_no 等來定位唯一訂單。

總結(jié)

微信支付還有很多種形式,在業(yè)務(wù)流程上也不盡相同。不過只要能玩轉(zhuǎn)其中一種,其他的也基本來說能很快實(shí)現(xiàn)。另外,支付功能的實(shí)現(xiàn)涉及業(yè)務(wù)流程中的安全性,因此一定要注意理清業(yè)務(wù)流程,并卡好各個(gè)關(guān)鍵結(jié)點(diǎn)。以上就是本文的全部?jī)?nèi)容,希望對(duì)大家使用Python開發(fā)微信支付能有所幫助。

更多Python開發(fā)微信支付的注意事項(xiàng)相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)