微信商户转帐到个人零钱

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

  

原文地址:https://www.cnblogs.com/zhoulangshunxinyangfan/p/14292845.html