二维码收款系统接入微信支付API配置详解及常见问题排查

我们以某知名二维码收款系统为例,详细说明其接入微信支付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接口
  • 浏览器开发者工具:用于检查网络请求
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。