PHP 7.2.X
微信支付API已经更新到v3版本,同时文档也做了更新,相比之前的版本,条理更清晰,但难免还是有一些地方没讲的太清楚,刚接触的人很容易犯错。
一个很大的改动是SDK。之前是官网可以直接下载一个SDK包,然后照着里面的Demo,加上自己的配置,调试一番就基本可以走通。
但现在不是了,官方提供了一个 wechatpay-guzzle-middleware 库,按照GitHub上的说明,通过composer安装即可。由于这个库是依赖于guzzle的,所以,如果你还没有安装guzzle(6.0+),那么同样需要使用composer进行安装。假如你不想用composer安装,也可以,那就按照各自文档的详细说明,去下载库文件,然后引入自己的代码中。不得不说,composer安装还是十分的方便。 安装好库(其实也可以理解成SDK)之后,按照GitHub上的示例代码(分别演示了POST和GET两种请求如何发送),填写相应的参数,即可发起支付请求了。有三个需要注意的参数(见下图):
上图1 微信支付平台证书,通过 证书下载工具 下载,放置到网站中,PemUtil::loadCertificate根据路径参数就可以读取到证书内容;注意:这里的证书要和下面的商户证书区分。
上图2 商户密钥 和 3 商户API证书序列号 在 接入前准备 这里都可以获取到。不要捉急,一步一步按照文档来操作。很幸运,这两个参数我都一次性拿到了。
这几个参数都配置正确了,后面的请求就十分畅通,如果你是H5支付,那么平台会返回h5_url用于唤起微信支付,如果你是APP支付,那么会返回prepay_id,连同后面的签名,在APP端唤起微信支付。
你以为到这就结束了?并没有!
支付是唤起了,但支付成功之后的回调呢? 支付成功之后,微信支付平台会往我们自定义的回调notify_url上发送消息,而且是经过加密的,要想拿到里面的信息,就需要用密钥解密。还好上面安装的库中已经有解密工具,就是WechatPay\GuzzleMiddleware\Util\AesUtil,参考代码:
至此,H5支付基本完成。
关于APP支付,有一点和H5支付不一样。H5拿到h5_url之后可以直接唤起微信支付,但APP支付拿到prepay_id之后,还要对如下字符串进行签名加密:
怎样加密,可以参考下面代码:
同时,把timestamp、noncestr、appid、partnerid、prepayid、package连同上面获取的sign一并返回给APP端,APP就可以根据签名如愿唤起微信支付。
到这里,H5支付和APP支付流程基本走通,如果还有不清楚的地方,欢迎留言告诉我,大家一起学习讨论,共同进步。
祝大家新年快乐!