准备:
- APPID(微信开放平台注册的APP)
- MCHID (微信支付商户平台注册商户)
- MCHKEY(商户秘钥即自己设置的API秘钥)
- T2ORDERURL(统一下单url)
- 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 = xmltodict.unparse(parmas)
response = requests.post(url, data=xml.encode('utf8'))
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',
'notify_url': self.NOTIFY_URL,
'trade_type': 'APP',
}
sign = self.wx_sign(params)
params['sign'] = sign
xmlmsg = get_prepay_id(to_order_url, params)
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()))
}
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
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()
把支付签名返回给前端即可