开发者模式接入
接收消息格式和参数描述
公众号接收消息代码实现
公众号回复消息代码实现
开发者模式接入
初始认证代码的基本原理就是通过GET方法获取时间戳、随机数,与后台中的TOKEN组合为一个数组进行字典序排序并使用SHA1进行加密。使用加密后的字串与GET方法获取的signature进行比对,若相同输出GET方法获取到的echostr返回字串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php //填入微信后台中使用的TOKEN define("TOKEN",""); $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid(); class wechatCallbackapiTest{ public function valid(){ $echoStr = $_GET [ 'echostr' ]; if ( $this ->checkSignature()){ echo $echoStr ; exit ; } } private function checkSignature(){ //检查是否设置了TOKEN if (!defined( "TOKEN" )){ throw new Exception( 'TOKEN is not defined!' ); } //获取认证签名、时间戳、随机数和TOKEN $signature = $_GET [ 'signature' ]; $timestamp = $_GET [ 'timestamp' ]; $nonce = $_GET [ 'nonce' ]; $token = TOKEN; //创建时间戳、随机数和TOKEN为数组 $tmpArr = array ( $token , $timestamp , $nonce ); //进行字典序排序、拼接和加密 sort( $tmpArr , SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); //对比与签名是否相符 if ( $tmpStr == $signature ){ return true; } else { return false; } } } ?> |
微信开发调试软件链接: http://pan.baidu.com/s/1sj3hFMP 密码: s62p
接收消息格式和参数描述
文本消息格式
1 2 3 4 5 6 7 8 | <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[this is a test]]></Content> <MsgId>1234567890123456</MsgId> </xml> |
文本消息参数描述
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | text |
Content | 文本消息内容 |
MsgId | 消息id,64位整型 |
图片消息格式
1 2 3 4 5 6 7 8 9 | <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[this is a url]]></PicUrl> <MediaId><![CDATA[media_id]]></MediaId> <MsgId>1234567890123456</MsgId> </xml> |
图片消息参数描述
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | image |
PicUrl | 图片链接 |
MediaId | 图片消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
MsgId | 消息id,64位整型 |
语音消息格式
1 2 3 4 5 6 7 8 9 | <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <Format><![CDATA[Format]]></Format> <MsgId>1234567890123456</MsgId> </xml> |
语音消息参数描述
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 语音为voice |
MediaId | 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
Format | 语音格式,如amr,speex等 |
MsgID | 消息id,64位整型 |
视频消息格式
1 2 3 4 5 6 7 8 9 | <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913</CreateTime> <MsgType><![CDATA . ]></MsgType> <MediaId><![CDATA[media_id]]></MediaId> <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId> <MsgId>1234567890123456</MsgId> </xml> |
视频消息参数描述
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | 视频为video |
MediaId | 视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 |
ThumbMediaId | 视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。 |
MsgId | 消息id,64位整型 |
地理位置消息格式
1 2 3 4 5 6 7 8 9 10 11 | <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>23.134521</Location_X> <Location_Y>113.358803</Location_Y> <Scale>20</Scale> <Label><![CDATA[位置信息]]></Label> <MsgId>1234567890123456</MsgId> </xml> |
地理位置消息参数描述
参数 | 描述 |
---|---|
ToUserName | 开发者微信号 |
FromUserName | 发送方帐号(一个OpenID) |
CreateTime | 消息创建时间 (整型) |
MsgType | location |
Location_X | 地理位置维度 |
Location_Y | 地理位置经度 |
Scale | 地图缩放大小 |
Label | 地理位置信息 |
MsgId | 消息id,64位整型 |
链接消息格式
1 2 3 4 5 6 7 8 9 10 | <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[link]]></MsgType> <Title><![CDATA[公众平台官网链接]]></Title> <Description><![CDATA[公众平台官网链接]]></Description> <Url><![CDATA[url]]></Url> <MsgId>1234567890123456</MsgId> </xml> |
链接消息参数描述
参数 | 描述 |
---|---|
ToUserName | 接收方微信号 |
FromUserName | 发送方微信号,若为普通用户,则是一个OpenID |
CreateTime | 消息创建时间 |
MsgType | 消息类型,link |
Title | 消息标题 |
Description | 消息描述 |
Url | 消息链接 |
MsgId | 消息id,64位整型 |
公众号接收消息代码实现
代码下载链接: http://pan.baidu.com/s/1t4PcU 密码: edta
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | <?php //填入微信后台中使用的TOKEN define("TOKEN", ""); $wechatObj = new wechatCallbackapiTest(); if(!isset($_GET['echostr'])){ $wechatObj->responseMsg(); } else { $wechatObj ->valid(); } //回调类 class wechatCallbackapiTest{ public $fromUsername = '' ; public $toUsername = '' ; public function valid(){ $echostr = $_GET [ 'echostr' ]; if ( $this ->checkSignature()){ echo $echostr ; exit ; } } //官方验证方法 private function checkSignature(){ $signature = $_GET [ "signature" ]; $timestamp = $_GET [ "timestamp" ]; $nonce = $_GET [ "nonce" ]; $token = TOKEN; $tmpArr = array ( $token , $timestamp , $nonce ); sort( $tmpArr , SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if ( $tmpStr == $signature ){ return true; } else { return false; } } //消息回复方法 public function responseMsg(){ $postStr = $GLOBALS [ "HTTP_RAW_POST_DATA" ]; $postObj = simplexml_load_string( $postStr , 'SimpleXMLElement' , LIBXML_NOCDATA ); $fromUsername = $postObj ->FromUserName; $toUsername = $postObj ->ToUserName; $type = $postObj ->MsgType; $event = $postObj ->Event; $Event_Key = $postObj ->EventKey; $mid = $postObj ->MediaId; $link = $postObj ->Url; $latitude = $postObj ->Location_X; $longitude = $postObj ->Location_Y; $keyword = trim( $postObj ->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; if ( $keyword != '' ){ $contentStr = $keyword ;} //判断消息类型 elseif ( $type == "image" ){ $contentStr = "您发送的是图片消息,消息的MediaId是" . $mid ;} elseif ( $type == "voice" ){ $contentStr = "您发送的是语音消息,消息的MediaId是" . $mid ; "内容是" . $rec ;} elseif ( $type == "video" ){ $contentStr = "您发送的是视频消息,消息的MediaId是" . $mid ;} elseif ( $type == "location" ){ $contentStr = "您发送的是地理位置消息,您的地理位置是:经度" . $longitude . "纬度" . $latitude ;} elseif ( $type == "link" ){ $contentStr = "您发送的链接信息,消息链接为" . $link ;} elseif ( $type == "event" && $event == "subscribe" ){ $contentStr = "欢迎您关注Alan的微信公众账号,让我们一起开启奇妙有趣的微信公众号开发之旅" ;} elseif ( $type == "event" && $event == "unsubscribe" ){ $contentStr = "期待您再次关注Alan的微信公众账号。" ;} else { echo "" ;} $resultStr = sprintf( $textTpl , $fromUsername , $toUsername , $time , $contentStr ); echo $resultStr ; } } ?> |