当前位置: 首页 > 后端技术 > PHP

微信第三方平台PHP开发遇到的那些坑(更新中)

时间:2023-03-29 23:47:48 PHP

再说说component_verify_ticket。有两个陷阱。一是php不使用$_post接收xml。另一种是解密后的票需要去掉字符串前面的“ticket@@@”。代码先不说include_once"wx_third/wxBizMsgCrypt.php";//引入腾讯官方示例函数wxservice(){$xml_msg=file_get_contents('php://input');$msg=array("timeStamp"=>empty($_GET['timestamp'])?"":trim($_GET['timestamp']),"nonce"=>empty($_GET['nonce'])?"":trim($_GET['nonce']),"msg_sign"=>empty($_GET['msg_signature'])?"":trim($_GET['msg_signature']));$wx_settins=array('appId'=>"xxx",'token'=>"xxx",'encodingAesKey'=>"xxx",'secrect'=>"xxx",'ticket'=>"xxx");$result=component_decode($xml_msg,$msg,$wx_settins);}functioncomponent_decode($xml,$msg,$config){$pc=newWXBizMsgCrypt($config['token'],$config['encodingAesKey'],$config['appId']);$xml_tree=newDOMDocument();$xml_tree->loadXML($xml);$array_e=$xml_tree->getElementsByTagName('加密');$encrypt=$array_e->item(0)->nodeValue;$format="";$from_xml=sprintf($格式,$加密);$消息='';$errCode=$pc->decryptMsg($msg['msg_sign'],$msg['timeStamp'],$msg['nonce'],$from_xml,$message);如果($errCode==0){$xml=newDOMDocument();$xml->loadXML($message);$array_e=$xml->getElementsByTagName('ComponentVerifyTicket');$component_verify_ticket=preg_replace("/ticket@@@/","",$array_e->item(0)->nodeValue);//处理解密后的字符串返回$component_verify_ticket;}else{//如果有错误,返回一个数组returnarray('err_msg'=>$errCode);}}先说下component_access_token,很多小伙伴stream_context_create会报40002错误,我觉得可能是腾讯服务器解析换行符有问题,所以使用curl处理POST请求函数fresh_access_token($ticket=null){$wx_settins=$wx_settins=array('appId'=>"xxx",'token'=>"xxx",'encodingAesKey'=>"xxx",'secrect'=>"xxx",'ticket'=>“xxx”);$post_data=array('component_appid'=>$wx_settins['appId'],'component_appsecret'=>$wx_settins['secrect'],'component_verify_ticket'=>$ticket);$data=json_decode(request_post('https://api.weixin.qq.com/cgi-bin/component/api_component_token',$post_data),1);}functionrequest_post($url,$data){$data=json_enc颂歌($数据);$ch=curl_init();//使用curl向api发送数据curl_setopt($ch,CURLOPT_POST,true);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_POSTFIELDS,$data);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);$response=curl_exec($ch);curl_close($ch);返回$响应;}pre_auth_codepre_auth_code和verify_ticket一样,字符串前面有preauthcode@@@,需要替换掉