Django后端微信APP支付,两次签名字符串返回给前端

准备:

  1. APPID(微信开放平台注册的APP)
  2. MCHID (微信支付商户平台注册商户)
  3. MCHKEY(商户秘钥即自己设置的API秘钥)
  4. T2ORDERURL(统一下单url)
  5. NOTIFY_URL (成功回调地址)
import hashlib
import string
import time
from random import sample

import requests
import xmltodict

from ShareApp.settings import APPID, MCHKEY, T2ORDERURL, NOTIFY_URL

'''
APP微信支付
'''


def get_random():
    return ''.join(sample(string.ascii_letters + string.digits, 32))


def get_prepay_id(url, parmas):
    parmas = {
        'xml': parmas
    }
    # 转化为xml格式,作为参数 统一下单
    xml = xmltodict.unparse(parmas)
    response = requests.post(url, data=xml.encode('utf8'))
    # 将返回的xml格式,转换为dict
    xmlmsg = xmltodict.parse(response.text)
    return xmlmsg


class WxPay(object):
    def __init__(self, good_info):
        self.APPID = APPID
        self.MCHID = '1602459486'
        self.MCHKEY = MCHKEY
        self.NOTIFY_URL = NOTIFY_URL
        self.good_info = good_info

    def to_order(self):
        to_order_url = T2ORDERURL
        # 用来访问统一下单的参数
        params = {
            'appid': self.APPID,
            'mch_id': self.MCHID,
            'nonce_str': get_random(),
            'body': self.good_info['body'],
            'out_trade_no': self.good_info['out_trade_no'],
            'total_fee': str(int(self.good_info['total_fee'] * 100)),  # 单位为分
            'spbill_create_ip': '127.0.0.1',  # 服务器ip
            'notify_url': self.NOTIFY_URL,
            'trade_type': 'APP',
        }
        sign = self.wx_sign(params)
        # 第一次签名获取prepay_id
        params['sign'] = sign
        xmlmsg = get_prepay_id(to_order_url, params)
        # print(xmlmsg)
        if xmlmsg["xml"]["return_code"] == "SUCCESS" and xmlmsg["xml"]["result_code"] == "SUCCESS":
            prepay_id = xmlmsg['xml']['prepay_id']
            data = {
                "appId": self.APPID,
                "partnerid": self.MCHID,
                "prepayid": prepay_id,
                "package": "Sign=WXPay",
                "nonceStr": get_random(),
                "timeStamp": str(int(time.time()))
            }
            # 加上prepay_id 进行第二次签名md5,返回给前端即可
            paySign = self.wx_sign(data)
            data["sign"] = paySign
            return data
        return None

    def wx_sign(self, param):
        stringA = ''
        ks = sorted(param.keys())
        for k in ks:
        	#在验签时使用,过滤字段
        	if k != 'sign' and k != 'sign_type' and param[k]:
	            data = param[k]
	            stringA += (k + '=' + str(data) + '&')

        stringSignTemp = stringA + "key=" + self.MCHKEY
        # md5加密
        hash_md5 = hashlib.md5(stringSignTemp.encode('utf8'))
        sign = hash_md5.hexdigest().upper()
        return sign

使用:

good_info = {
            'body': str(contract_id),
            'out_trade_no': order.order_num, 
            'total_fee': real_money
        }
wxpay = WxPay(good_info)
pay_sign = wxpay.to_order()
把支付签名返回给前端即可

下一篇成功回调验签,返回格式以停止回调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值