微信第三方平台填坑记
1.收不到component_verify_ticket
微信服务器每隔10分钟会向第三方的消息接收地址推送一次component_verify_ticket
文档之中说 component_verify_ticket发到“授权事件接收URL”
truth is 是发送到”公众号消息与事件接收URL”
2.消息解密参数
微信服务器会将以下参数以post的形式发送,例如
$timeStamp = "1466476949";
$nonce = "1261633649";
$encrypt_type = "aes";
$msg_sign = "ccbc6ffc3b2c852ec6e597717165061748e22645";
$signiture = "b097df5d4858a0941e7f368ee6befce326625fdf";
以及xml格式的postdata,例如
$from_xml =
"<xml>
<AppId><![CDATA[wxbe6f86f06bc8c62c]]></AppId>
<Encrypt><!CDATA[EtmM85Kxe9/pXqxuHSDngfRA65a/m6NJsFpKQOKyQ/IwopNjH3sngqaKeY86Tk9/ForvqhJ1MfRfvzr/Vpu1pFOaoVbxG4jk1oBSb5TAsQnUMflbFACyEFdbw6kRo13uni8EvTaIG/DZBnkebzDVc7YS0ZUPVlN2kMZcBhvyVXfgx6xQU3MJ2TH3mwCOPRlDl+P+rIpEs/Fu0DsUXFVW1mTz0ohxhYWmX6ung7oyUZkqObG9erDDaJmU+ZkVUBBbuDFmrNvL7l9d+d7I/R8+lZA+7IBJKY2OqAjDx/ybm1VbCrtetifE9ncidqCfk7kHZ7hENVrY0GiD2Yg5jdrZ3ubRMtnEzhOq38qe9zNRH161qqX4po0m9V+1ECt15QkxYc+nM7124aoSwBBVgMGJVyb1F0krFFFLsb2PJDUt/s8jkDSKawbef9tjkHq6Yh8pehZuH0Ap7+RLt7xygUX5LQ==]]>
</Encrypt>
</xml>";
实例化解密操作类需要以下参数
//$token, $encodingAesKey, $appId可在第三方平台详情页看到
$pc = new wxBizMsgCrypt($token, $encodingAesKey, $appId);
获取解密后的结果需要以下参数
$errCode = $pc-> decryptMsg($msg_sign, $timeStamp, $nonce, $from_xml, $msg);
3.需要mcrypt扩展
需要为php安装mcrypt扩展
4.post得到的xml数据需要加入ToUserName节点
$encryptMsg = $GLOBALS['HTTP_RAW_POST_DATA'] ;
$xml_tree = new DOMDocument();
$xml_tree->loadXML($encryptMsg);
$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);
5.获取component_access_token的参数问题
- php的curl组件不支持https协议,需要更改配置项
- 参数不是通常的key => value ,而是一个json字符串
6.component_verify_ticket 空行问题
发现每次有新的公众号授权,ticket表会存入一条空行.
原因是每次有新的用户授权,微信服务器会ticket接收接口推送以下的xml
<xml>
<AppId><![CDATA[wxbe6f86f06bc8c62c]]></AppId>
<CreateTime>1467785915</CreateTime>
<InfoType>
<![CDATA[unauthorized]]>
</InfoType>
<![CDATA[wx2737d4a373c87cbe]]>
</AuthorizerAppid>
</xml>
7.当帮助公众号实现业务时
如获取用户基本信息:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
这里的access_token 使用的是authorizer_access_token,而不是component_access_token
8.实现网页授权
文档在此,按照文档来就好
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318590&token=b7f3e7ae8c758385d1d712cd4dafa8f9c3c59e13&lang=zh_CN
9.全网发布
这里有两个坑
加密
返回普通文本消息
和 发送事件消息
接口发送的xml消息需要加密
<返回Api文本消息> 接口
文档说要调用客服接口发送xml,其实是发送json_encode后的数组
$data = array('touser'=>$packet['from'],'msgtype'=>'text','text'=>array('content'=>$text));
$json = @json_encode($data);
$accessToken = readAccessToken(); //读取已保存的access_token
$result = http_post("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=$accessToken",$json);
10.授权的公众号结果串掉了
pre_auth_code 需要每次实时请求!
虽然它有过期时间,但是毛用都没有,每次生成授权链接,都需要调接口重新请求一次pre_auth_code,因为对于同一个pre_auth_code,会返回同一个公众号信息
11.jssdk 分享接口报invalid signature
导致这个问题的原因很多
我的问题是因为取jsapi_ticket的时候,里面的access_token字段填充的值取了component_access_token,
而正确的填充值应该是authorizer_access_token