首页 > 代码库 > 微信公众号开发(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)---历史上的今天小实例