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