一、验证服务器
这里需要加入一下你的服务器ip地址文件valid.php 该文件存放位置要和上图URL对应
include 'token.php';//包含一下第二点的token验证文件
define("TOKEN", "weixin"); //对应上图的Token
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid(); //调用微信验证类方法,该类只需执行一次,目的其实就是”证明你就是你“,你操作的是你自己的服务器
所以验证成功后,就可以注释掉这一行
//$wechatObj->valid();
class wechatCallbackapiTest{
public function valid() {
$echoStr = $_GET["echostr"];
if($this->checkSignature()){
ob_clean();
echo $echoStr;
exit;
}
}
private function checkSignature(){
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
//下面第三点的代码需要放到这里,
}
二、每次客户端和服务器端交互前都会要求验证access_token
//token.php,------用来判断access_token是否有效并且保存access_token到本地文件中,避免反复失效
ps:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
if(exists_token()){
if(expirse_token()){
//token过期,重新获取token
$token=get_token();
unlink('token.txt');
file_put_contents('token.txt',$token);
}else{
$token=file_get_contents('token.txt');
}
}else{
$token=get_token();
file_put_contents('token.txt',$token);
}
//判断文件是否存在
function exists_token(){
if(file_exists('token.txt')){
return true;
}else{
return false;
}
}
//或取token.txt的创建时间,并且与执行当前index.php的时间对比
function expirse_token(){
$ctime=filectime('token.txt');
$time=time();
$s=$time-$ctime;
echo "现在时间:$time 创建时间:$ctime 计算结果:$s";
if((time()-$ctime)>=7000){
return true;
}else{
return false;
}
}
function get_token(){
$appid = 'wxdbf86fa6a4c38a41';
$appsecret = '99d54a1936e35b88b40f5501cd5ca524';
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
$data = curl_exec($ch);
curl_close($ch);
$obj=json_decode($data,true);
//file_put_contents('access.txt',$data);
return $obj['access_token'];
}
三、消息处理
//接下来就是处理微信和客户端的交互了
//启用微信服务器后,客户端所有的请求都会转向这里被执行(微信那边只是验证身份,和请求转发)
public function responseMsg(){
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
libxml_disable_entity_loader(true); //对信息模板进行错误处理
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);//转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素
$event=$postObj->Event;//通过上步骤取到的对象获取相关事件属性、发送用户、接受用户、以及内容等信息
$fromUsername = $postObj->FromUserName;//发送用户
$toUsername = $postObj->ToUserName;//接收用户
$keyword = trim($postObj->Content); //内容
$time = time();//消息发送时间
$textTpl="<xml>
<ToUserName><![CDATA[%s]]</ToUserName>
<FromUserName><![CAATA[%S]]></FromUserName>
<CreateTime>%s</CreateTime>
<MstType><![CDATA[%S]]></MsgType>
<Content><![CDATA[%S]]></Content>
</xml>
"
信息模板//详见https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
//根据客户端发送过来的事件,做出不同的响应
if($event=="subscribe")
{
//subscribe(订阅),以下是一段示例代码,用户关注公众号后返回给用户一段友好信息,
$msgType = "text";
$contentStr ="你好!感谢您关注";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//上面$textTpl 是信息模板
echo $resultStr;
}else if($event=="unsubscribe"){
//unsubscribe(取消订阅)
}else if($event=="LOCATION"){
//获取地理位置事件
}
}
详情请查阅官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454
网友评论