前段时间研究一下微信公众平台开发,记录一下,以免忘了。
一、准备过程
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 }
先记录这些,以后有时间再研究。