一、导入库
import random
import hashlib
import requests
from xml.etree import ElementTree
二、参数配置
def transfers(partner_trade_no, openid, amount):
"""
: partner_trade_no: 提现处理编号
: openid: 提现用户识别号
: amount: 提现金额
"""
info = {
'mch_appid': APP_ID,
'mchid': 'xxxx',
'partner_trade_no': partner_trade_no,
'nonce_str': "".join([chr(random.randint(65, 90)) for _ in range(12)]),
'openid': openid,
'check_name': "NO_CHECK",
'amount': int(amount * 100),
'desc': "提现说明"
}
info["sign"] = generate_sign(info)
xml = "<xml>{0}</xml>".format("".join(["<{0}>{1}</{0}>".format(k, v) for k, v in info.items()]))
key = "/home/ubuntu/ssl/apiclient_key.pem"
cert = "/home/ubuntu/ssl/apiclient_cert.pem"
三、参数签名
def generate_sign(param):
"""
将参数字典排序并组成字符串,拼接商户API_KEY,然后MD5加密
:param sandbox_key:
:param param:
:return:
"""
keys = sorted(param.keys())
string_sign = "&".join("{}={}".format(k, str(param[k])) for k in keys)+"&key=" + WX_API_KEY
hash_md5 = hashlib.md5(string_sign.encode("utf-8"))
sign = hash_md5.hexdigest().upper()
return sign
四、发起转账请求
try:
res = requests.post(
url='https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers',
data=xml.encode('utf-8'),
cert=(cert, key),
)
root = ElementTree.XML(res.content.decode('utf-8'))
response = {child.tag: child.text for child in root}
return response
except:
return {"result_code": "Fail", "err_code_des": "微信接口加密问题,10分钟后再试"}
五、调用实例
if __name__ == '__main__':
partner_trade_no = "2020081311193623110"
openid = "oTHtv5KZgHxxxxvayM3XQ"
amount = 0.01
res = transfers(partner_trade_no, openid, amount)
完整代码:https://gitee.com/linjinpeng-learn/python-code-snippet/blob/master/企业微信付款