您的位置:首页 > 移动开发 > 微信开发

php开发微信第三方平台遇到的那些坑

2017-05-06 11:50 288 查看

先谈component_verify_ticket

一共有两个坑,一个是php接收xml不要用$_post 还有一个就是解密后的ticket需要干掉字符串前面的”ticket@@@”

不说了 上代码吧

include_once "wx_third/wxBizMsgCrypt.php";//引入腾讯官方example
function 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);
}
function component_decode($xml,$msg,$config){
$pc = new WXBizMsgCrypt($config['token'], $config['encodingAesKey'], $config['appId']);
$xml_tree = new DOMDocument();
$xml_tree->loadXML($xml);
$array_e = $xml_tree->getElementsByTagName('Encrypt');
$encrypt = $array_e->item(0)->nodeValue;
$format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%s]]></Encrypt></xml>";
$from_xml = sprintf($format, $encrypt);
$message = '';
$errCode = $pc->decryptMsg($msg['msg_sign'], $msg['timeStamp'], $msg['nonce'], $from_xml, $message);
if ($errCode == 0) {
$xml = new DOMDocument();
$xml->loadXML($message);
$array_e = $xml->getElementsByTagName('ComponentVerifyTicket');
$component_verify_ticket = preg_replace("/ticket@@@/","",$array_e->item(0)->nodeValue) ;//处理解密后的字符串
return $component_verify_ticket;
}else{
//如果出错则返回数组
return array(
'err_msg'=>$errCode
);
}

}


再谈component_access_token

很多朋友stream_context_create会报40002错误,我觉得可能是腾讯服务器对换行符的解析有问题导致的,于是改用了curl处理POST请求

function 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);
}
function request_post($url,$data){
$data =json_encode($data);
$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 );
return $response;
}


pre_auth_code

pre_auth_code和verify_ticket一样,字符串前面有 preauthcode@@@ 需要替换掉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php 微信