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

176 php 微信第三方平台填坑记

2016-06-16 15:40 806 查看

微信第三方平台填坑记

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  php