在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
}
}
//用户关注后,微信推送过来一个包含用户信息的xml数据包,我们接收后并回复
public function responseMsg(){
//获取到微信推送过来的数据
$postArr = $GLOBALS["HTTP_RAW_POST_DATA"];
//处理消息
//<xml>
//<ToUserName><![CDATA[toUser]]></ToUserName>
//<FromUserName><![CDATA[FromUser]]></FromUserName>
//<CreateTime>123456789</CreateTime>
//<MsgType><![CDATA[event]]></MsgType>
//<Event><![CDATA[subscribe]]></Event>
//</xml>
$postObj = simplexml_load_string($postArr);//转成了对象
//判断消息类型
if(strtolower($postObj->MsgType) == "event"){
//判断事件类型,是订阅(subscribe),还是退订(unsubscribe)
if(strtolower($postObj->Event) == "subscribe"){
$toUserName = $postObj->FromUserName;
$fromUserName = $postObj->ToUserName;
$crateTime = time();
$msgType = "text";
$content = "旅行者,欢迎你";
$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;
}
}
}
}