环境:新浪SAE+ThinkPHP5.0.12
注:代码留存用
坑点:新浪SAE一定记得实名认证,不然token验证不让过
控制器文件代码(功能:关注公众号回复文字):
<?php
namespace app\index\controller;
class Index {
public function __construct() {
}
public function Index() {
if (isset($_GET['echostr'])) {
//获得参数 signature,nonce,timestamp,token
$nonce = $_GET['nonce'];
$token = 'TzxWeiXin';
$timestamp = $_GET['timestamp'];
$echostr = $_GET['echostr'];
$signature = $_GET['signature'];
//形成数组,然后案字典序排序
$array = array();
$array = array($nonce, $timestamp, $token);
sort($array);
//拼接字符串,sha1加密,然后与signature进行校验
$str = sha1(implode($array));
if ($str == $signature) {
echo $echostr;
exit ;
}
} else {
$this -> responseMsg();
}
}
//接受事件推送并回复
public function responseMsg() {
//获取微信post过来的xml数据(不能用$_POST,因为PHP不识别XML)
$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);
// ToUserName 开发者微信号
// FromUserName 发送方帐号(一个OpenID)
// CreateTime 消息创建时间 (整型)
// MsgType 消息类型,event
// Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
if (strtolower($postObj -> MsgType) == 'event') {
//如果是关注事件subcribe
if (strtolower($postObj -> Event) == 'subscribe') {
//回复用户消息
$toUser = $postObj -> FromUserName;
$fromUser = $postObj -> ToUserName;
$time = time();
$msgType = 'text';
$content = '欢迎关注我们的微信';
// 回复用户消息格式
// <xml>
// <ToUserName><![CDATA[toUser]]></ToUserName>
// <FromUserName><![CDATA[fromUser]]></FromUserName>
// <CreateTime>12345678</CreateTime>
// <MsgType><![CDATA[text]]></MsgType>
// <Content><![CDATA[你好]]></Content>
// </xml>
$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, $toUser, $fromUser, $time, $msgType, $content);
echo $info;
}
}
}
}