完整的微信公众平台开发2

来源:互联网 发布:c语言调用funcos 编辑:程序博客网 时间:2024/04/27 23:17

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 tokendefine("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 dataif (!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消息创建时间 (整型)MsgTypetextContent文本消息内容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;}?>