微信小程序支付必须先开通商户号并配置apiv3密钥与平台证书,否则统一下单接口调用失败;常见401或签名错误源于密钥非apiv3格式、证书未部署或时间不同步;后端需用aead_aes_256_gcm签名、生成合法prepay_id及package,前端调用wx.requestpayment传入正确参数;回调须验签、解密、查单并幂等处理;沙箱环境需独立配置商户号、密钥和证书。

微信小程序支付必须先开通商户号和获取 APIv3 密钥
没开通微信支付商户平台的小程序,连 统一下单 接口都调不通。重点不是写 PHP 代码,而是配置——很多开发者卡在 401 Unauthorized 或 {"errcode":40163,"errmsg":"invalid signature"},本质是签名失败,根源常出在密钥或证书上。
- 必须用「APIv3 密钥」(32位随机字符串),不是旧版 APIv2 的 key;在商户平台「账户中心 → API安全」里设置
- 必须下载并部署「微信支付平台证书」(
apiclient_cert.pem和apiclient_key.pem),PHP cURL 调用/v3/pay/transactions/jsapi时需用curl_setopt($ch, CURLOPT_SSLCERT, ...)和CURLOPT_SSLKEY - 确保服务器时间与 NTP 同步,签名里的
timestamp偏差超过 5 分钟会直接被拒
PHP 调用 /v3/pay/transactions/jsapi 生成 prepay_id 是核心步骤
小程序前端调 wx.requestPayment 必须传一个合法的 timeStamp、nonceStr、package、signType 和 paySign,这些全由后端生成。PHP 这边不能只拼参数,得走标准签名流程。
- 请求体必须是 JSON 格式,且
amount单位为分(整数),description不能含敏感词,notify_url必须是 HTTPS 且能被微信服务器访问到 - 签名用的是 AEAD_AES_256_GCM 算法,不是 MD5 或 HMAC-SHA256;PHP 需用 openssl_encrypt + 构造 AAD 头部,推荐直接用官方 SDK(
wechatpay-php)避免手撸出错 -
package字段值固定为prepay_id=开头的字符串,不是整个下单响应体;漏掉prepay_id=前缀会导致前端报requestPayment:fail invalid parameter
回调通知(notify_url)必须验签 + 幂等处理 + 主动查单
微信不会重试失败的回调,也不保证只发一次。只靠接收通知就更新订单状态,线上大概率出现「用户付了钱但系统没记账」。
Codapp 外卖点餐系统是一款专为快餐店、奶茶店、咖啡店、糕点店等商户打造的移动点餐解决方案,支持自提与外卖两种模式,可快速部署上线使用。 该系统支持微信、支付宝支付,并接入腾讯地图与百度地图,支持第三方配送(如达达)与商家自主配送,助力门店实现智能点单与订单管理。 功能特点: 微信小程序&H5移动端双端点餐:无需下载 App,直接扫码下单 支持多门店管理:一套系统可管理多家门
- 收到通知后第一件事是用
wechatpay-php的Notification::parse()验证签名和解密响应体,未通过则直接返回 200(微信要求),不执行后续逻辑 - 解析出的
resource是加密数据,必须用平台证书私钥解密才能拿到out_trade_no和transaction_id - 哪怕验签成功,也要用
/v3/pay/transactions/id/{transaction_id}?mchid=xxx主动查单确认真实支付状态,防止伪造通知;同时检查本地订单是否已处理过(用out_trade_no做唯一索引)
沙箱环境调试失败?先确认是否用了沙箱商户号和沙箱证书
很多人把生产密钥和证书直接丢进沙箱跑,结果一直 401 或 422。沙箱不是“开关”,是一套独立环境。
立即学习“PHP免费学习笔记(深入)”;
- 沙箱接口地址是
https://api.mch.weixin.qq.com/v3/sandbox/...,不是生产地址加/sandbox - 沙箱商户号、APIv3 密钥、平台证书全部要单独申请,且证书有效期仅 30 天;过期后调用会返回
{"code":"PARAM_ERROR","message":"cert expired"} - 沙箱下单时
scene_info.device_id必须填(模拟真实设备),否则返回"device_id is empty";而生产环境这个字段可选










