
我们以某知名二维码收款系统为例,详细说明其接入微信支付api的配置流程,并针对开发过程中常见的错误进行故障排查。
准备工作与API密钥获取
在开始配置之前,需要准备以下材料:
材料 | 说明 |
---|---|
微信公众号ID | 用于在微信支付商户后台关联 |
商户号 | 微信支付分配的唯一商户标识 |
API密钥(密钥key) | 用于签名验证,可在商户后台生成 |
API接口地址 | 微信支付提供的基础请求URL |
这些信息均可在微信公众号后台的微信支付管理中找到或生成。
微信支付API基础配置代码实现
以下为接入微信支付调起支付接口的JavaScript代码实现:
const wechatPayConfig = {
appId: 'wx2421b1c4370ec43b',
mchId: '10000100',
timeStamp: '20211231000000',
nonceStr: 'EC1C6D41B9A9F3F5',
package: 'prepay_id=u802345jgfjsdfgsdg888',
signType: 'MD5',
paySign: 'B552ED6B279343CB493C5DD0D78AB241'
};
其中关键参数说明:
- appId:微信公众号ID
- mchId:商户号
- timeStamp:时间戳
- nonceStr:随机字符串
- package:支付包信息
- signType:签名类型
- paySign:签名值
签名算法实现(MD5)
微信支付签名采用MD5算法,以下是签名实现代码:
function createSign(obj) {
const keys = Object.keys(obj).sort();
let stringA = '';
keys.forEach(key => {
stringA += key + '=' + obj[key] + '&';
});
stringA = stringA.substr(0, stringA.length - 1);
stringA += '&key=' + 'API密钥';
const sign = md5(stringA).toUpperCase();
return sign;
}
注意:实际开发中需要引入md5加密库,并确保参数按字典序排序。
常见错误代码排查与解决
错误代码40001:签名无效
解决方法:
- 检查签名算法是否正确实现
- 确认所有参数(特别是timeStamp和nonceStr)是否已正确传递
- 确保参数按字典序排序
- 检查API密钥是否输入正确
错误代码40002:参数格式错误
解决方法:
- 确认所有参数类型是否正确(如timeStamp应为字符串格式)
- 检查参数是否缺失
- 确保appId和mchId格式正确
错误代码60001:未注册商户
解决方法:
- 检查商户号是否已注册并激活
- 确认商户状态是否正常
- 联系微信支付客服确认是否为账户异常
接口调用完整流程
以下是完整的微信支付调起流程示例:
function pay() {
// 获取用户openid
wx.getUserProfile({
success: res => {
const openid = res.userInfo.openid;
// 构建支付参数
const payData = {
body: '订单支付',
out_trade_no: '20210101001',
total_fee: 1000,
trade_type: 'JSAPI',
openid: openid
};
// 调用统一下单接口
wx.request({
url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
method: 'POST',
data: payData,
success: res => {
if (res.result_code === 'SUCCESS' && res.return_code === 'SUCCESS') {
// 构建支付参数
const payParams = {
appId: wechatPayConfig.appId,
timeStamp: wechatPayConfig.timeStamp,
nonceStr: wechatPayConfig.nonceStr,
package: wechatPayConfig.package,
signType: wechatPayConfig.signType,
paySign: wechatPayConfig.paySign
};
// 调起支付
wx.requestPayment({
...payParams,
success: () => {
console.log('支付成功');
},
fail: () => {
console.log('支付失败');
}
});
} else {
console.error('下单失败', res);
}
},
fail: () => {
console.error('请求异常');
}
});
},
fail: () => {
console.error('获取用户信息失败');
}
});
}
系统参数配置
在二维码收款系统中,需要配置以下参数:
wechat_pay:
app_id: "wx2421b1c4370ec43b"
mch_id: "10000100"
api_key: "B552ED6B279343CB493C5DD0D78AB241"
notify_url: "https://example.com/pay/notify"
trade_type: "JSAPI"
其中notify_url为支付通知地址,系统会通过POST方式将支付结果发送到此地址。
支付通知处理
以下是标准的支付通知处理代码:
from flask import request, jsonify
import hashlib
@app.route('/pay/notify', methods=['POST'])
def wechat_pay_notify():
data = request.form.to_dict()
sign = data.pop('sign')
sign_str = '&'.join([f"{k}={v}" for k, v in sorted(data.items())]) + f"&key={wechat_pay['api_key']}"
calc_sign = hashlib.md5(sign_str.encode()).hexdigest().upper()
if sign == calc_sign:
商户号
mch_id = data.get('mch_id')
随机字符串
nonce_str = data.get('nonce_str')
签名
pay_sign = data.get('sign')
交易状态
trade_state = data.get('trade_state')
if trade_state == 'SUCCESS':
更新订单状态
update_order_status(data.get('out_trade_no'), 'paid')
return '', 200
return '', 200
return '', 500
注意:接收通知后必须返回成功响应(状态码200),否则微信会重复发送通知。
调试工具使用
推荐使用以下工具进行调试:
- 微信沙箱环境:用于测试支付流程
- Postman:用于测试API接口
- 浏览器开发者工具:用于检查网络请求
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。