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('付款成功')