微信支付踩到的坑mch_id 參數格式錯誤
微信小程序支付在好久之前寫過一次,後來再寫的話也是用別人的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>
即可