酷站(www.ku0.com)-致力于为互联网从业者提供动力!

热门关键词:  企业  as  baidu  c4rp3nt3r  美女
酷站

【云小站】新老客都返现+现金红包+瓜分60万奖池
酷站

php

旗下栏目: php js asp Flex Ajax JSP jquery asp.net C语言 java 正则表达式 微信小程序 Android IOS

PHP实现微信公众号验证Token的教程

来源:互联网搜集 作者:秩名 人气: 发布时间:2019-12-17
本篇文章主要介绍了PHP实现微信公众号验证Token的教程,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下,也感谢大家对酷站(ku0.com)的支持。

缘起

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

开始验证

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

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

  • 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/ 选择消息接口测试文本消息接口就行。其他的可以看图说话


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

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

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

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

版权声明:本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 959677720#qq.cn(#换@) 举报,一经查实,本站将立刻删除。
原文链接:https://segmentfault.com/a/1190000021294501

相关文章

  • php-7.3.6编译安装过程介绍

    php-7.3.6编译安装过程介绍

    1.、安装编译工具及库文件(使用yum命令安装) yum install -y apr* autoconf automake bison bzip2 bzip2* cloog-ppl cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c++ gtk+-devel gd g......
    02-12
  • ThinkPHP5&5.1实现验证码的生成,使用及点击刷新

    ThinkPHP5&5.1实现验证码的生成,使用及点击刷新

    验证码现在是用户登录、支付等很多环节的必备元素,ThinkPHP55.1给我们提供了验证码的生成方式,也是非常的简单,在这里写一个完整的验证码验证的使用方法,供大家参考。 前台用户在登录时候需要验证码验证才能登录。首先使用Composer安......
    02-09
  • laravel邮件发送的代码教程

    laravel邮件发送的代码教程

    laravel自带SwiftMailer库,集成了多种邮件API,可以很方便的实现邮件的发送。在本教程中使用到的是SMTP(Simple Message Transfer Protocol)简单邮件传输协议,通常理解为邮件发送服务器。 以126邮箱为例 使用126邮箱的话,需要开启POP......
    01-31
  • Laravel框架自定义分页样式操作代码

    Laravel框架自定义分页样式操作代码

    操作步骤如下: (1) 对应public/css/paging.css 文件建立分页样式. (2) 控制器查出分页数据使用 paginate函数进行分页处理.(禁止使用group by处理查询). (3) 对应视图引入分页样式. 例如: paging.css 样式文件代码(复制即可用,实际操作过)......
    01-26
  • 实现Laravel jwt多表(多用户端)验证隔离教程

    实现Laravel jwt多表(多用户端)验证隔离教程

    Tips: tymon/jwt-auth 作者已通过增加 prv 字段修复这一问题#1167,但是如果你是用 dingo api + jwt 的话,该问题依然存在。# JWT 多表验证隔离 为什么要做隔离 当同一个 laravel 项目有多端(移动端、管理端......)都需要使用 jwt 做用......
    12-19
  • ThinkPHP类似AOP思想的参数验证的实现代码

    ThinkPHP类似AOP思想的参数验证的实现代码

    思路讲解:不管是在开发 API 还是做后台项目的时候,后端永远不要相信前端传输的参数,通常要做的是验证参数的合法性和安全性。那么在实际项目开发的时候,怎么简便的验证参数呢。 TP 提供了好几种参数验证的方式,比如验证器,独立验证......
    12-19
  • PHP实现微信公众号验证Token的教程

    PHP实现微信公众号验证Token的教程

    缘起 很久之前做过一次公众号的开发,当时就遇到了一个验证的小坑,但是由于时间紧任务急处理完了也就没在意,可谁知最近刚刚上马一个新的公众号项目又遇到了同样的小坑,痛定思痛决定奋笔疾书留下痕迹,省的以后再次忘记了。 开始验证 ......
    12-17
  • PHP防止sql注入小技巧之sql预处理原理与实现方法介绍

    PHP防止sql注入小技巧之sql预处理原理与实现方法介绍

    我们可以把sql预处理看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。 我们来看下它有什么好处: 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。 绑定参数减少了服务器带宽,你只需要发送......
    12-14
  • PHP实用小技巧之调用录像的方法

    PHP实用小技巧之调用录像的方法

    主要功能 把你实际的调用操作录下来,然后在你想要的地方重新调用 和匿名函数的作用基本一样,暂存你的调用操作 一般用于链式调用, 然后实际作用于你想要操作的对象上面 好像和没说一样 使用场景 假如 laravel 项目用到了 仓库模式, 然......
    12-06
  • laravel的框架中表单请求类型和CSRF防护

    laravel的框架中表单请求类型和CSRF防护

    laravel中为我们提供了绑定不同http请求类型的函数。 Route::get(/test, function () {});Route::post(/test, function () {});Route::put(/test, function () {});Route::patch(/test, function () {});Route::delete(/test, function (......
    11-24

最新更新