以下文檔能夠給與排查錯誤的方式
錯誤相關文檔:https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/qian-ming-xiang-guan
發現錯誤: 接口一直返回簽名錯誤. 百度,社區查看很多
大概 有以下幾點的問題
注意幾點:
1、簽名計算爲meta的json串:{ “filename”: “111.jpg”, “sha256”: “5vn8zf4WVaXblpnoeovp62sIg1c” }
2、簽名的是下載證書中的apiclient_key.pem, 並且不包括-----BEGIN PRIVATE KEY----- 與-----END PRIVATE KEY-----
PHP 推薦使用 openssl_get_privatekey(file_get_contents($cert_path));
3、上傳參數meta、file、文件名、換行符號必須新增雙引號
4、必須添加頭文件
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36’
Accept:application/json
Content-Type :multipart/form-data。
按照以上的問題修改完成 依然失敗…
最後仔細閱讀文檔 在錯誤文檔處發現
請求錯誤的提示
微信驗證的字符長度 : “sign_message_length”: 72,
與 當前本地驗證的長度不一致. 打印本地簽名字符串 message的長度爲204
而後排查後發現 不是簽名的錯誤 而是body體的發送錯誤
微信方未收到當前的body請求,重新按照官方的排列 仔細重新寫了restTemplate請求的body體.
最終接口對接完成.
PHP body體的寫法
$params = "--boundary\r\n";
$params .= 'Content-Disposition: form-data; name="meta";'."\r\n";
$params .= 'Content-Type: application/json'."\r\n";
$params .= "\r\n";
$params .= $meta."\r\n"; //meta的json字符串
$params .= "--boundary\r\n";
$params .= 'Content-Disposition: form-data; name="file"; filename="'.$data['meta']['filename'].'";'."\r\n"; //文件名
$params .= 'Content-Type: */*'."\r\n";
$params .= "\r\n";
$params .= $data['file']."\r\n"; //File的二進制
$params .= "--boundary--\r\n";