一:模板(ban)消(xiao)(xiao)息報47001 data format error原因(yin)解決分享,更多模板(ban)消(xiao)(xiao)息相關知識請(qing)看:跳(tiao)坑《九十七》模板(ban)消(xiao)(xiao)息相關問題說明主要原因(yin)是(shi)請(qing)求的數據不是(shi)json格式引起(qi)的分享下我(wo)用的代碼(ma)和函數: //發送 ...
更多模(mo)(mo)板消息(xi)相關知識請看:跳坑(keng)《九十(shi)七》模(mo)(mo)板消息(xi)相關問題說明(ming)

主要原因是(shi)請求的數據不(bu)是(shi)json格(ge)式(shi)引(yin)起的
分享下我用的代(dai)碼和(he)函數:
//發送模板消息public function sendmessage(){$data=$_POST=json_decode(file_get_contents('php://input'), TRUE);$access_token=$this->getAccessToken();$request_url='//api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token='.$access_token;$request_data=array('touser'=>$data['touser'],//接收者(用戶)的 openid'template_id'=>$data['template_id'],//所需下發的(de)模板消息的(de)id'page'=>$data['page'],//點(dian)擊模(mo)板卡(ka)片后的跳轉頁面'form_id'=>$data['form_id'],//表單(dan)提交場景(jing)下(xia),為 submit 事件帶上的 formId;支付(fu)場景(jing)下(xia),為本(ben)次支付(fu)的 prepay_id'data'=>$data['data'],//"keyword1": {"value": "339208499", "color": "#173177"}'emphasis_keyword'=>$data['emphasis_keyword']//模板需要放大的關鍵(jian)詞,不填(tian)則默(mo)認無放大);$return=json_decode(https_request($request_url,$request_data,'json'),true);$this->response($return,'json');}//發送請求function https_request($url,$data,$type){if($type=='json'){//json $_POST=json_decode(file_get_contents('php://input'), TRUE);$headers = array("Content-type: application/json;charset=UTF-8","Accept: application/json","Cache-Control: no-cache", "Pragma: no-cache");$data=json_encode($data);}$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)){curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS,$data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); $output = curl_exec($curl);curl_close($curl);return $output;}分享者:管大俠(xia),原文地址 最近在給(gei)公(gong)司開發微(wei)信(xin)小程序,需要用到微(wei)信(xin)登錄(lu),根據(ju)文檔要求需要把獲取(qu)的用戶信(xin)息按(an)照AES進(jin)行解密。
我(wo)使(shi)用的是(shi)官方提供(gong)的PHP demo,拷貝到程序中,測試發現(xian),解密之后(hou)的數據前面有一串亂碼。

類似于這樣子的,前面(mian)一段是亂碼。
經過仔細的(de)(de)檢查(cha),發現官方的(de)(de)提供的(de)(de)demo中的(de)(de)帳號和機密(mi)之后的(de)(de)信(xin)息是(shi)可以(yi)解密(mi)的(de)(de),這就說明解密(mi)代碼是(shi)沒有問題(ti)的(de)(de)。
后來查詢微信開發者社區,找到好多(duo)解密失敗(bai)。其中一個(ge)回答說(shuo)是(shi)因(yin)為多(duo)次調(diao)用wx.login之后導致的(de)問題(ti)。
終于(yu)看(kan)到解(jie)決方案,于(yu)是趕(gan)緊去看(kan)我的代碼。可(ke)是查找(zhao)半天發現只調用了一(yi)次(ci),根本不是這(zhe)個問題。
有一次走到了死(si)胡同,沒辦(ban)法(fa)了,還是看代碼吧(ba)。
根據文檔,應該是先(xian)調用wx.login(),成功之后(hou)再調用wx.getUserInfo(), 于是我就想,會不會是我把wx.getUserInfo()獲取到的(de)值沒有正確的(de)傳給服務器呢(ni)?
既然(ran)不確定,那就得看看。于是,打(da)印(yin)wx.getUserInfo()的(de)返回值(zhi),是這樣子的(de)

看到結果之后我就跟(gen)我的(de)(de)請求服務器(qi)的(de)(de)參(can)數挨個對照,當看到encryptData時(shi),發現了問(wen)題,文檔上寫的(de)(de)是應該把encryptedData的(de)(de)值(zhi)用于解密,而我則是把encryptData的(de)(de)值(zhi)
取出(chu)來了,所(suo)以解(jie)密結(jie)果就不正確(que)了。
至此,發現問題,把(ba)參數改(gai)成encryptedData之后解密(mi)成功。
總結(jie)一下問題(ti): 由(you)于wx.getUserInfo()返回值中encryptData和encryptedData參(can)數名稱(cheng)過(guo)于相似(si),導致(zhi)我(wo)用錯變量,實在是(shi)不應該。
至(zhi)于為什么(me)微信要多返(fan)回(hui)一個沒(mei)(mei)用(yong)的參數(目前還沒(mei)(mei)發(fa)現它的作用(yong)),我就(jiu)不(bu)知到(dao)了,而且文檔(dang)上根本就(jiu)沒(mei)(mei)提到(dao)這個。

希望大家編碼的(de)時候能夠(gou)細心一(yi)點,不要犯我這(zhe)樣(yang)的(de)錯誤。