微信公众平台开发实战与应用案例读书笔记

Coding Alan 10年前 (2015-09-23) 13689次浏览 0个评论 扫描二维码

微信公众平台开发实战与应用案例读书笔记
开发者模式接入
接收消息格式和参数描述
公众号接收消息代码实现
公众号回复消息代码实现

开发者模式接入

初始认证代码的基本原理就是通过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;
        }
    }
 
?>
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址