在PC端实现微信支付的流程主要包括以下步骤:
- 商户服务器生成微信支付订单,并获取支付二维码。
- 用户扫描二维码,进入微信支付页面。
- 用户在微信中完成支付。
- 微信服务器通知商户支付结果。
以下是实现微信支付的详细步骤和代码示例:
步骤一:生成微信支付订单
首先,需要在微信支付商户平台申请支付权限,并获取商户号、AppID和密钥。然后,通过调用微信支付统一下单接口生成支付订单。
import requests
import hashlib
import xml.etree.ElementTree as ET
# 微信支付配置
appid = 'your_appid' # 微信支付AppID
mch_id = 'your_mch_id' # 商户号
key = 'your_api_key' # API密钥
notify_url = 'your_notify_url' # 支付结果通知地址
def generate_nonce_str():
"""生成随机字符串"""
import random
import string
return ''.join(random.sample(string.ascii_letters + string.digits, 32))
def sign(data, key):
"""生成签名"""
stringA = '&'.join([f"{k}={v}" for k, v in sorted(data.items()) if v])
stringSignTemp = f"{stringA}&key={key}"
return hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper()
def unified_order(out_trade_no, total_fee, body, spbill_create_ip):
"""调用微信统一下单接口生成支付订单"""
url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'
data = {
'appid': appid,
'mch_id': mch_id,
'nonce_str': generate_nonce_str(),
'body': body,
'out_trade_no': out_trade_no,
'total_fee': total_fee,
'spbill_create_ip': spbill_create_ip,
'notify_url': notify_url,
'trade_type': 'NATIVE'
}
data['sign'] = sign(data, key)
xml = '<xml>'
for k, v in data.items():
xml += f'<{k}>{v}</{k}>'
xml += '</xml>'
response = requests.post(url, data=xml)
root = ET.fromstring(response.content)
if root.find('return_code').text == 'SUCCESS' and root.find('result_code').text == 'SUCCESS':
return root.find('code_url').text
else:
raise Exception(f"Error: {root.find('return_msg').text}")
# 示例调用
out_trade_no = '20230718001' # 商户订单号
total_fee = 1 # 订单金额,单位为分
body = 'Test Order' # 商品描述
spbill_create_ip = '127.0.0.1' # 终端IP
try:
code_url = unified_order(out_trade_no, total_fee, body, spbill_create_ip)
print(f"Scan the QR code to pay: {code_url}")
except Exception as e:
在上述代码中,我们通过调用微信支付统一下单接口生成支付订单,并返回支付二维码的URL。商户可以使用这个URL生成二维码并展示给用户,用户扫码后可以在微信中进行支付。
步骤二:生成支付二维码
通过生成的支付二维码URL,我们可以生成二维码图片,并展示给用户。可以使用 qrcode
库来生成二维码。
import qrcode
def generate_qr_code(data, file_path):
"""生成二维码图片"""
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(data)
qr.make(fit=True)
img = qr.make_image(fill='black', back_color='white')
img.save(file_path)
# 示例调用
file_path = 'pay_qr_code.png'
generate_qr_code(code_url, file_path)
print(f"QR code saved to {file_path}")
在上述代码中,我们使用 qrcode
库生成支付二维码图片,并保存到本地文件中。
步骤三:支付结果通知
用户在微信中完成支付后,微信服务器会通过商户在下单时提供的 notify_url
地址通知商户支付结果。商户需要实现支付结果通知的处理逻辑。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/notify', methods=['POST'])
def notify():
xml_data = request.data
root = ET.fromstring(xml_data)
# 获取微信返回的数据
out_trade_no = root.find('out_trade_no').text
result_code = root.find('result_code').text
return_code = root.find('return_code').text
total_fee = root.find('total_fee').text
if return_code == 'SUCCESS' and result_code == 'SUCCESS':
# 处理支付成功的逻辑,例如更新订单状态
print(f"Order {out_trade_no} paid successfully, total fee: {total_fee}")
response_data = {
'return_code': 'SUCCESS',
'return_msg': 'OK'
}
else:
# 处理支付失败的逻辑
print(f"Order {out_trade_no} payment failed")
response_data = {
'return_code': 'FAIL',
'return_msg': 'Payment Failed'
}
response_xml = '<xml>'
for k, v in response_data.items():
response_xml += f'<{k}>{v}</{k}>'
response_xml += '</xml>'
return response_xml
if __name__ == '__main__':
app.run(port=5000)
在上述代码中,我们使用 Flask 框架实现了支付结果通知的处理逻辑。当微信服务器通知支付结果时,我们解析通知数据,并根据支付结果处理相应的业务逻辑,例如更新订单状态。
总结
通过以上步骤,我们实现了PC端扫码支付的完整流程,包括生成支付订单、生成支付二维码以及处理支付结果通知。在实际应用中,可以根据业务需求进一步完善和优化代码逻辑。