24天前写了这个系列的第一篇,后面老大要求用php,后来就改学php。这20几天进步缓慢,但还是进步了些,这里把学到的“干货”,奉献给大家,有兴趣的朋友扫描下面的二维码关注我的学习,求指导,求批评。
微信的基本流程,实例解析自动回复,是今天我想整理的。后面的连接数据库,百度地图API调用,大转盘等,都在施工中。求关注,求督促。
微信和公众平台的交流是以xml为载体,采用一问一答的方式进行。把这句话记清楚,因为很重要。下面开始第一个实例“被关注时自动回复”的解释。(....注意我用的是解释,原创属于"青龙老贼",对于只想和用户进行简单交流的朋友,其实把编辑模式用熟练了,基本的业务就OK了)。
我们需要一个自己的微信公众号和一个SAE开发平台。还有对xml和php有一定的了解。在下面的文档中有非常详细的介绍,在此感谢青龙老哥的分享。
http://download.csdn.net/detail/bailin710258/6325203
认真看完这两篇文档,相信大家一定已经实现了,被关注时自动回复文字的功能。在这里我只理清下思路:
1、接口的配置:
在开发模式界面下载wx_sample-->解压后上传到自己的服务器-->更改TOKEN的值。接口配置中的参数
url: 你的服务器/wx_sample.php
Token:token的值。
配置完成了wx_sample.php可以情清空(不是删除)为什么要这样做呢?我们来看这个文件的代码
<?php /** * wechat php test */ //define your token define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->valid(); class wechatCallbackapiTest {//验证签名和接口 public function valid() {//获得由get方法传来的表单中name属性为‘echostr’的值,并将其赋值给变量$echoStr $echoStr = $_GET["echostr"];//随机字符串 //valid signature , option if($this->checkSignature()){//验证通过原样返回 echo $echoStr; exit; } } //回复信息 public function responseMsg() { //get post data, May be due to the different environments $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //extract post data if (!empty($postStr)){ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); $fromUsername = $postObj->FromUserName; $toUsername = $postObj->ToUserName; $keyword = trim($postObj->Content); $time = time(); $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; if(!empty( $keyword )) { $msgType = "text"; $contentStr = "Welcome to wechat world!"; $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr; }else{ echo "Input something..."; } }else { echo ""; exit; } } private function checkSignature() { $signature = $_GET["signature"];//加密签名 $timestamp = $_GET["timestamp"];//时间戳 $nonce = $_GET["nonce"]; //随机数 $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr);//排序 $tmpStr = implode( $tmpArr );//拼接 $tmpStr = sha1( $tmpStr );//验证,如果成功,则返回所计算的 SHA-1 散列,如果失败,则返回 false。 if( $tmpStr == $signature ){ return true; }else{ return false; } } } ?>
由以上代码可知,当你在微信公众平台,填上url和token并提交后,平台就会向url所在的地址发个get请求,其中包括了时间戳、随机数等参数。你的服务器等到这些参数后会结合token进行验证,验证通过则原样返回$echoStr(随机字符串)这个参数,反之则什么都不返回。所以掌握原理后我们只姚这几行代码就能通验证
2、消息的自动回复。
首先得重复下句话:微信和公众平台的交流是以xml为载体,采用一问一答的方式进行。当普通微信用户向公众账号发消息时,微信服务器将以xml的形式通过POST方法将该消息发送到填写的URL上。具体的格式和讲解,见文档。再次感谢青龙老哥无私的分享。下面我对文本消息做个整理。
<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位整型 |
接发流程是这样的 微信消息《--》微信服务器《--》你的服务器。微信服务器和你服务器之间的较量是通过xml进行的,所以你服务器接收和发送微信的过程就是已经解析和封装xml的过程。成为开发者后,在自己的服务端加上下面两个文件就能实现”被关注时自动回复“,详解见注释
<?php //此类包含用到的微信信息的xml格式 $textType="<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> <FuncFlag>0</FuncFlag> </xml>"; ?>回复信息的类
<?php //装载信息模板 include_once("message_type.php"); //解析微信服务器发送来的xml信息 $messageStr = $GLOBALS["HTTP_RAW_POST_DATA"]; if(!empty($messageStr)){ //生成信息对象 $messageObj = simplexml_load_string($messageStr,'SimpleXMLElement',LIBXML_NOCDATA); //提取有用信息 $fromUsername = $messageObj->FromUserName; $toUsername = $messageObj->ToUserName; $form_MsgType = $messageObj->MsgType;//从微信服务器获得的信息类型 //事件信息 if($form_MsgType=="event"){ //获取事件类型 $from_Event = $messageObj->Event; //被关注事件 if($from_Event=="subscribe"){ //拼装个xml格式的信息用于回复 //方法-: 调用模板(message_type.php)用函数拼装,注意收信方和发信方交换了 $msgType="text"; $contentStr="谢谢你的关注!"; $responseStr = sprintf($textType,$fromUsername,$toUsername,time(),$msgType,$contentStr); echo $responseStr; exit; //方法二 也可以自己直接拼装个xml 以后的图文信息这两种方法也适合 } } } else{ echo ""; exit; } ?>