前段时间研究一下微信公众平台开发,记录一下,以免忘了。
一、准备过程
1、注册公众账号,https://mp.weixin.qq.com/,注册账号,需要邮箱激活,而且还要填写信息登记。
2、公众账号的开发模式支持任何语言,我选用的PHP,因为PHP简单,而且服务器比较好找,这里我用的是SAE的。
微信公众账号分订阅号和服务号,服务号针对企业级用户,功能全;而订阅号主要面向个人或小媒体等,功能相对少一些。 不过,这两种模式都支持开发模式,也就是自己来做消息服务器。
公众账号基本过程:订阅用户发送消息或发生事件(关注等),消息会先发到微信服务器,微信服务器经过分析处理后,将消息转发到公众号的自定义服务器(在开发模式中指定)上,公众号的自定义服务器经过分析处理,对消息做出回应,可以返回一些信息或者做其他操作,微信服务器会将公众号的自定义服务器返回的信息,转发给订阅用户,这样完成一个完整的过程
二、开启公众账号开发模式 登陆公众账号>>>>高级功能>>>>开发模式:
URL是开发者用来接收微信服务器数据的接口URL地址。 Token可任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
[摘自微信公众平台官方文档>>>]
因为微信服务器会发送GET请求到填写的URL,GET请求携带四个参数:
参数 | 描述 |
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。 检验signature的PHP示例代码:
1 private function checkSignature()
2 {
3 $signature = $_GET["signature"];
4 $timestamp = $_GET["timestamp"];
5 $nonce = $_GET["nonce"];
6
7 $token = TOKEN;
8 $tmpArr = array($token, $timestamp, $nonce);
9 sort($tmpArr, SORT_STRING);
10 $tmpStr = implode( $tmpArr );
11 $tmpStr = sha1( $tmpStr );
12
13 if( $tmpStr == $signature ){
14 return true;
15 }else{
16 return false;
17 }
18 }
[<<<摘自微信公众平台官方文档] 上文中的“TOKEN”就是之前填写的 Token值。
1 <?php
2
3 define("TOKEN", "laoqian"); //安全起见,定义TOKEN
4
5 //有echostr参数时,是微信服务器验证
6 if (isset($_GET['echostr'])) {
7 if(checkSignature()){
8 echo $echoStr;
9 exit;
10 }
11 }
12
13 private function checkSignature()
14 {
15 $signature = $_GET["signature"];
16 $timestamp = $_GET["timestamp"];
17 $nonce = $_GET["nonce"];
18
19 $token = TOKEN;
20 $tmpArr = array($token, $timestamp, $nonce);
21 sort($tmpArr);
22 $tmpStr = implode( $tmpArr );
23 $tmpStr = sha1( $tmpStr );
24
25 if( $tmpStr == $signature ){
26 return true;
27 }else{
28 return false;
29 }
30 }
31
32 ?>
三、实现基本功能 微信公众平台开发,发送的消息是基于xml的,定义了多种消息,包括文本消息、 图片消息、 语音消息、 视频消息、 地理位置消息、 链接消息等。 部分实现代码:
1 //回复文本消息
2 public function responseText($object, $content, $flag=0)
3 {
4 /*回复文本消息
5
6 <xml>
7 <ToUserName><![CDATA[toUser]]></ToUserName>
8 <FromUserName><![CDATA[fromUser]]></FromUserName>
9 <CreateTime>12345678</CreateTime>
10 <MsgType><![CDATA[text]]></MsgType>
11 <Content><![CDATA[你好]]></Content>
12 </xml>
13 参数 是否必须 描述
14 ToUserName 是 接收方帐号(收到的OpenID)
15 FromUserName 是 开发者微信号
16 CreateTime 是 消息创建时间 (整型)
17 MsgType 是 text
18 Content 是 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
19 */
20
21 $fromUsername = $object->FromUserName;
22 $toUsername = $object->ToUserName;
23 $keyword = trim($object->Content);
24 $time = time();
25 $textTpl = "<xml>
26 <ToUserName><![CDATA[%s]]></ToUserName>
27 <FromUserName><![CDATA[%s]]></FromUserName>
28 <CreateTime>%s</CreateTime>
29 <MsgType><![CDATA[%s]]></MsgType>
30 <Content><![CDATA[%s]]></Content>
31 <FuncFlag>%d</FuncFlag>
32 </xml>";
33
34 $msgType = "text";
35 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content,$flag);
36
37 echo $resultStr;
38 exit;
39
40 }
41
42 //回复图片消息
43 public function responseImage($object, $MediaId)
44 {
45 /* 回复图片消息
46 <xml>
47 <ToUserName><![CDATA[toUser]]></ToUserName>
48 <FromUserName><![CDATA[fromUser]]></FromUserName>
49 <CreateTime>12345678</CreateTime>
50 <MsgType><![CDATA[image]]></MsgType>
51 <Image>
52 <MediaId><![CDATA[media_id]]></MediaId>
53 </Image>
54 </xml>
55 参数 是否必须 说明
56 ToUserName 是 接收方帐号(收到的OpenID)
57 FromUserName 是 开发者微信号
58 CreateTime 是 消息创建时间 (整型)
59 MsgType 是 image
60 MediaId 是 通过上传多媒体文件,得到的id。
61
62 */
63 $fromUsername = $object->FromUserName;
64 $toUsername = $object->ToUserName;
65 $time = time();
66 $textTpl = "<xml>
67 <ToUserName><![CDATA[%s]]></ToUserName>
68 <FromUserName><![CDATA[%s]]></FromUserName>
69 <CreateTime>%s</CreateTime>
70 <MsgType><![CDATA[%s]]></MsgType>
71 <Image>
72 <MediaId><![CDATA[%s]]></MediaId>
73 </Image>
74 </xml>";
75
76 $msgType = "image";
77 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $MediaId);
78
79 echo $resultStr;
80 exit;
81
82 }
83
84 //回复语音消息
85 public function responseVoice($object,$MediaId)
86 {
87 /*回复语音消息
88
89 <xml>
90 <ToUserName><![CDATA[toUser]]></ToUserName>
91 <FromUserName><![CDATA[fromUser]]></FromUserName>
92 <CreateTime>12345678</CreateTime>
93 <MsgType><![CDATA[voice]]></MsgType>
94 <Voice>
95 <MediaId><![CDATA[media_id]]></MediaId>
96 </Voice>
97 </xml>
98 参数 是否必须 说明
99 ToUserName 是 接收方帐号(收到的OpenID)
100 FromUserName 是 开发者微信号
101 CreateTime 是 消息创建时间戳 (整型)
102 MsgType 是 语音,voice
103 MediaId 是 通过上传多媒体文件,得到的id
104
105 */
106 $fromUsername = $object->FromUserName;
107 $toUsername = $object->ToUserName;
108 $time = time();
109 $textTpl = "<xml>
110 <ToUserName><![CDATA[%s]]></ToUserName>
111 <FromUserName><![CDATA[%s]]></FromUserName>
112 <CreateTime>%s</CreateTime>
113 <MsgType><![CDATA[%s]]></MsgType>
114 <Voice>
115 <MediaId><![CDATA[%s]]></MediaId>
116 </Voice>
117 </xml>";
118
119 $msgType = "voice";
120 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $MediaId);
121
122 echo $resultStr;
123 exit;
124 }
125
126 public function responseVideo($object, $MediaId,$Title,$Description)
127 {
128 /*回复视频消息
129
130 <xml>
131 <ToUserName><![CDATA[toUser]]></ToUserName>
132 <FromUserName><![CDATA[fromUser]]></FromUserName>
133 <CreateTime>12345678</CreateTime>
134 <MsgType><![CDATA[video]]></MsgType>
135 <Video>
136 <MediaId><![CDATA[media_id]]></MediaId>
137 <Title><![CDATA[title]]></Title>
138 <Description><![CDATA[description]]></Description>
139 </Video>
140 </xml>
141 参数 是否必须 说明
142 ToUserName 是 接收方帐号(收到的OpenID)
143 FromUserName 是 开发者微信号
144 CreateTime 是 消息创建时间 (整型)
145 MsgType 是 video
146 MediaId 是 通过上传多媒体文件,得到的id
147 Title 否 视频消息的标题
148 Description 否 视频消息的描述
149 */
150
151 $fromUsername = $object->FromUserName;
152 $toUsername = $object->ToUserName;
153
154 $time = time();
155 $textTpl ="<xml>
156 <ToUserName><![CDATA[%s]]></ToUserName>
157 <FromUserName><![CDATA[%s]]></FromUserName>
158 <CreateTime>%s</CreateTime>
159 <MsgType><![CDATA[%s]]></MsgType>
160 <Video>
161 <MediaId><![CDATA[%s]]></MediaId>
162 <Title><![CDATA[%s]]></Title>
163 <Description><![CDATA[%s]]></Description>
164 </Video>
165 </xml>";
166
167 $msgType = "video";
168 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $MediaId,$Title,$Description);
169
170 echo $resultStr;
171 exit;
172 }
先记录这些,以后有时间再研究。