首页 > 代码库 > 微信公众号开发(3)---历史上的今天小实例

微信公众号开发(3)---历史上的今天小实例

功能是在关注意创3D打印测试这个订阅号之后,输入月日,比如0204(代表2月4日),会收到很多天历史上的这一天发生的大事件。

代码部署环境是用了新浪sae,thinkphp框架基础上实现功能。

控制器中:

<?PHP
namespace Home\Controller;
use Think\Controller;

class IndexController extends Controller {
    //token验证,微信服务器发送post请求过来
    public function index(){
      $timestamp = $_GET["timestamp"];//a时间戳
      $nonce = $_GET["nonce"];//随机数
      $token = "weixin";//token
      $signature = $_GET["signature"];//加密签名
      $echoStr = $_GET["echostr"];;//随机字符串
      //1)将token、timestamp、nonce三个参数进行字典序排序
      $tmpArr = array($token, $timestamp, $nonce);
      sort($tmpArr, SORT_STRING);
     //2)将三个参数字符串拼接成一个字符串进行sha1加密
     $tmpStr = implode( $tmpArr );
     $tmpStr = sha1( $tmpStr );
     //3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    if( ($tmpStr == $signature) && $echoStr ){
         echo  $echoStr;//第一次接入
         exit;
       }else{
           $this->responseMsg();//第二、三、、、、、、次接入,除了第一次接入,以后的接入不会传送$echoStr
       }
    }
    public function responseMsg(){
       //获取到微信推送过来的数据
       $postArr = $GLOBALS["HTTP_RAW_POST_DATA"];
       
       //处理消息
        $postObj = simplexml_load_string($postArr);//转成了对象
        //用户关注后,微信推送过来一个包含用户信息的xml数据包,我们接收后并回复
        //判断消息类型
        if(strtolower($postObj->MsgType) == "event"){
            //判断事件类型,是订阅(subscribe),还是退订(unsubscribe)
            if(strtolower($postObj->Event) == "subscribe"){
                //$content = "旅行者,欢迎你--用户的openid:".$postObj->FromUserName."--开发者微信号:".$postObj->ToUserName."--消息类型:".$postObj->MsgType."--事件类型:".$postObj->Event;
                $content = "欢迎你,旅行者,快过来,告诉你个秘密,你输入月日我就可以帮你查到历史上的大事件,比如0101";
                $wxSdkModel = new \Home\Model\IndexModel();
                $wxSdkModel -> reponseSubscribe($postObj,$content); 
            }
        }

 //调取历史上的今天接口,返回信息
        if(strtolower($postObj->MsgType) == "text"){
            $time = $postObj->Content;
            $yue = substr($time,0,2);
            $ri = substr($time,-2);
            //历史上的今天接口
            $path = "http://api.avatardata.cn/HistoryToday/LookUp?key=4fa3a138823747b48366757422b61977&yue=".$yue."&ri=".$ri."&type=1&page=1&rows=50";
            //初始化
            $ch = curl_init();
            //设置参数
            curl_setopt($ch,CURLOPT_URL,$path);
            curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出
            //调接口
            $res = curl_exec($ch);
            //关闭
            curl_close($ch);
            if(curl_errno($ch)){
                echo curl_error($ch);
            }
            $arr = json_decode($res,true);//不加true是对象,加true是数组
            $content = "一共查到".$arr[‘total‘]."条数据\n";
            $arrnews = $arr[‘result‘];
            foreach($arrnews as $k => $v){
                $content.= $v[‘year‘]."年的这一天".$v[‘title‘]."\n";
            }
            $wxSdkModel = new \Home\Model\IndexModel();
            $wxSdkModel -> reponseText($postObj,$content);   
            }
    }

 

 

其中实例化的$wxSdkModel代表model类IndexModel.class.php

代码如下:

<?php
namespace Home\Model;
use Think\Model;

class IndexModel{

//用户发送文本消息,接收到后回复文本消息
    public function reponseText($postObj,$content){
         $toUserName = $postObj->FromUserName;
         $fromUserName = $postObj->ToUserName;//开发者微信号(原始ID)
         $crateTime = time();
         $msgType = "text";
         $template="
                <xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[%s]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                </xml>";
                $info = sprintf($template,$toUserName,$fromUserName,$crateTime,$msgType,$content);
                echo $info; 
    }

}

其实这个model类就是一个集成的sdk,一些通用的方法都放在这里,不用每次都写一遍,比如回复文本消息,回复图文消息,回复图片消息,这里贴出的只是回复文本消息

的方法。

微信公众号开发(3)---历史上的今天小实例