首先注册微信公众平台服务号:https://mp.weixin.qq.com
获得开发者id和秘钥(appid & appsecret)
随后注册微信支付商户平台:https://pay.weixin.qq.com/
获取微信支付的商户号(在账户信息页面):
获取微信支付接口的秘钥(账户中心->api安全):
同时在产品中心->开发配置页面,将支付域名配置好:
微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5&index=3
生成二维码后
使用微信扫码即可
由于涉及金钱业务,为了养成良好的测试习惯,最好登录商户后台再次确认
import requests
import random
import time
import hashlib
import qrcode
from bs4 import BeautifulSoup
class WeixinHandler():
def trans_xml_to_dict(self,data_xml):
soup = BeautifulSoup(data_xml, features='html.parser')
xml = soup.find('xml') # 解析XML
if not xml:
return {}
data_dict = dict([(item.name, item.text) for item in xml.find_all()])
return data_dict
def trans_dict_to_xml(self,data_dict): # 定义字典转XML的函数
data_xml = []
for k in sorted(data_dict.keys()): # 遍历字典排序后的key
v = data_dict.get(k) # 取出字典中key对应的value
if k == 'detail' and not v.startswith('<![CDATA['): # 添加XML标记
v = '<![CDATA[{}]]>'.format(v)
data_xml.append('<{key}>{value}</{key}>'.format(key=k, value=v))
return '<xml>{}</xml>'.format(''.join(data_xml)) # 返回XML
def get_sign(self,data_dict, key): # 签名函数,参数为签名的数据和密钥
params_list = sorted(data_dict.items(), key=lambda e: e[0], reverse=False) # 参数字典倒排序为列表
params_str = "&".join(u"{}={}".format(k, v) for k, v in params_list) + '&key=' + key
# 组织参数字符串并在末尾添加商户交易密钥
md5 = hashlib.md5() # 使用MD5加密模式
md5.update(params_str.encode()) # 将参数字符串传入
sign = md5.hexdigest().upper() # 完成加密并转为大写
return sign
def get(self):
url = 'https://api.mch.weixin.qq.com/pay/unifiedorder' # 微信扫码支付接口
key = '商户api秘钥' # 商户api秘钥 须替换
total_fee = int(float('1') * 100) # 支付金额,单位分
body = 'nine-tailed fox' # 商品描述
out_trade_no = "order_16837069598136852151_5" # 订单编号 只能使用一次
params = {
'appid': 'APPID', # APPID 须替换
'mch_id': '商户号', # 商户号 须替换
'notify_url': 'http://127.0.0.1:9999/school/school', # 支付域名回调地址
'product_id': 'goods_%s' % random.randrange(100000, 999999), # 商品编号
'trade_type': 'NATIVE', # 支付类型(扫码支付)
'spbill_create_ip': '114.254.176.137', # 发送请求服务器的IP地址
'total_fee': total_fee, # 订单总金额
'out_trade_no': out_trade_no, # 订单编号
'body': body, # 商品描述
'nonce_str': 'ibuaiVcKdpRxkhJA' # 随机 字符串
}
sign = self.get_sign(params, key) # 获取签名
params.setdefault('sign', sign) # 添加签名到参数字典
xml = self.trans_dict_to_xml(params) # 转换字典为XML
response = requests.request('post', url, data=xml) # 以POST方式向微信公众平台服务器发起请求
print(response.content)
data_dict = self.trans_xml_to_dict(response.content) # 将请求返回的数据转为字典
print(data_dict)
qrcode_name = out_trade_no + '.png' # 支付二维码图片保存路径
if data_dict.get('return_code') == 'SUCCESS': # 如果请求成功
img = qrcode.make(data_dict.get('code_url')) # 创建支付二维码片
img.save('../vxstatic/' + qrcode_name) # 保存支付二维码
return 'ok'
print(WeixinHandler().get())