背景
开发的小程序产品,在后台管理页中有个会员套餐开通,想接入微信支付。
前提:
- 已经有服务号
- 开通好了微信支付商户平台 微信支付
- 小程序-支付与交易-微信支付-关联了这个商户号
使用微信支付公钥模式,不推荐用平台证书了。
接入
一、先检查商户平台
登录微信支付商户平台,确认:
- 产品中心 -> Native支付 已开通,小程序已关联商户号,不代表 Native 支付权限已经开通,需要单独确认。Native 支付接入准备
- 产品中心/账户中心 -> AppID绑定 中,当前小程序 AppID 状态为已绑定。
- 这个商户号是“普通商户号”
二、找到密钥等参数
- 商户号 mchid
- API v3 密钥 (在商户平台的 API 安全中找,已经生成过的,别去重新生成)
- 有效的商户 API 证书
- 商户 API 证书私钥
- 微信支付验签公钥或平台证书

三、系统环境变量填写
一般是这几个参数:
# 获取位置:微信公众平台 -> 开发与服务 -> 开发管理 -> 开发设置 -> AppID。
PAY_APPID =
# 微信支付商户号 mchid,不是小程序 AppID;同一普通商户号可以服务多个已绑定的 AppID。
# 获取位置:微信支付商户平台 -> 账户中心 -> 商户信息 -> 商户号。
PAY_MCH_ID =
# 商户 API 证书序列号 serial_no;必须与 PAY_MERCHANT_PRIVATE_KEY_PATH 对应的商户证书为同一套。
# 获取方式:微信支付商户平台查看,或执行 openssl x509 -in apiclient_cert.pem -noout -serial 后取 serial= 后的值。
# 注意:这里不是微信支付平台证书序列号,也不是微信支付公钥 ID。
PAY_MERCHANT_SERIAL_NO =
# 商户 API 证书私钥 apiclient_key.pem 的绝对路径,用于给 API v3 请求签名。
# 文件应放在 public/storage 和 Git 仓库之外,并确保 PHP 运行用户或容器可读取;不要填写 apiclient_cert.pem。
PAY_MERCHANT_PRIVATE_KEY_PATH =
# 微信支付公钥 ID,优先验签模式使用;获取位置:微信支付商户平台 -> 账户中心 -> API安全 -> 微信支付公钥 -> 管理公钥。
# 必须与 PAY_PUBLIC_KEY_PATH 中的公钥文件对应;不要填写商户 API 证书序列号。
PAY_PUBLIC_KEY_ID =
# 微信支付公钥 wxpay_pub.pem 的绝对路径,优先用于验证微信 API 应答及支付回调签名。
# 公钥模式下 PAY_PUBLIC_KEY_ID 与 PAY_PUBLIC_KEY_PATH 必须同时配置;文件应放在 public/storage 和 Git 仓库之外。
PAY_PUBLIC_KEY_PATH =注意几点:
- PAY_MERCHANT_SERIAL_NO 必须和 apiclient_key.pem 属于同一套商户 API 证书。
- PAY_PUBLIC_KEY_ID 必须和 PAY_PUBLIC_KEY_PATH 中的公钥文件匹配。
- 不要因为接入新项目重新生成或重置 API v3 Key,否则旧项目可能无法解密支付回调。
- 如果两个项目运行在不同服务器,可以复制证书文件,但必须通过安全方式传输,并限制文件权限。
- 如果微信支付正在更换商户证书或公钥,需要两个项目同时更新,避免一个项目验签失败。
- 两个小程序都必须在微信支付商户平台完成 AppID 绑定。
其中 PAY_MCH_ID、PAY_MERCHANT_SERIAL_NO 、PAY_MERCHANT_PRIVATE_KEY_PATH 、PAY_PUBLIC_KEY_ID 、PAY_PUBLIC_KEY_PATH 这些变量如果是同一个商户号mchid,那可以是多个项目共用同一个