微信电商收付通所遇到的坑 基于TP5+wechatpay-guzzle-middleware开发
微信电商收付通开发完成已经2个月了,一直没有时间整理,现在抽个时间整理出来,我这边用的是TP5框架+官方的wechatpay-guzzle-middleware开发的电商通,现在把我遇到的坑给大家介绍一下。
1、电商收付通是需要绑定你所开发的业务的appid的(业务可能是公众号、APP、小程序),但前提要保证你的业务有涉及电商的东西,我们的小程序就是一个供需平台,导致绑定APPid时候被驳回了。
2、PHP需要大于7.1,官方的(wechatpay-guzzle-middleware)要求。
3、官方SDK都是guzzle发起请求,所有请先检查你的guzzle里面http_errors设置是否为:false,不然调试接口的时候,抛出400,500的header错误,哪里出问题都不知道。
4、【$merchantPrivateKey】为微信官方下载的私钥、【$wechatpayCertificate】为平台下载的证书。那么问题来了,第一次怎么下载证书?参照官方的sdk所写的方法,然后用apiv3密钥来解密出证书,保存到相应位置,就可以在【WechatPayMiddleware】里传入证书了。
5、官方SDK在针对微信图片上传签名错误解决方法,因为官方SDK把整个body加入了待签名串。
修改:wechatpay-guzzle-middleware\src\Auth\WechatPay2Credentials.php
protected function buildMessage($nonce, $timestamp, RequestInterface $request)
{
$body = '';
if ($request->hasHeader('metaJson')) {
$body = $request->getHeaderLine('metaJson');
}
else {
$bodyStream = $request->getBody();
// TODO: handle non-seekable stream
if ($bodyStream->isSeekable()) {
$body = (string)$bodyStream;
$bodyStream->rewind();
}
}
return $request->getMethod()."\n".
$request->getRequestTarget()."\n".
$timestamp."\n".
$nonce."\n".
$body."\n";
}
}
用来接收微信图片上传签名错误的方法。
同时guzzle发起POST的时候header需要增加:metaJson参数,值为图片上传的:{"filename":" filea.jpg ","sha256":" hjkahkjsjkfsjk78687dhjahdajhk "}
具体代码:
$header = ['Accept'=>'application/json','Content-Type'=>'multipart/form-data','metaJson' => json_encode($meta)];
$data = [
'headers' => $header,
'body' => $body //body拼接字符串
];
6、进件接口中,其实接口文档并没有说明header头需要传入Wechatpay-Serial,如果用官方的SDK需要多增加一个Wechatpay-Serial,另外签名还需要将传入的内参数容转换成json_encode一起在传入。此时Wechatpay-Serial会报序列号错误,这里的Wechatpay-Serial序列号需要从微信官方证书接口获取最新的序列号就可以了。
7、接口总算调通,这时候把 {"applyment_id": 2000002124775691,"out_request_no": "APPLYMENT_00000000001"}json_decode转换成成数组入库,发现applyment_id会自动转换成科学计数法。
【applyment_id是否需要这个看自己业务需求,其实有out_request_no就可以】
这是需要把json_decode变成如下:json_decode($json, TRUE, 512, JSON_BIGINT_AS_STRING);
8、如果出现【系统繁忙,请稍后重试】,别急,接口报了错的,统统给你返回“系统繁忙,稍后再试,其实是参数传的不对,检查自己的代码吧”。看看那个参数是不是为空。
这些就是我在微信电商通所遇到的问题,如果有不明白的网友,可以留言给我。