一、用户发送问号,公众号响应回复用户当前时间
1.逻辑
链接为:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
if (isset($_GET[‘echostr’])) {
$wechatObj->valid();
} else {
$wechatObj->responseMsg();
}
echostr存在的话,则是后台校验对接请求,就去执行wechatObj类中的valid函数验证开发模式
echostr不存在的话去执行wechatObj类中的responseMsg函数来回复用户信息
2.代码
<?php
/**用户发送问号,公众号响应回复用户当前时间
*实现方法
*在wechatCallbackapiTest这个类中有三个函数valid,responseMsg,checkSignature,
* valid和checkSignature主要是用来验证用的,而responseMsg则是用来回复用户消息的。
*参考官方链接:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
*
*/
error_reporting(0);
header('Content-type:text');
//定义token,token很重要在应用中要注意保密
define("TOKEN", "weixin");//定义token常量,按照你自己的实际来!!!
/**将class wechatCallbackapiTest类实例化
* 新建一个wechatCallbackapiTest类型对象wechatObj
* 下面有wechatCallbackapiTest类
*/
$wechatObj = new wechatCallbackapiTest();//实例化类wechatCallbackapiTest
//对接请求,如果请求中包含'echostr'则验证,没有则回复信息
//全局变量$_GET
if (isset($_GET['echostr'])) { //echostr存在的话去执行wechatObj类中的valid函数
$wechatObj->valid();//使用->访问类中valid方法,用来验证开发模式
} else {//echostr不存在的话去执行wechatObj类中的responseMsg函数
$wechatObj->responseMsg();//使用->访问类中responseMsg方法,用来回复用户信息
}
/**
*声明一个类 wechatCallbackapiTest,该类中包含有三个方法(函数)
* valid,responseMsg,checkSignature。
* 参数说明:
* signature 微信加密签名,
* signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
* timestamp 时间戳
* nonce 随机数
* echostr 随机字符串
*/
class wechatCallbackapiTest
{
//验证接口的函数,用于申请成为开发者时向微信发送验证信息。
public function valid()
{
//从微信用户端获取一个随机字符赋予变量echostr
$echoStr = $_GET["echostr"];
//valid signature,option访问地的checkSignature函数签名验证方法,
//如果签名一致,输出变量echostr,完整验证配置接口的操作
/**this在OOP中就是伪变量,
* (伪变量不是真正的变量,只是形式上是变量,变量中存储的是固定的值,$this中并没有,哪个对象调用,$this就代表哪个对象)
* 同时,也可以将$this理解为对象的引用,$this通过引用的形式访问一个对象的方法和属性
* 所以$this代表这个类wechatCallbackapiTest
**/
if ($this->checkSignature()) {//函数在下面
echo $echoStr;
exit;
}
}
//校验函数,校验对接身份函数,签名验证程序
function checkSignature()
{
//从用户端获取参数signature的值再赋值给变量signature(签名)
//获取参数timestamp的值再赋值给变量timestamp(时间戳)
//获取参数nonce的值再赋值给变量nonce(随机数、临时数)
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
//将TOKEN赋值给变量token(就是固定值"weixin")
$token = TOKEN;
//数组变量tmpArr,存储$token, $timestamp, $nonce
$tmpArr = array($token, $timestamp, $nonce);
//新建排序,将token、timestamp、nonce三个参数进行字典序排序
sort($tmpArr);
//implode() 函数返回由数组元素组合成的字符串
$tmpStr = implode($tmpArr);
//shal加密!!!
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
return true;
} else {
return false;
}
}
//响应消息函数,发送问号响应回复用户时间
public function responseMsg()
{
/*接收微信公众平台上用户发送过来的消息,
该消息数据结构为XML,不是php默认的识别数据类型,
因此这里用了$GLOBALS['HTTP_RAW_POST_DATA']来接收,
同时赋值给了$postStr*/
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)) {
//simplexml_load_string为——转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
//将对象$postObj中的发送消息用户的OPENID赋值给$fromUsername变量
$fromUsername = $postObj->FromUserName;
//将对象$postObj中的公众账号的ID赋值给$toUsername变量
$toUsername = $postObj->ToUserName;
//trim() 函数从字符串的两端删除空白字符和其他预定义字符,这里就可以得到用户输入的关键词
$keyword = trim($postObj->Content);
//time() 函数返回当前时间的 Unix 时间戳,即自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
$time = time();
//xml的数据格式,存放微信输出内容的模板
//5个%;
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if ($keyword == "学号") {
$msgType = "text";
$content = "1111111";
$result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
echo $result;
}
if ($keyword == "姓名") {
$msgType = "text";
$content = "新月";
$result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
echo $result;
}
if ($keyword == "?" || $keyword == "?") {//两个问号不一样,一个中文一个英文
$msgType = "text";
$content = date("Y-m-d H:i:s", time());
$result = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
echo $result;
}
} else {
echo "";
exit;
}
}
}
二、补充:
PHP storm注释快捷键 1.// ctrl+/ 2./* */ shift+ctrl+/
那篇太乱,到这边整理,
乱的那篇链接为https://www.cnblogs.com/jiuzhen/p/12938179.html
2020-06-12