import hashlib,requests,xmltodict
from random import Random
from app import app
pay_url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers"
def sign(key, params):
# 字典序排序
data = "&".join([\'%s=%s\' % (key, params[key]) for key in sorted(params)])
# 拼接sign
data = \'%s&key=%s\' % (data, key)
# MD5加密, 所有字符转为大写
return hashlib.md5(data.encode(\'utf-8\')).hexdigest().upper()
def dict_to_xml(data, cdata=True, encoding=\'utf-8\'):
""" dict转xml """
tag = \'<{0}><![CDATA[{1}]]></{0}>\' if cdata else \'<{0}>{1}</{0}>\'
s = \'\'.join(tag.format(k, v) for k, v in data.items())
return \'<xml>{}</xml>\'.format(s).encode(encoding)
def xml_to_dict(content):
""" xml转dict """
data = xmltodict.parse(content).get(\'xml\')
if \'#text\' in data:
del data[\'#text\']
return data
def random_str():
"""
生成32位随机字符串
"""
chars = \'abcdefghijklmnopqrstuvwxyz0123456789\'
random = Random()
return "".join([chars[random.randint(0, len(chars) - 1)] for i in range(32)])
def wechat_transfer(openid, amount, order_id,desc= "测试商户支付",ip = None):
"""企业付款到个人余额接口"""
data = {
"mch_appid": app.config[\'WX_APPID\'], # 应用id
"mchid": app.config[\'WX_MCHID\'], # 商户号
"openid": openid, # 用户openid
"partner_trade_no": order_id, # 订单号
"amount": amount, # 支付金额
"check_name": "NO_CHECK", # 用户真实姓名
"nonce_str": random_str(), # 生成随机字符串
"desc": desc, # 备注,付款描述
"spbill_create_ip":ip # 用户ip
}
# 拼接签名
data["sign"] = sign(app.config["WX_API_KEY"],data)
# 转换格式
data_xml = dict_to_xml(data)
# 加载证书
cert = (app.config["WXPAY_CLIENT_CERT_PATH"], app.config["WXPAY_CLIENT_KEY_PATH"])
# 发起支付
result = requests.post(pay_url,data=data_xml,cert=cert)
return xml_to_dict(result.text)
if __name__ == \'__main__\':
# 金额单位是分 1*100 是 1块钱
ret = wechat_transfer("oLQdA5epndNHw4-RlCKEqIMPYEqE",1*100,"356352036536563269")
if ret and ret["return_code"] == "SUCCESS":
if ret["result_code"] == "SUCCESS":
print(\'付款成功\')