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