微信小程序支付在好久之前写过一次,后来再写的话也是用别人的 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>
即可