1. 程式人生 > >微信公眾號開發(3)---歷史上的今天小實例

微信公眾號開發(3)---歷史上的今天小實例

獲取 隨機 itl top dex lan 服務器 bstr end

功能是在關註意創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)---歷史上的今天小實例