让小程序能收钱,其实就五件事。按顺序做,半天到两天能跑通。前提:你有认证过的小程序(公司或个体户资质)、服务器域名备案好了。

1. 开通权限 & 配密钥
• 动作:小程序后台点“微信支付”→“接入”,按指引填企业资料、对公账户(微信会打几分钱验证)。成功后邮箱会收到商户号和平台账号。

• 动作:登录商户平台(pay.weixin.qq.com),在“API安全”里设置API密钥(32位字母/数字)。这个密钥和商户号、小程序AppID是服务器通信的“身份证”,绝不能泄露。

• 动作:回到商户平台“开发配置”,添加支付授权目录(例如https://你的域名.com/pay/)。这个目录要精确到你服务器端创建订单的接口文件所在目录。

2. 后端:用订单号换预付单
• 核心:你的服务器收到前端支付请求后,生成一个唯一订单号,调用微信接口用这个订单号换一个用于支付的prepay_id。

• 动作:后端拼接参数(小程序AppID、商户号mch_id、订单号、金额(分)、商品描述、用户openid、回调地址notify_url),用API密钥生成签名。关键步骤:

◦ 签名:将所有参数按字典序排序拼接成字符串A,末尾加上&key=你的API密钥,对整体字符串做MD5运算并转为大写。

◦ 将参数和签名组成XML,POST请求微信统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder)。

◦ 解析微信返回的XML,拿到prepay_id。

• 动作:用prepay_id、时间戳、随机字符串等,再次签名生成paySign,将五个参数(timeStamp, nonceStr, package, signType, paySign)打包返回给前端。

3. 前端:调起支付收银台
• 核心:前端拿到后端返回的五个参数后,直接调用wx.requestPayment。

• 代码模板:
wx.requestPayment({
timeStamp: '1414561699',
nonceStr: '5K8264ILTKCH16CQ2502SI8ZNMTM67VS',
package: 'prepay_id=wx201410272009395522657a690389285100',
signType: 'RSA', // 或 'MD5',需与后端生成一致
paySign: 'oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvk...',
success (res) { /* 处理成功UI */ },
fail (err) { /* 处理失败提示 */ }
})

• 注意:success回调仅代表接口调用成功(收银台顺利拉起),不代表用户已支付。真实结果靠后端回调。

4. 后端:盯紧支付结果回调
• 核心:用户支付成功后,微信服务器会异步通知你的后端(通知地址是下单时设置的notify_url)。

• 动作:在你的后端编写一个接口(如/api/notify)接收POST请求(数据为XML/JSON)。必须先验证微信签名(防止伪造通知),然后解析报文,根据result_code更新订单状态为“已支付”。

• 动作:处理完业务逻辑后,必须在5秒内返回特定的XML/JSON成功响应给微信(如<return_code><![CDATA[SUCCESS]]></return_code>),否则微信会多次重复通知。

5. 安全兜底:主动查询订单状态
• 场景:网络抖动或后端服务重启,可能导致没收到支付结果回调。

• 动作:前端支付完成后(无论success/fail),可提示“查询支付结果”,同时你的后端应定时(如每10分钟)或手动触发查单:用商户订单号或微信支付订单号,调用微信查单接口(https://api.mch.weixin.qq.com/pay/orderquery),根据返回的trade_state同步最终状态。这是避免资金纠纷的关键。

——
最小起步版本(先跑通)
如果急着测试,可简化:后端用固定金额和商品描述,跳过部分校验;前端支付成功后,手动在数据库标记订单为成功。但上线前必须补全所有安全步骤。

——
常问:有没有不用后端的方法?
必须用后端。因为涉及API密钥、签名、与微信支付接口通信,这些敏感操作绝不能放在小程序前端,否则密钥泄露会造成资金损失。

——
优先做哪几项?
开通支付权限、配好API密钥和支付目录是前提,然后集中调试后端生成预付单和前端调起支付这个核心链路。</think>『小程序支付功能开发5步实操:从开通权限到安全回调(含避坑指南)』
【文章开始】

1. 权限开通与配置
• 动作:小程序后台申请微信支付→填写企业资料→完成对公账户验证(1-3个工作日)

• 动作:登录商户平台→设置32位API密钥→配置支付授权目录(需精确到接口文件所在路径)

• 注意:API密钥像支付系统的"钥匙",一旦设置必须妥善保存,且不支持查看,泄露需重置

2. 后端生成支付参数
• 核心动作:服务器接收前端订单请求→生成唯一订单号→调用微信统一下单接口→返回带签名的5个支付参数

• 关键代码(PHP示例):

1. 拼接订单参数(含小程序APPID、商户号、订单金额、用户openid)
2. 用API密钥对参数进行MD5签名
3. 通过XML格式请求https://api.mch.weixin.qq.com/pay/unifiedorder接口
4. 解析返回数据获取prepay_id

3. 前端调起支付窗口
• 动作:小程序端用wx.request获取后端支付参数→调用wx.requestPayment

• 参数映射:

• timeStamp:当前时间戳(秒级)

• nonceStr:32位随机字符串

• package:格式为prepay_id=xxx

• signType:根据密钥版本选MD5或RSA

• paySign:后端二次计算的签名

4. 处理支付结果回调
• 动作:在服务器配置notify_url接口→接收微信POST通知→验证签名→更新订单状态→返回XML成功响应

• 避坑点:

• 必须在5秒内返回SUCCESS响应,否则微信会重复通知

• 需处理幂等性(同一订单可能被多次通知)

5. 主动查询保障可靠性
• 场景:网络超时导致未收到回调时

• 动作:后端定时调用查单接口→核对订单状态→同步本地数据库

• 推荐频率:支付后10分钟、1小时、6小时各查询一次

——
最小可行方案(测试环境):
后端固定订单金额→跳过部分校验→前端硬编码测试金额。但上线前需补全安全校验

常问:能否不用后端直接支付?
不可行。支付签名和API密钥必须存放在服务端,前端存储会导致密钥泄露风险

优先执行项:
先完成权限配置和API密钥设置,再集中调试后端签名与前端的参数传递流程。