再说一下微信支付踩到的坑 mch_id 参数格式错误

cera cera

微信小程序支付在好久之前写过一次,后来再写的话也是用别人的 SDK 了,之前写的文章好像留了一点坑

博客有发过一篇关于微信小程序支付的文章,见PHP完成微信小程序在线支付功能

贴了代码没有检查,也给 Github 上传了一份,同样也是没有检查,最近就有人留言说使用的时候报错:mch_id参数格式错误

不应该啊,按理说我用的时候是好的啊,微信小程序的支付调用还是很麻烦的,不想写伪代码于是就远程看一下吧

微信小程序调用微信支付时,需要先向微信商户平台”统一下单”接口发起请求,获得prepay_id后,才可以调用小程序的requestPayment接口进行下一步的操作

但是在调用获取得prepay_id之前就已经出问题了,打印一下看看

截图就直接用问问题的同学的吧,如下图所示

这种提示可能就会想到是前后可能有空格吧,看着mch_id都是数字,先来去掉一下两头的空格吧

trim($mch_id);

不过很明显不是这里的问题,打印出来的 xml 数据中mch_id是紧挨着 xml 标签的

找啊找啊,也没发现到底是哪里的问题,随便改几个参数,写错也是提示mch_id参数格式错误

认真的同学就会发现 16-26 的 xml 数据开始结尾外层并没有<xml></xml>包裹

仔细看文档就会发现外层应该是需要<xml></xml>包裹的

转 xml 数据是封装好的方法,不应该出这种问题,又返回头去看之前的文章

    //数组转换成xml
    private function arrayToXml($arr) {
        $xml = "";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "";
        return $xml;
    }

发现 $xml 的地方居然是空字符串,此处应该是<xml></xml>

    //数组转换成xml
    private function arrayToXml($arr) {
        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</xml>";
        return $xml;
    }

可能是之前复制代码的时候没注意,将xml外边的左右括号没有转实体符,编辑器自动去掉了

此时如果直接向接口发起请求会返回mch_id参数格式错误的提示,所以解决mch_id参数格式错误的方法是

请求时加上最外层的<xml></xml>即可

cera cloudiplc tengxunyun

相关推荐