如何将支付订单信息发送给微信支付服务器,请求支付处理。代码实现
时间: 2023-06-12 17:06:03 浏览: 225
以下是使用 Python 代码将支付订单信息发送给微信支付服务器,请求支付处理的示例:
```python
import requests
import hashlib
import xml.etree.ElementTree as ET
# 设置请求参数
url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'
params = {
'appid': '微信公众号或小程序的APPID',
'mch_id': '商户号',
'nonce_str': '随机字符串',
'body': '商品描述',
'out_trade_no': '商户订单号',
'total_fee': '订单总金额,单位为分',
'spbill_create_ip': '终端IP',
'notify_url': '接收微信支付异步通知回调地址',
'trade_type': '交易类型',
'openid': '用户openid'
}
# 生成签名
key = '商户支付密钥'
stringA = '&'.join(["{}={}".format(k, params.get(k)) for k in sorted(params)])
stringSignTemp = "{}&key={}".format(stringA, key)
sign = hashlib.md5(stringSignTemp.encode('utf-8')).hexdigest().upper()
# 构造请求XML
params['sign'] = sign
xml = "<xml>{}</xml>".format(''.join(["<{}>{}</{}>".format(k, v, k) for k, v in params.items()]))
# 发送请求
response = requests.post(url, data=xml.encode('utf-8'), headers={'Content-Type': 'application/xml'})
response.encoding = 'utf-8'
# 解析返回结果XML
root = ET.fromstring(response.text)
result_code = root.find('result_code').text
if result_code == 'SUCCESS':
# 请求成功,获取预支付交易会话标识prepay_id
prepay_id = root.find('prepay_id').text
# 构造支付参数
pay_params = {
'appId': '微信公众号或小程序的APPID',
'timeStamp': str(int(time.time())),
'nonceStr': '随机字符串',
'package': 'prepay_id={}'.format(prepay_id),
'signType': 'MD5'
}
# 生成签名
pay_params['paySign'] = hashlib.md5('&'.join(["{}={}".format(k, pay_params.get(k)) for k in sorted(pay_params)]).encode('utf-8')).hexdigest().upper()
# 返回支付参数,用于前端调起微信支付
return pay_params
else:
# 请求失败,返回错误信息
err_code = root.find('err_code').text
err_msg = root.find('err_code_des').text
return err_code, err_msg
```
在代码中,需要替换以下参数:
- `appid`:微信公众号或小程序的APPID
- `mch_id`:商户号
- `nonce_str`:随机字符串
- `body`:商品描述
- `out_trade_no`:商户订单号
- `total_fee`:订单总金额,单位为分
- `spbill_create_ip`:终端IP
- `notify_url`:接收微信支付异步通知回调地址
- `trade_type`:交易类型
- `openid`:用户openid
- `key`:商户支付密钥
其中,`key` 是在微信商户平台设置的支付密钥,用于生成签名。签名算法详见微信支付开发文档。
发送请求时,需要将请求参数转换为 XML 格式,并在请求头中设置 `Content-Type` 为 `application/xml`。
返回结果也是 XML 格式,需要使用 Python 的 `xml.etree.ElementTree` 模块进行解析。如果请求成功,可以从返回结果中获取预支付交易会话标识 prepay_id,并根据官方文档构造支付参数用于前端调起微信支付。如果请求失败,可以从返回结果中获取错误码和错误信息。
阅读全文