纵观微信公众平台开发的各类书籍,基本上微信定制开发都是从微信消息开始的,主要是服务器被动回复消息这块为主,这个模块也算微信的核心,这次将以验证微信消息来自微信服务器为例,分享下我的代码
一 入口的切入点
我们知道做微信开发需要处理来自用户、微信服务器的各类的消息,查阅微信文档可总结出的规律是 验证消息来自微信服务器为GET请求,其他微信消息的推送是POST请求 , 根据这一规律我们就可以将校验和消息推送统一进行处理
二 代码的实现
1 php可以通过$_SERVER['REQUEST_METHOD']获取请求的类型
2 按照流程程序需要校验signature的有效性并返回正确signature
3 计算signature,php的步骤是 数组排序、把数组转成字符串、sha1计算出signature(非常重要)
对于第三部php还算比较简单,但是像java的话就比较复杂,这里先贴出php的算法
function checkSignature()
{
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$tmpArr = array(
TOKEN,
$timestamp,
$nonce
);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr) {
return $tmpStr;
} else {
return "";
}
}
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
这个是从微信开发文档上摘抄过来的,给大家做参考,详细的可查阅微信开发文档
function isValid()
{
$signature = $_GET["signature"];
if ($signature == $this->checkSignature()) {
return true;
} else {
return false;
}
}
上述两个方法我写到了名为WeixinHandler的类里面,TOKEN是定义好的常量
define("TOKEN", "weixinCourse");
// 步骤
// 1 判断请求方法,get请求一般为消息验证,post为其他消息交互
// 2 验证signature是否正确(消息来自微信服务器)
$handler = new WeixinHandler();
$reqMethod = strtolower($_SERVER["REQUEST_METHOD"]);
if ("get" == $reqMethod && !empty($_GET["echostr"])) {
if ($handler->isValid()) {
$echostr = $_GET["echostr"];
echo $echostr;
exit();
}
} else {
//判断消息类型,返回"你发送的是xxx消息"
$handler->responseMessage();
}
responseMessage用来处理各类的消息,因为这次主要是入门,这个方法下次的博客分享会给出来,到这里校验消息来自微信服务器的功能已经完成了,但是还是需要注意一下几点
1 填写的URL需要外网可以访问且越简单越好,不建议url为带参数的形式;可使用花生壳、ngrok等
2 Token必须和程序定义的保持一致
java的消息校验可参考这个,因为本人是搞java的,就忍不住多啰嗦一下