最近在調試微信公眾號支付時遇到了一個比較詭異的問題,在安卓手機上完全正常,但是同樣的代碼在蘋果設備上就不行,服務器上是PHP的環境,iphone和ipad都測試過也是報同樣的錯誤調用JSAPI缺少參數:timeStamp。開始打印了一下數據發現生成的json數據中是有時間戳這個參數的,但是為什么在IOS上就不行呢。規則完全是按官方文檔規則寫的,不然Android手機上也不會順利支付了。
最后再查閱了一下官方的文檔對比了一下JSON數據發現了一點不同,下面看一下對比,官方的json格式:
{
"appId":"wx2********fj9304", //公眾號名稱,由商戶傳入
"timeStamp":"1396772858", //時間戳,自1970年以來的秒數
"nonceStr":"sldjf45687fgkj9456845608gjk40", //隨機串
"package":"prepay_id=u43445048f45jfgddj459fd",
"signType":"MD5", //微信簽名方式:
"paySign":"SDFLJGDK45GDGBKJDLSIKFJFS56FF" //微信簽名
}
而現有代碼生成的json格式:
{
"appId":"wx2********fj9304", //公眾號名稱,由商戶傳入
"timeStamp":1396772858, //時間戳,自1970年以來的秒數
"nonceStr":"sldjf45687fgkj9456845608gjk40", //隨機串
"package":"prepay_id=u43445048f45jfgddj459fd",
"signType":"MD5", //微信簽名方式:
"paySign":"SDFLJGDK45GDGBKJDLSIKFJFS56FF" //微信簽名
}
仔細看就會發現,區別就一點,官方把時間戳timeStamp作為字符串處理了,作為整型處理就不識別了,既然找到了原因那就好解決了,生成json前吧時間戳轉換為字符串就可以了。處理方案很多下面給出兩種。
//將原來的time()做如下兩種方式處理都可以
strval(time()); //轉換為字符串類型
'"' . time() . '"'; //用引號引起來作為字符串