你得先有这些东西

一个备案过的域名,没有备案免谈。一个能跑HTTPS的服务器,预算紧的话轻量云一年两百来块那种就行。最关键的是营业执照,个体工商户的也可以。

第一步:把商户号弄到手

直接去微信支付商户平台,用营业执照注册,别用个人身份证。个人身份证只能开服务商子商户,独立收单必须要有经营资质。按指引填资料,等审核,快的话半天。

为什么不用个人码?个人码没法接API回调,钱到账了全靠手机通知,稳定性等于零。而且流水一大就风控。上次我帮朋友接他那个小商城,他死活用个人码,结果双十二当天直接被限制,订单全军覆没。

但说真的,一个人搞这些挺累的,记得支付站干三年没死算我命硬,踩坑合集里写过的那些坑,有一半都发生在申请阶段。比如法人姓名和结算银行卡户名不一致,微信不打款,但后台状态一直是“审核通过”,白白等了五个工作日。

第二步:配好API密钥和回调地址

登录商户平台,找到账户中心的API安全,设置密钥。证书文件apiclient_key.pem和apiclient_cert.pem下载下来,一定放对路径。很多新手直接扔在根目录,被目录穿越漏洞一波带走。放项目目录外面,然后用绝对路径引用。

回调地址在商户平台的产品中心配置,填完记得点“验证”。验证的时候微信会发一笔测试通知到你服务器,如果返回的不是指定格式,就报错。这里有个大坑:回调返回要带“SUCCESS”这几个字母,不能多空格也不能少,哪怕大小写错了都会失败。

昨天打雷把路由器劈坏了,跑去营业厅换了个新的,回家发现没把宽带账号和密码记下来,又打客服电话折腾半天。电信那个自助语音系统差点没把人气死。

回调这一块其实还有个隐藏细节,如果你开启了HTTPS的强制双向认证,一定要在微信支付商户平台上传你自己的客户端证书,不然回调请求会被Nginx直接拒绝。nginx的配置片段类似:ssl_client_certificate /path/to/wechat_root.pem; ssl_verify_client optional;。不配置这个,log里会刷一堆426错误,但你根本不会注意到。

第三步:调用统一下单接口

用官方SDK或者直接拼xml都行,我习惯用PHP的wechatpay-guzzle-middleware,composer装下来直接配参数。先生成预支付prepay_id,然后按规则做二次签名给前端拉起来收银台。注意金额单位是分,传十块钱要写1000。签名算法是MD5还是HMAC-SHA256看你自己设的签名类型。

去年有段时间微信悄悄把一些老版本的TLS禁用了,如果服务器openssl太旧,调接口会直接超时,没有任何有效错误码,就一个空返回。这个那个不把风控当回事的支付站长,现在在送外卖就是卡在这,他以为是网络波动,白绕了三天。

怎么确认你搞定了

在开发环境设个一分钱的金额,自己扫支付码付完,看商户后台的订单列表。收到钱后,再去服务器查回调日志,看是不是正常扭转了订单状态。

最常碰上的两个麻烦

签名错误,百分之九十是参数排序和拼串拼错了,key的大小写或者ASCII排序别有毫厘之差。另一个是appid和mch_id不匹配,尤其在服务商模式下,子商户号要和公众号appid绑定过,否则报“appid和mch_id不匹配”。

刚才忘了说,现在央行新规落地三个月,我亲眼看着同行一个个倒下之后,新开的商户号对场景报备要求高了很多,H5支付必须把域名加到支付授权目录,不然连拉起收银台的资格都没有。这个在老文档里根本不会强调。