Python开发微信支付的注意事项有哪些

  介绍

这篇文章给大家分享的是有关Python开发微信支付的注意事项有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

微信支付是由微信及财付通联合推出的移动支付创新产品。如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑。

要想开发顺利进行,首先要对业务流程有个清晰的认识。这里以微信公众号支付为例,因此也借用微信支付官方文档中的业务流程图:

接下来来关注几个开发过程中的关键点,包括:

1,生成商户订单与调用统一下单API

2,微信服务器交互的数据格式

3,公众号支付下网页内通过JS-API调起支付

4,异步通知商户支付结果(回调)

一、生成商户订单与调用统一下单API

这对应业务流程中的第第四和第5步,商户后台首先为用户生成订单,然后调用微信的【统一下单】接口向微信支付系统提交订单。这里有一个关键点就是签名的生成。

简单来讲分为以下几个步骤:

1,将所有有效参数以“k=v”的形式进行拼接,有效参数是指非空参数,也就是说如果参数为空,则不参与签名。

2,将所有的“k=v”对用“,”连接,得到“k1=v1& k2=v2& k3=v3”这样的字符串;

3,将微信支付API密钥拼接在最后,如“k1=v1& k2=v2& k3=v3&关键=秘密”;

4,对整体进行MD5运算,即得到签名。

这种签名方法有一个高大上的名字叫做HMAC(基于散列消息身份验证代码,基于哈希的消息码)。基于此思路,可以实现如下签名方法:

def  gen_sign (params,关键):   “才能”;“   签才能名生成函数   ,   :才能param 参数:,参数,dict 对象   ,,:param 关键:,API 密钥   ,,:返回:sign 字符串   “才能”;“   ,   时间=param_list 才能;[]   for 才能;k 拷贝排序(params.keys ()):   ,,,v =, params.get (k)   ,,,if  not  v:   ,,,,,#,参数的值为空不参与签名   ,,,,,继续   ,,,param_list.append (& # 39; {0}={1} & # 39; .format (k, v))   #,才能在最后拼接,关键   param_list.append才能(& # 39;关键={}& # 39;.format(关键))   #,才能用,,,连接各,k-v 对,然后对字符串进行,MD5 运算   return 才能;md5 (& # 39;, & # 39; . join (param_list) .encode (& # 39; use utf8 # 39;)) .hexdigest ()

参与签名的参数中有一个随机字符串,在Python中有很多方法,当然也可以利用uuid库来生成:

def  gen_nonce_str ():   “才能”;“   生才能成随机字符串,有效字符a-zA-Z0-9   ,   ,,:返回:随机字符串   “才能”;“   ,   return 才能;& # 39;& # 39;. join (str (uuid.uuid4 ()) .split (& # 39; & # 39;))

二,微信服务器交互的数据格式

微信服务器与商户服务器之间采用XML格式进行交互,这就涉及到与语言原生数据类型进行转换以方便处理。交互的数据参数都是键值的形式,因此在Python中使用字典会更加方便。而要解析XML,也有一大把第三方库供使用,比如BeautifulSoup。

以下是具体实现:

def  trans_xml_to_dict (XML):   “才能”;“   ,,将微信支付交互返回的,XML 格式数据转化为,Python  Dict 对象   ,   ,,:param  xml:,原始,XML 格式数据   ,,:返回:dict 对象   “才能”;“   ,   soup 才能=,BeautifulSoup (xml,特性=& # 39;xml # 39;)   xml 才能=,soup.find (& # 39; xml # 39;)   if 才能;not  xml:   ,,,return  {}   ,   #,才能将,XML 数据转化为,字典   data 才能=,dict (((item.name, item.text), for  item 拷贝xml.find_all ()))   ,return 数据   ,   ,   def  trans_dict_to_xml(数据):   “才能”;“   将才能,dict 对象转换成微信支付交互所需的,XML 格式数据   ,   ,,:param 数据:,dict 对象   ,,:返回:xml 格式数据   “才能”;“   ,   时间=xml 才能;[]   for 才能;k 拷贝排序(data.keys ()):   ,,,v =, data.get (k)   ,,,if  k ==, & # 39;细节# 39;,以及not  v.startswith (& # 39; & lt; ! [CDATA [& # 39;):   ,,,,,v =, & # 39; & lt; ! [CDATA[{}]]祝辞& # 39;.format (v)   ,,,xml.append (& # 39; & lt;{关键}在{value} & lt;/{关键}祝辞& # 39;.format(键=k,,值=https://www.yisu.com/zixun/v))   返回'

Python开发微信支付的注意事项有哪些