微信电商收付通所遇到的坑 基于TP5+wechatpay-guzzle-middleware开发
发布于 5 年前 作者 kongchao 2207 次浏览 来自 分享
微信电商收付通开发完成已经2个月了,一直没有时间整理,现在抽个时间整理出来,我这边用的是TP5框架+官方的wechatpay-guzzle-middleware开发的电商通,现在把我遇到的坑给大家介绍一下。

1、电商收付通是需要绑定你所开发的业务的appid的(业务可能是公众号、APP、小程序),但前提要保证你的业务有涉及电商的东西,我们的小程序就是一个供需平台,导致绑定APPid时候被驳回了。

2、PHP需要大于7.1,官方的(wechatpay-guzzle-middleware)要求。

3、官方SDK都是guzzle发起请求,所有请先检查你的guzzle里面http_errors设置是否为:false,不然调试接口的时候,抛出400500的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、如果出现【系统繁忙,请稍后重试】,别急,接口报了错的,统统给你返回“系统繁忙,稍后再试,其实是参数传的不对,检查自己的代码吧”。看看那个参数是不是为空。

这些就是我在微信电商通所遇到的问题,如果有不明白的网友,可以留言给我。

2 回复

有没有SDK发一份啊。老铁

请问下你们有没有对接分账呀,用openid给个人分账的时候总是报请求参数错误,不知道这个openid到底是什么了

回到顶部