class WeChatPay(object):
def __init__(self, order_id, body, total_fee, nonce_str, spbill_create_ip='8.8.8.8'):
"""
:param order_id: 订单ID
:param body: 订单信息
:param total_fee: 订单金额
:param nonce_str: 32位内随机字符串
:param spbill_create_ip: 客户端请求IP地址
appid = '微信appid'
AppSecret = '微信AppSecret'
mch_id = '微信商户id'
api_key = '微信支付密钥'
"""
self.params = {
'appid': YOUR_WX_APPID,
'mch_id': YOUR_MCH_ID,
'nonce_str': nonce_str,
'body': str(body),
'out_trade_no': str(order_id),
'total_fee': str(int(total_fee)),#单位为分
'spbill_create_ip': spbill_create_ip,#用户请求地址
'trade_type': 'APP', # 'APP',
'notify_url': YOUR_NOTIFY_URL,#你的支付回调地址
}
self.WxPay_request_url = 'https://api.mch.weixin.qq.com/pay/unifiedorder' # 微信请求url
self.error = None
def key_value_url(self, value):
"""将将键值对转为 key1=value1&key2=value2
"""
pair_array = []
string_sign = ''
for k in sorted(value.keys()):
string_sign += "{0}={1}&".format(k, value[k])
print(string_sign)
return string_sign
def get_sign(self, params):
"""生成sign
"""
stringA = self.key_value_url(params)
stringSignTemp = stringA + 'key=' + current_app.config['APIKEY'] # APIKEY, API密钥,需要在商户后台设置
print(stringSignTemp)
sign = hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper()
params['sign'] = sign
def get_req_xml(self):
"""拼接XML
"""
self.get_sign(self.params)
xml = "<xml>"
for k in sorted(self.params.keys()):
xml += '<{0}>{1}</{0}>'.format(k, self.params[k])
xml += "</xml>"
print(xml)
return xml.encode('utf-8')
def get_prepay_id(self):
"""
请求获取prepay_id
"""
import requests
xml = self.get_req_xml()
unifiedorderXML = requests.post('https://api.mch.weixin.qq.com/pay/unifiedorder', data=xml)
unifiedorderXML.encoding ='utf-8'
unifiedorderXML = unifiedorderXML.text
print(unifiedorderXML)
tree = et.parse(unifiedorderXML)
root = tree.getroot()
if root.find("result_code").text != 'SUCCESS':
self.error = u"连接微信出错啦!"
print(self.error)
prepay_id = root.find("prepay_id").text
self.params['prepay_id'] = prepay_id
self.params['package'] = 'Sign=WXPay'
self.params['timestamp'] = str(int(time.time()))
def re_finall(self):
"""得到prepay_id后再次签名,返回给终端参数
"""
self.get_prepay_id()
if self.error:
return
sign_again_params = {
'appid': self.params['appid'],
'noncestr': self.params['nonce_str'],
'package': self.params['package'],
'partnerid': self.params['mch_id'],
'timestamp': self.params['timestamp'],
'prepayid': self.params['prepay_id']
}
self.get_sign(sign_again_params)
self.params['sign'] = sign_again_params['sign']
# 移除其他不需要返回参数
print('最后一步:', self.params)
parms_keys = []
for i in self.params.keys():
parms_keys.append(i)
for i in parms_keys:
if i not in ['appid', 'mch_id', 'nonce_str', 'timestamp', 'sign', 'package', 'prepay_id']:
self.params.pop(i)
print('传给前端的parms:', self.params)
return self.params
django 调用微信接口(微信支付、微信用户信息)
最新推荐文章于 2024-05-08 04:44:52 发布