- 申请公众账号
- 打开开发者模式 填写url(eg:xx.com/index.php?g=fc/index)和token
- 服务器内容编写:
- 验证信息的真实性:
public function index(){ $this->token=$this->_get('token'); $weixin = $this->gp($this->token); } public function gp($token){ $this->auth($token)||exit; if(IS_GET){ echo($_GET['echostr']); exit; }else {//获取用户发送的信息 $xml = file_get_contents("php://input"); $xml = new SimpleXMLElement($xml); $xml ||exit; foreach ($xml as $key =>$value) { $this->data[$key] = strval($value); } } } private function auth($token){ $data = array($_GET['timestamp'],$_GET['nonce'],$token); $sign = $_GET['signature']; sort($data); $signature = sha1(implode($data)); return $signature === $sign; }
开发文档上讲:在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL,此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性;当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上;所以在gp方法中加了个判断 如果是get的话 返回验证OK的信息,如果是post的话 根据用户请求内容组织XML返回信息给微信 - 获取用户发送的信息:代码已贴出 存放在$this->data中备用
- 关注/取消关注事件:关注/取消关注是一个Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> </xml>
具体见http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E4%BA%8B%E4%BB%B6%E6%8E%A8%E9%80%81 我们可以判断事件 再返回给用户对应信息:if('subscribe'== $data['Event']){XML格式返回信息}
- 接受普通信息:
可以根据$this->data['content'] 来返回不同的信息<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>
- 返回信息:以多图文信息为例
这是微信给的返回格式<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType><![CDATA[news]]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title><![CDATA[title1]]></Title> <Description><![CDATA[description1]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> <item> <Title><![CDATA[title]]></Title> <Description><![CDATA[description]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl> <Url><![CDATA[url]]></Url> </item> </Articles> </xml>
比如用户想要获取今日最热图文新闻(这个可以自己根据需求来判断),新闻包含标题(title)链接(url)图片链接(pic)概述(intro)
最后展示的效果与公众平台群发功能发送的图文信息基本一致 不过会在标题下方多个intro$this->data = array( 'ToUserName'=>$this->data['FromUserName'],'FromUserName'=>$this->data['ToUserName'],'CreateTime'=>NOW_TIME,'MsgType'=>$type,); $articles = array(array('Title'=>'新闻title1','Description'=>'新闻描述1','PicUrl'=>'新闻图片url1','Url'=>'新闻链接1'), array('Title'=>'新闻title2','Description'=>'新闻描述2','PicUrl'=>'新闻图片url2','Url'=>'新闻链接2'));//键值一定要和微信要求的一样 $this->data['ArticleCount'] = count($articles); $this->data['Articles'] = $articles; $xml = new SimpleXMLElement('<xml></xml>');//创建XML $this->data2xml($xml,$this->data); private function data2xml($xml,$data,$item = 'item') { foreach ($data as $key =>$value) { is_numeric($key) &&$key = $item;//当循环到列表的时候 每一条信息都要在外层加一个item if(is_array($value) ||is_object($value)){ $child = $xml->addChild($key); $this->data2xml($child,$value,$item); }else { if(is_numeric($value)){//如果值是数字 直接将值添加 <ArticleCount>2</ArticleCount> $child = $xml->addChild($key,$value); }else {//如果值不是是数字 需要将值进行修改为<Description><![CDATA[description]]></Description> $child = $xml->addChild($key); $node = dom_import_simplexml($child); $node->appendChild($node->ownerDocument->createCDATASection($value)); } } } } exit($xml->asXML());
微信公众平台开发概要
最新推荐文章于 2023-07-18 15:44:48 发布