PHP实现微信公众号验证Token的示例代码


Posted in PHP onDecember 16, 2019
  • 难度水平:初中级
  • 适用人群:对微信公众号开发有认知跟实践的童鞋
  • 阅读时间:8分钟

缘起

很久之前做过一次公众号的开发,当时就遇到了一个验证的小坑,但是由于时间紧任务急处理完了也就没在意,可谁知最近刚刚上马一个新的公众号项目又遇到了同样的小坑,痛定思痛决定奋笔疾书留下痕迹,省的以后再次忘记了。?

开始验证

首先来一张胜过千言万语的图,说明我们要验证的目标:

PHP实现微信公众号验证Token的示例代码

然后开始扫坑。先扫个盲,微信验证的目的就是你来证明你的服务器地址的有效性,所以带着这个目的我们来看看下面这些问题:

  • URL地址怎么写
  • 纯PHP的代码怎么写
  • Laravel的代码怎么写
  • 常见的坑是什么

URL地址怎么写

这个地址可以是路由地址也可以是文件地址:

路由地址形式:
https://mydomain.com/wx,
https://mydomain.com/auth/wx,
https://mydomain.com/utility/wx

文件地址形式:
https://mydomain.com/mywechat...
https://mydomain.com/auth/myw...
https://mydomain.com/utility/...

敲黑板,划重点:
无论哪种形式都可以,重点是可以直接通过GET或者POST访问到

纯PHP的代码怎么写

通常来说纯代码就是非框架的php代码验证方式,废话少说,直接上酸菜:

/*这个是你自定义的令牌,图片里面Token的位置*/
define("TOKEN", "这个是你自定义的令牌");
/*初始化当前的类*/
$wechatObj = new wechatCallbackapiTest();
/*开始验证程序*/
$wechatObj->valid();
/**
 * Class WXApiVerify
 */
class WXApiVerify
{
  /**
   * 检测函数输出
   */
  public function valid()
  {
    $echoStr = $_GET['echostr'];
    if($this->checkSignature()){
      echo $echoStr; #坑点,看下面的常见坑介绍
      exit; #一定要停止php运行,避免产生不必要的字串符
    }
  }

  /**
   * 前面检测
   * @return bool
   */
  private function checkSignature()
  {
    #注意: 这里可以不用检验$_GET参数的有效性,因为微信一定会传相关的参数给你的服务器的,你直接开启验证模式即可。
    $signature = $_GET['signature'];
    $timestamp = $_GET['imestamp'];
    $nonce = $_GET['nonce'];
    $token = TOKEN;
    $tmpArr = array($token, $timestamp, $nonce);
    sort($tmpArr, SORT_STRING);
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    if( $tmpStr === $signature ){
      return true;
    }else{
      return false;
    }
  }
}

Laravel的代码怎么写

首先,强势插个口播(在使用过TP5,CodeIgniter, CakePHP, Yii, Slim之后,我认为Laravel是目前来说最好的PHP框架,不接受其他任何意见。)
其次,验证代码上面是跟纯PHP大同小异的,唯一的区别是在你处理POST请求的时候一定要让Laravel不要检测CSFR Token,否则会出现错误。

首先,设置路由:

Route::any('wx', [
  'uses' => 'WeChatApp@checkSignature'
]);
#坑点,看下面的常见坑介绍

其次,取消Laravel的CSFR检查:

#去到你的Middlewarel里面找到VerifyCsrfToken.php然后插入下面代码:
protected $except = [
    'wx', #注意这个是你在第一步设置的路由路径,不接受单独的文件路径,太Low逼了
  ];

最后,上酸菜:

#在你对应的Controller里面加入以下函数
  public function checkSignature( Request $request ) {
    $input = $request->all();
    # 一定要抓取4个参数
    $echoStr  = $input[ "echostr" ];
    $signature = $input[ "signature" ];
    $timestamp = $input[ "timestamp" ];
    $nonce   = $input[ "nonce" ];
    # 微信官方验证方式
    $token = env( 'TOKEN' ); #或者用config()函数
    $tmpArr = [ $token, $timestamp, $nonce ];
    sort( $tmpArr, SORT_STRING );
    $tmpStr = implode( $tmpArr );
    $tmpStr = sha1( $tmpStr );
    
    # 打印返回结果
    if( $tmpStr == $signature ){
      return response($echoStr);
    } else{
      return response();
    }
  }

常见的坑是什么

文档坑。有些人看过官方文档之后直接就上代码了,缺忽略了里面的一个参数echostr 随机字符串 而这个恰恰是验证服务器的关键点,你要打印这个返回给微信才能通过验证。但是官方文档说的不够重点。

Laravel路由坑。一定要设置请求为any这样包括(GET跟POST)

Laravel还有一个测试的坑,就是如果你的APP_DEBUG=false如果不是false的话可能会造成抛出多余的字串导致验证失败。

要学会使用微信官方测试工具 https://mp.weixin.qq.com/debug/ 选择消息接口测试文本消息接口就行。其他的可以看图说话

PHP实现微信公众号验证Token的示例代码

微信UI的坑。在你通过上面的测试后,并不真正代表你启用了服务器。而是在你保存后要点击启用,然后看到红色 停用 才真正的是真正的启用了。

白名单坑。你一定要去到微信的安全中心设置你的服务器的白名单.否则之后的开发工作会有阻碍。

公众号设置坑。你一定要去微信的公众号设置里面加入你的:

  • 业务域名
  • JS接口安全域名
  • 网页授权域名

结语

微信开发有挑战,细心最关键。遇到问题不要慌,来看哥文章。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP分页显示制作详细讲解
Dec 05 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
PHP用mysql数据库存储session的代码
Mar 05 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
php创建桌面快捷方式实现方法
Dec 31 PHP
php实现博客,论坛图片防盗链的方法
Oct 15 PHP
php中的抽象方法和抽象类
Feb 14 PHP
PHP命名空间与自动加载类详解
Sep 04 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
PHP控制循环操作的时间
Apr 01 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 #PHP
Laravel等框架模型关联的可用性浅析
Dec 15 #PHP
php获取是星期几的的一些常用姿势
Dec 15 #PHP
Yii2框架中一些折磨人的坑
Dec 15 #PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 #PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 #PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 #PHP
You might like
解析dedecms空间迁移步骤详解
2013/05/15 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
Mootools 1.2教程 同时进行多个形变动画
2009/09/15 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
javascript字符串函数汇总
2015/12/06 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
2016/09/05 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
angular2中Http请求原理与用法详解
2018/01/11 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
了解重排与重绘
2019/05/29 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
Python判断操作系统类型代码分享
2014/11/22 Python
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
python字符串与url编码的转换实例
2018/05/10 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
python中的django是做什么的
2020/07/31 Python
估算杭州有多少软件工程师
2015/08/11 面试题
五星级酒店餐饮部总监的标准岗位职责
2014/02/17 职场文书
党员评议表自我评价范文
2014/10/20 职场文书