微信公众平台开发小结

前段时间研究一下微信公众平台开发,记录一下,以免忘了。

一、准备过程

1、注册公众账号,https://mp.weixin.qq.com/,注册账号,需要邮箱激活,而且还要填写信息登记。

2、公众账号的开发模式支持任何语言,我选用的PHP,因为PHP简单,而且服务器比较好找,这里我用的是SAE的。

微信公众账号分订阅号和服务号,服务号针对企业级用户,功能全;而订阅号主要面向个人或小媒体等,功能相对少一些。 不过,这两种模式都支持开发模式,也就是自己来做消息服务器。

公众账号基本过程:订阅用户发送消息或发生事件(关注等),消息会先发到微信服务器,微信服务器经过分析处理后,将消息转发到公众号的自定义服务器(在开发模式中指定)上,公众号的自定义服务器经过分析处理,对消息做出回应,可以返回一些信息或者做其他操作,微信服务器会将公众号的自定义服务器返回的信息,转发给订阅用户,这样完成一个完整的过程

二、开启公众账号开发模式 登陆公众账号>>>>高级功能>>>>开发模式:

QQ截图20140410203451

URL是开发者用来接收微信服务器数据的接口URL地址。 Token可任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。

此时提交 会提示: QQ截图20140410204739  

[摘自微信公众平台官方文档>>>]

因为微信服务器会发送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     }

  先记录这些,以后有时间再研究。

原文地址:https://www.cnblogs.com/tinker/p/3780815.html