首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Day | 08【苍穹外卖:微信支付模块功能全流程解析,避坑指南】

Day | 08【苍穹外卖:微信支付模块功能全流程解析,避坑指南】

作者头像
北极的代码
发布2026-04-22 16:45:57
发布2026-04-22 16:45:57
1060
举报
前言

最近在项目中集成了微信支付功能,本以为是个常规操作,结果踩了一路的坑。从商户号配置到回调验签,从统一下单到异步通知,每一个环节都可能藏着意想不到的问题。

花了三天时间把整个流程跑通后,决定把这套完整的微信支付接入流程和踩过的坑整理出来,希望能帮助正在接入或准备接入微信支付的朋友少走弯路。

一、整体流程概览

微信支付的核心流程并不复杂,但细节决定成败:

text

代码语言:javascript
复制
用户 -> 商户系统(统一下单) -> 微信支付API -> 返回预支付交易ID
用户 -> 调起支付(唤起微信) -> 输入密码 -> 支付完成
微信支付服务器 -> 异步通知(回调) -> 商户系统更新订单状态

涉及三个核心角色:用户、商户系统、微信支付服务器。

二、接入前准备(坑点密集区)

2.1 商户号配置

坑点1:APIv3密钥与APIv2密钥混淆

微信支付现在主推APIv3,但很多老文档和教程还在用v2的配置方式。两者密钥是独立的,必须区分清楚。

bash

代码语言:javascript
复制
# 错误做法:只配置了APIv2密钥,却用v3的接口调用
# 正确做法:根据你使用的API版本,配置对应的密钥

APIv3密钥需要登录商户平台 -> 账户中心 -> API安全 -> 设置APIv3密钥

坑点2:商户证书文件权限问题

bash

代码语言:javascript
复制
# Linux服务器上证书文件权限必须设置为600
chmod 600 /path/to/apiclient_key.pem
# 如果权限过宽(如644),微信支付接口会返回证书验证失败
2.2 微信支付V3接口参数结构
代码语言:javascript
复制
javascript

// 统一下单请求参数示例
{
  appid: 'wx1234567890abcdef',     // 小程序/公众号的AppID
  mchid: '1230000109',              // 商户号
  description: '测试商品',           // 商品描述
  out_trade_no: 'ORDER202312010001', // 商户订单号(唯一)
  notify_url: 'https://yourdomain.com/api/wxpay/callback', // 回调地址
  amount: {
    total: 100,                     // 单位:分
    currency: 'CNY'
  },
  payer: {
    openid: 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o' // 用户openid
  }
}

三、统一下单接口(核心环节)

3.1 签名生成机制

微信支付V3的签名流程:

代码语言:javascript
复制
javascript

const crypto = require('crypto');

// 构建待签名字符串
function buildSignatureString(method, url, timestamp, nonceStr, body) {
  let signatureString = `${method}\n${url}\n${timestamp}\n${nonceStr}\n`;
  if (body) {
    signatureString += `${body}\n`;
  } else {
    signatureString += '\n';
  }
  return signatureString;
}

// 生成签名
function generateSignature(privateKey, signatureString) {
  const sign = crypto.createSign('SHA256');
  sign.update(signatureString);
  sign.end();
  return sign.sign(privateKey, 'base64');
}

坑点3:URL路径必须完整且不带查询参数

代码语言:javascript
复制
javascript

// 错误
url = '/v3/pay/transactions/jsapi?key=value' 

// 正确
url = '/v3/pay/transactions/jsapi'

坑点4:签名时间戳必须是10位数字

代码语言:javascript
复制
javascript

// 错误
const timestamp = Date.now();  // 返回13位毫秒时间戳

// 正确
const timestamp = Math.floor(Date.now() / 1000);
3.2 完整调用代码
代码语言:javascript
复制
javascript

const axios = require('axios');
const fs = require('fs');

async function createOrder(orderParams) {
  const mchid = 'your_mchid';
  const serialNo = 'your_cert_serial_no';  // 证书序列号
  const privateKey = fs.readFileSync('apiclient_key.pem');
  
  const url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi';
  const method = 'POST';
  const timestamp = Math.floor(Date.now() / 1000);
  const nonceStr = generateNonceStr();
  const body = JSON.stringify(orderParams);
  
  // 生成签名
  const signatureString = `${method}\n/v3/pay/transactions/jsapi\n${timestamp}\n${nonceStr}\n${body}\n`;
  const signature = generateSignature(privateKey, signatureString);
  
  // 构建Authorization头
  const auth = `WECHATPAY2-SHA256-RSA2048 mchid="${mchid}",nonce_str="${nonceStr}",timestamp="${timestamp}",serial_no="${serialNo}",signature="${signature}"`;
  
  try {
    const response = await axios.post(url, orderParams, {
      headers: {
        'Authorization': auth,
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'User-Agent': 'your-app-name'
      }
    });
    return response.data;
  } catch (error) {
    console.error('统一下单失败:', error.response?.data);
    throw error;
  }
}

坑点5:User-Agent不能为空

微信支付API要求必须携带User-Agent头,否则会返回MISSING_USER_AGENT错误。

四、回调通知处理(安全重灾区)

4.1 回调验签流程
代码语言:javascript
复制
javascript

const crypto = require('crypto');

// 验签核心函数
function verifySignature(platformCert, headers, body) {
  const signature = headers['wechatpay-signature'];
  const timestamp = headers['wechatpay-timestamp'];
  const nonce = headers['wechatpay-nonce'];
  const serialNo = headers['wechatpay-serial'];
  
  // 构建验签串
  const signString = `${timestamp}\n${nonce}\n${body}\n`;
  
  // 使用微信平台证书公钥验证
  const verify = crypto.createVerify('SHA256');
  verify.update(signString);
  verify.end();
  
  return verify.verify(platformCert, signature, 'base64');
}

坑点6:回调body是密文,需要解密

很多开发者直接使用回调body,但实际上微信返回的是加密数据:

代码语言:javascript
复制
javascript

// 回调收到的数据结构
{
  resource: {
    ciphertext: '加密后的数据',
    associated_data: '',
    nonce: '随机串',
    algorithm: 'AEAD_AES_256_GCM'
  }
}

// 需要先解密
function decryptResource(apiV3Key, ciphertext, nonce, associatedData) {
  const decipher = crypto.createDecipheriv(
    'aes-256-gcm',
    apiV3Key,        // APIv3密钥,32字节
    nonce
  );
  decipher.setAuthTag(Buffer.from(associatedData, 'utf8'));
  
  let decrypted = decipher.update(ciphertext, 'base64', 'utf8');
  decrypted += decipher.final('utf8');
  
  return JSON.parse(decrypted);
}

// 解密后得到真实数据
{
  appid: 'wx...',
  mchid: '123...',
  out_trade_no: 'ORDER202312010001',
  transaction_id: '4200001234567890',
  trade_state: 'SUCCESS',
  amount: { total: 100, currency: 'CNY' }
}

坑点7:回调验签时机错误

代码语言:javascript
复制
javascript

// 错误做法:先解密再验签
const decryptedData = decrypt(data);  // 直接用密文解密
verifySignature(platformCert, headers, body);  // 验签应该在解密前

// 正确做法:先验签再解密
if (verifySignature(platformCert, headers, JSON.stringify(requestBody))) {
  const decryptedData = decryptResource(apiV3Key, ...);
  // 处理业务逻辑
} else {
  // 签名验证失败,返回错误
}
4.2 回调幂等性处理

坑点8:没有做幂等性处理导致重复入账

微信会重试回调(最多15次),如果不做幂等性处理,同一笔订单可能被多次处理:

代码语言:javascript
复制
javascript

async function handleCallback(decryptedData) {
  const { out_trade_no, transaction_id, trade_state } = decryptedData;
  
  // 使用分布式锁或数据库唯一索引保证幂等
  const lockKey = `wxpay:callback:${out_trade_no}`;
  
  try {
    // 尝试获取锁(可使用Redis)
    const locked = await redis.setnx(lockKey, '1', 'EX', 60);
    if (!locked) {
      return { code: 'SUCCESS', message: '处理中' };
    }
    
    // 检查订单是否已处理
    const order = await db.getOrder(out_trade_no);
    if (order.status === 'PAID') {
      return { code: 'SUCCESS', message: '已处理' };
    }
    
    // 更新订单状态
    await db.updateOrder(out_trade_no, {
      status: 'PAID',
      transaction_id: transaction_id,
      paid_at: new Date()
    });
    
    // 后续业务逻辑(发货、积分等)
    
    return { code: 'SUCCESS', message: 'OK' };
  } finally {
    await redis.del(lockKey);
  }
}
4.3 回调响应格式

微信要求回调响应必须是特定格式:

代码语言:javascript
复制
javascript

// 成功响应
{
  code: 'SUCCESS',
  message: '成功'
}

// 失败响应(微信会重试)
{
  code: 'FAIL',
  message: '失败原因'
}

注意:返回HTTP状态码200才表示接收成功,返回其他状态码微信会认为失败并重试。

五、前端调起支付

5.1 小程序端调起
代码语言:javascript
复制
javascript

// 后端返回prepay_id后,前端调用
wx.requestPayment({
  timeStamp: res.data.timeStamp,      // 注意是字符串
  nonceStr: res.data.nonceStr,
  package: res.data.package,           // 格式:prepay_id=xxx
  signType: 'RSA',                     // 注意:V3用RSA
  paySign: res.data.paySign,
  success: (result) => {
    console.log('支付成功', result);
    // 注意:此时只是用户输入密码成功,最终结果需要以回调为准
  },
  fail: (error) => {
    console.log('支付失败', error);
  }
});

坑点9:timeStamp必须是字符串类型

javascript

代码语言:javascript
复制
// 错误
timeStamp: 1640995200  // number类型

// 正确
timeStamp: '1640995200'  // string类型

坑点10:package参数必须包含prepay_id=前缀

javascript

代码语言:javascript
复制
// 错误
package: 'wx202312010001234567890'

// 正确
package: 'prepay_id=wx202312010001234567890'
5.2 APP端调起

APP端需要额外配置Universal Links(iOS)和AppID配置(Android):

javascript

代码语言:javascript
复制
// iOS Universal Links配置
// 需要在微信商户平台配置Universal Links地址
// 并在xcode中配置Associated Domains

// Android配置
// 需要在微信开放平台填写应用签名和应用包名
// 签名必须与打包签名一致

坑点11:iOS Universal Links验证失败

常见原因:

  1. apple-app-site-association文件未上传到服务器根目录或.well-known目录
  2. 文件Content-Type不是application/json
  3. Universal Links地址未在微信商户平台配置
  4. 应用未正确配置Associated Domains

六、常见错误码解析

错误码

含义

解决方案

PARAM_ERROR

参数错误

检查必填参数是否完整,参数格式是否正确

NO_AUTH

无权限

检查商户号是否开通对应产品权限

NOT_ENOUGH

余额不足

商户号余额不足,需要充值

ORDERPAID

订单已支付

订单号重复且已支付,使用新订单号

NO_PAY_AUTH

无支付权限

检查appid和商户号是否绑定

SYSTEMERROR

系统错误

稍后重试

MCH_NOT_EXISTS

商户号不存在

检查商户号是否正确

APPID_NOT_EXIST

AppID不存在

检查appid是否正确,是否与商户号绑定

七、调试技巧

7.1 使用微信支付沙箱环境

javascript

代码语言:javascript
复制
// 沙箱环境地址
const sandboxUrl = 'https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey';

// 注意:沙箱环境使用的是APIv2签名,参数名大小写敏感

坑点12:沙箱环境和正式环境签名方式不同

沙箱环境是APIv2签名,参数名首字母大写,签名方式也完全不同,建议直接使用正式环境的小额测试。

7.2 日志记录要点
代码语言:javascript
复制
javascript

// 关键节点必须记录日志
const logPayInfo = {
  timestamp: new Date().toISOString(),
  out_trade_no: orderNo,
  action: 'unified_order',
  request: maskedRequest,  // 脱敏后的请求参数
  response: maskedResponse, // 脱敏后的响应
  cost_time: Date.now() - startTime
};

// 记录签名信息(不要记录完整私钥)
const signLog = {
  timestamp,
  method,
  url,
  sign_string: signString,  // 便于排查签名问题
  auth_header: auth.substring(0, 50) + '...'
};

八、安全建议

  1. APIv3密钥存储:不要硬编码在代码中,使用配置中心或环境变量
  2. 商户证书:定期轮换,妥善保管私钥文件
  3. 回调验签:必须验证签名,防止伪造回调
  4. 金额校验:回调中确认金额与订单一致
  5. 重放攻击:使用时间戳+nonce防止重放

九、完整示例项目结构

text

代码语言:javascript
复制
wxpay-demo/
├── config/
│   └── wxpay.js          # 微信支付配置
├── utils/
│   ├── sign.js           # 签名工具
│   ├── crypto.js         # 加解密工具
│   └── logger.js         # 日志工具
├── services/
│   ├── order.js          # 订单服务
│   └── wxpay.js          # 微信支付服务
├── controllers/
│   ├── payController.js  # 支付控制器
│   └── callbackController.js # 回调控制器
├── certs/
│   ├── apiclient_cert.pem
│   └── apiclient_key.pem # 注意gitignore
└── app.js

(补充)局域网开发与临时域名配置(微信支付本地调试)

10.1 为什么需要公网域名?

微信支付的回调机制要求:

  • notify_url 必须是公网可访问的域名或IP
  • 不能使用 localhost127.0.0.1192.168.x.x 等内网地址
  • 必须是 http://https://(生产环境强制 https

text

代码语言:javascript
复制
❌ 错误示例:
http://localhost:3000/api/wxpay/callback
http://127.0.0.1:3000/api/wxpay/callback
http://192.168.1.100:3000/api/wxpay/callback

✅ 正确示例:
https://yourdomain.com/api/wxpay/callback
https://abc.ngrok.io/api/wxpay/callback
10.2 本地调试方案对比

方案

优点

缺点

适用场景

内网穿透工具

配置简单,免费

域名随机,速度受限

个人开发调试

反向代理+公网服务器

稳定可控

需要服务器,配置复杂

团队协作/生产预演

微信支付沙箱

官方支持

功能有限,签名不同

基础功能测试

修改hosts+本地域名

无需外网

微信服务器无法访问

仅前端调试

10.3 内网穿透工具详解(推荐方案)
方案1:ngrok(最流行)

bash

代码语言:javascript
复制
# 1. 下载ngrok
# https://ngrok.com/download

# 2. 注册获取auth token
ngrok config add-authtoken your_token

# 3. 暴露本地服务(假设本地端口3000)
ngrok http 3000

# 输出示例:
# Forwarding  https://abc123.ngrok.io -> http://localhost:3000

坑点13:ngrok免费版域名随机,每次重启都会变

解决方案:

javascript

代码语言:javascript
复制
// 动态获取回调地址
const getNotifyUrl = () => {
  if (process.env.NODE_ENV === 'development') {
    // 从环境变量读取当前ngrok地址
    return process.env.NGROK_URL + '/api/wxpay/callback';
  }
  return 'https://production.com/api/wxpay/callback';
};
方案2:natapp(国内推荐)

bash

代码语言:javascript
复制
# 1. 注册购买隧道(免费版有域名)
# https://natapp.cn/

# 2. 下载客户端并配置config.ini
# authtoken=你的隧道token

# 3. 启动
./natapp

优点:国内访问速度快,域名相对稳定

方案3:localtunnel(零配置)

bash

代码语言:javascript
复制
# 全局安装
npm install -g localtunnel

# 启动(自动分配域名)
lt --port 3000

# 指定子域名
lt --port 3000 --subdomain myapp

# 输出:
# your url is: https://myapp.loca.lt
10.4 局域网真机调试方案

在开发微信小程序或APP时,可能需要手机访问本地服务:

方案1:局域网IP + 手机代理

bash

代码语言:javascript
复制
# 1. 查看本机局域网IP(Mac/Linux)
ifconfig | grep inet

# Windows
ipconfig

# 2. 启动服务监听所有网卡
# Express示例
app.listen(3000, '0.0.0.0', () => {
  console.log('Server running on http://0.0.0.0:3000');
});

# 3. 手机访问 http://192.168.1.100:3000

坑点14:手机无法访问本地服务

常见原因:

  • 防火墙未关闭或未放行端口
  • 手机和电脑不在同一WiFi
  • 服务绑定在127.0.0.1而非0.0.0.0

bash

代码语言:javascript
复制
# Mac关闭防火墙
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off

# 或仅放行Node端口
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/local/bin/node
方案2:使用Whistle代理(推荐)

Whistle是一个强大的代理调试工具,可以解决微信支付本地调试的很多痛点:

bash

代码语言:javascript
复制
# 1. 安装whistle
npm install -g whistle

# 2. 启动whistle
w2 start

# 3. 配置代理规则
# 将微信回调域名代理到本地
yourdomain.com 127.0.0.1:3000

# 4. 手机设置代理(WiFi设置中)
# 代理服务器:电脑IP
# 端口:8899

优势

  • 可以拦截和修改请求
  • 支持HTTPS转发
  • 可以查看完整的请求响应日志
10.5 公网服务器转发方案

如果有云服务器,可以搭建一个转发服务:

代码语言:javascript
复制
javascript

// 转发服务器代码(部署在公网服务器)
const express = require('express');
const axios = require('axios');
const app = express();

app.use(express.json());

// 转发回调到本地
app.post('/proxy/wxpay/callback', async (req, res) => {
  const localUrl = 'http://你的电脑公网IP或内网穿透地址:3000/api/wxpay/callback';
  
  try {
    const response = await axios.post(localUrl, req.body, {
      headers: req.headers
    });
    res.status(response.status).send(response.data);
  } catch (error) {
    res.status(500).send('转发失败');
  }
});

app.listen(8080);

配置微信回调地址

text

代码语言:javascript
复制
https://your-server.com/proxy/wxpay/callback
10.6 微信支付开发环境完整配置示例
代码语言:javascript
复制
javascript

// config/wxpay.js
const env = process.env.NODE_ENV;

// 回调地址配置
const getNotifyUrl = () => {
  const baseUrl = {
    development: process.env.DEV_CALLBACK_URL || 'https://abc123.ngrok.io',
    test: 'https://test.yourdomain.com',
    production: 'https://api.yourdomain.com'
  };
  
  return `${baseUrl[env]}/api/wxpay/callback`;
};

// 商户配置
const wxpayConfig = {
  appid: process.env.WX_APPID,
  mchid: process.env.WX_MCHID,
  apiV3Key: process.env.WX_API_V3_KEY,
  privateKey: fs.readFileSync(process.env.WX_PRIVATE_KEY_PATH),
  serialNo: process.env.WX_CERT_SERIAL_NO,
  notifyUrl: getNotifyUrl(),
  
  // 开发环境特殊配置
  ...(env === 'development' && {
    // 允许使用http(仅开发环境)
    allowHttp: true,
    // 增加超时时间
    timeout: 30000,
    // 开启详细日志
    debug: true
  })
};

module.exports = wxpayConfig;
10.7 本地调试完整流程
代码语言:javascript
复制
bash

# 1. 启动本地服务
npm run dev
# Server running on http://localhost:3000

# 2. 启动内网穿透
ngrok http 3000
# Forwarding https://abc123.ngrok.io -> http://localhost:3000

# 3. 更新环境变量
export DEV_CALLBACK_URL=https://abc123.ngrok.io

# 4. 发起支付请求(使用ngrok地址)
curl -X POST https://abc123.ngrok.io/api/wxpay/create \
  -H "Content-Type: application/json" \
  -d '{"amount": 1, "description": "测试"}'

# 5. 查看回调日志
# 微信服务器会回调 https://abc123.ngrok.io/api/wxpay/callback
# 本地终端可以看到请求日志
10.8 HTTPS证书问题

微信支付强制要求生产环境使用HTTPS,本地调试时需要注意:

坑点15:ngrok等工具提供的HTTPS证书不被信任

代码语言:javascript
复制
javascript

// 临时解决方案:开发环境跳过证书验证(仅用于调试)
const https = require('https');

const agent = new https.Agent({
  rejectUnauthorized: false  // 仅开发环境!
});

const response = await axios.post(url, data, {
  httpsAgent: agent
});

更好的方案:使用本地自签名证书

代码语言:javascript
复制
bash

# 1. 生成自签名证书
openssl req -x509 -newkey rsa:2048 -nodes \
  -keyout localhost.key \
  -out localhost.crt \
  -days 365 \
  -subj "/CN=localhost"

# 2. 启动HTTPS服务
const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('./localhost.key'),
  cert: fs.readFileSync('./localhost.crt')
};

https.createServer(options, app).listen(3000);
10.9 调试工具推荐

工具

用途

特点

Postman

接口测试

支持微信签名生成

Charles

抓包分析

可查看HTTPS请求

Whistle

代理调试

支持请求转发和mock

ngrok Web UI

查看回调

http://localhost:4040 查看请求详情

10.10 常见问题排查清单
代码语言:javascript
复制
bash

# 1. 检查本地服务是否可访问
curl http://localhost:3000/health

# 2. 检查内网穿透是否正常
curl https://abc123.ngrok.io/health
# 应该返回和本地相同的结果

# 3. 检查回调地址是否在微信支付配置中正确设置
# 登录微信商户平台 -> 产品中心 -> 开发配置 -> 支付回调URL

# 4. 查看ngrok请求日志
# 访问 http://localhost:4040 查看所有请求详情

# 5. 检查防火墙
# Mac: 系统偏好设置 -> 安全性与隐私 -> 防火墙
# Windows: 控制面板 -> Windows Defender防火墙
10.11 最佳实践总结
  1. 开发环境:使用ngrok/localtunnel快速获取公网域名
  2. 测试环境:部署到测试服务器,使用正式域名
  3. 生产环境:必须使用HTTPS,配置反向代理(Nginx)
  4. 团队协作
    • 每人使用自己的ngrok隧道
    • 或搭建统一的测试服务器,通过路径区分

nginx

代码语言:javascript
复制
# Nginx配置示例(测试服务器)
server {
    listen 80;
    server_name test.yourdomain.com;
    
    location /api/wxpay/callback/ {
        # 根据URL路径转发到不同开发者的本地服务
        # /api/wxpay/callback/zhangsan -> 192.168.1.100:3000
        # /api/wxpay/callback/lisi -> 192.168.1.101:3000
        rewrite ^/api/wxpay/callback/(.+?)/(.*)$ /$2 break;
        proxy_pass http://$1:3000;
        proxy_set_header Host $host;
    }
}
  1. 环境变量管理
代码语言:javascript
复制
bash

# .env.development
WX_NOTIFY_URL=https://${NGROK_SUBDOMAIN}.ngrok.io/api/wxpay/callback
NGROK_SUBDOMAIN=myapp-dev

# .env.production
WX_NOTIFY_URL=https://api.yourdomain.com/api/wxpay/callback

总结

微信支付本地调试最大的难点就是回调地址必须是公网可访问。通过内网穿透工具(ngrok/natapp/localtunnel)可以很好地解决这个问题。结合代理工具(Whistle/Charles)还能进一步调试HTTPS请求。

记住这几个关键点:

  • ✅ 开发环境使用ngrok获取临时公网域名
  • ✅ 回调地址配置在环境变量中,方便切换
  • ✅ 使用Whistle可以拦截和查看回调请求
  • ✅ 本地服务监听 0.0.0.0 允许外部访问
  • ✅ 生产环境必须使用HTTPS和正式域名

结语

微信支付接入看似简单,但涉及证书、签名、加解密、回调验签等多个技术点,每一个环节都可能成为拦路虎。本文总结的12个坑点是我亲身经历的血泪教训,希望能帮你避开这些问题。

最后提醒一句:永远不要信任前端传来的任何支付状态,一切以微信服务器的异步回调为准。

如果对你有帮助,请点赞,关注,收藏,你的支持就是我最大的鼓励!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、整体流程概览
  • 二、接入前准备(坑点密集区)
    • 2.1 商户号配置
    • 2.2 微信支付V3接口参数结构
  • 三、统一下单接口(核心环节)
    • 3.1 签名生成机制
    • 3.2 完整调用代码
  • 四、回调通知处理(安全重灾区)
    • 4.1 回调验签流程
    • 4.2 回调幂等性处理
    • 4.3 回调响应格式
  • 五、前端调起支付
    • 5.1 小程序端调起
    • 5.2 APP端调起
  • 六、常见错误码解析
  • 七、调试技巧
    • 7.1 使用微信支付沙箱环境
    • 7.2 日志记录要点
  • 八、安全建议
  • 九、完整示例项目结构
  • (补充)局域网开发与临时域名配置(微信支付本地调试)
    • 10.1 为什么需要公网域名?
    • 10.2 本地调试方案对比
    • 10.3 内网穿透工具详解(推荐方案)
      • 方案1:ngrok(最流行)
      • 方案2:natapp(国内推荐)
      • 方案3:localtunnel(零配置)
    • 10.4 局域网真机调试方案
      • 方案1:局域网IP + 手机代理
      • 方案2:使用Whistle代理(推荐)
    • 10.5 公网服务器转发方案
    • 10.6 微信支付开发环境完整配置示例
    • 10.7 本地调试完整流程
    • 10.8 HTTPS证书问题
    • 10.9 调试工具推荐
    • 10.10 常见问题排查清单
    • 10.11 最佳实践总结
  • 总结
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档