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
相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- rem : web app适配的秘密武器
- jquery高级应用之Deferred对象
- php7 读取php.ini[4]
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充
- Linux Apache+MySQL+PHP
- 建立Apache+PHP+MySQL数据库驱动的动态网站
- PHP 5.3.0 安装分析心得
- apache 环境下 php 的配置注意事项
- 简单好用的PHP分页类