• java 微信开发token验证失败的解决


    用java做微信开发,验证token时怎么尝试总是失败,于是把每一步获取和计算参数都打印出来看看到底发生了什么。


    这是源代码

    doGet 方法:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		String signature = request.getParameter("signature");
    		String timestamp = request.getParameter("timestamp");
    		String nonce = request.getParameter("nonce");
    		String echostr = request.getParameter("echostr");
    		
    		PrintWriter out = response.getWriter();
    		if (CheckUtil.checkSignature(signature, timestamp, nonce)){
    			System.out.println("check ok");
    			out.print(echostr);
    			
    		}
    		out.close();
    	}

    check util:

    public static boolean checkSignature(String signature, String timestamp,
    			String nonce) {
    		String[] arr = new String[] { token, timestamp, nonce };
    		// sort
    		Arrays.sort(arr);
    
    		// generate String
    		String content = arr[0]+arr[1]+arr[2];
    		
    		
    		// shal code
    		String temp = new SHA1().getDigestOfString(content.getBytes());
    
    		return temp.equalsIgnoreCase(signature);
    	}

    思想其实就是获取到参数 timestamp, nonce 和自己定义的 参数 token一起排序,然后生成一个它们排序后的新字符串,然后给这个字符串用SHA1加密,如果加密结果和获取到的参数 signature相等,则返回获得的参数 echostr。


    刚开始我比较获得的参数,加密后怎么看都与 signature 相等,但是验证信息却总是发现不等,后来发现问题在大小写字母上,我使用的SHA1加密后返回的是大写字母,于是在比较的时候改为“temp.equalsIgnoreCase(signature)”忽略大小写比较后,果然通过验证。\(^o^)/~





    展开全文
  • 引子微信公众号开启开发者模式时,需要配置“服务器配置”,但在配置这个东西时有很多坑需要注意。网上解决的问题这里就不再赘述,下面说的是我碰到的问题,同时也叙述了“TOKEN验证失败”的根源问题。背景 之前,我...

    引子

    微信公众号开启开发者模式时,需要配置“服务器配置”,但在配置这个东西时有很多坑需要注意。

    网上解决的问题这里就不再赘述,下面说的是我碰到的问题,同时也叙述了“TOKEN验证失败”的根源问题。

    背景

    之前,我的公众号一直正常工作,但由于需要更换服务器,就把网站做了迁移,数据也迁移的,但是在修改服务器配置时,始终提示“TOKEN验证失败”。

    于是艰难的排查之路开始了。

    我的后台是PHP的,于是我在入口文件中加入了客户机访问URL输出的方法,将访问地址写入了日志,并将TOKEN验证也加入了输出。比较诡异的是,每一步的输出都很正常,但始终提示“TOKEN验证失败”。

    本着“腾讯这种大公司不会出这个错”的思想,还是将定位问题的重心放到自己的代码中。


    开始一步一步排查验证接口。

    微信服务器访问开发者服务器的接口形态如下:

    http://ip/verifyToken.php?signature=728e5688ce9ed6e00ea498fe8b11e35d5c16bbd7&echostr=8085854468487076604&timestamp=1530682104&nonce=1130401568

    微信服务器的唯一要求就是:“原样返回echostr”,这个并不难,甚至在服务器端不做TOKEN验证,直接原样返回echostr就可以通过验证。


    于是,就新建了一个php文件,并直接 exit($_GET['echostr']),修改了下服务器配置并提交,验证成功。由此说明,问题还是出现在自己的业务代码中。

    继续排查自己的接口。在Chrome中,仔细分析verifyToken.php接口的请求和返回。

    突然发现Response虽然是字符串,但是字符串输出并不是在第一行。如下图


    然后就明白了,必然是代码里哪里输出空行导致最终结果字符串多了些不需要的字符。

    于是,有目标的跟踪排查,发现在一个php工具类里,写了php起始标签和结束标签 <?php ?>,而且在结束标签后面还有有空行。删除php结束标签,修改服务器配置到之前的配置,提交,验证通过。

    至此,"TOKEN验证失败"的根源也找到了,同时,微信服务器的解析方式也了解了。
    微信服务器拿到返回结果后没有做任何操作,直接跟原字符串做对比,并返回对比结果。


    总结

    所以,不论你后台使用的是什么语言,在出现"TOKEN验证失败"的问题时,首先看看公众平台和服务器代码中的TOKEN配置是否一致,然后不需要考虑其他,直接拿到微信服务器访问开发者服务器的接口,直接分析这个接口就好。这个接口的返回必须与接口访问中的echostr字符串一致,不能有任何其他不必要的字符。
    最常见的问题是多了回车符、换行符、服务器文件编码不同多出来的起始符或结束符等。
    展开全文
  • 1.1 没有严格按照微信官方的要求进行token验证。 解决方案建议:详细多阅读几次官方文档,并达到理解的程度。这里我将文档中的重点位置摘录,以提醒注意: 验证消息的确来自微信服务器 开发者提交信息(如何配置不再...

    排查问题我将从以下几个步骤进行

    1. 自己编写的验证接口的问题
    2. 服务端配置问题
    3. 微信端出现的问题

    一. 自己编写验证接口的问题

    可能出现的情况
    1.1 没有严格按照微信官方的要求进行token验证。
    解决方案建议:详细多阅读几次官方文档,并达到理解的程度。这里我将文档中的重点位置摘录,以提醒注意:
    验证消息的确来自微信服务器
    开发者提交信息(如何配置不再累赘,参见官方文档)后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数

    参数 描述
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串

    通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程:
    1)将token、timestamp、nonce三个参数进行字典序排序
    2)将三个参数字符串拼接成一个字符串进行sha1加密
    3)开发者获得加密后的字符串可与SIGNATURE对比,标识该请求来源于微信

    1.2 非正常编辑文件(记事本,在线编辑),导致添加了 utf8 的 bom 签名
    解决方案: 使用多功能编辑器去除 bom。

    1.3 接口文件(php)结束符后包含换行或其他字符

    
    //文件开始
    ?>
    
    //文件结束
    

    解决方案:去除多余的字符。

    如何排除不是自己代码编写出的问题:

    申请微信公众平台接口测试账号:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,用自己写的接口去验证测试账号的token,如果验证能通过,基本能排除自己代码的问题。接下来就要开始怀疑自己服务器配置的问题,导致接收到微信服务器的响应不能正常传递给接口进行处理。

    二. 服务器配置的问题

    2.1 服务端缓存导致配置没有及时更新生效;
    解决方案:在进行验证前清除缓存

    # php
    ob_clean();
    

    2.2 程序 gzip 加密异常,导致token验证失效
    解决方案: 可临时取消程序 gzip 功能排查测试。

    2.3 服务安装了安全狗或者云盾可能会拦截腾讯服务器的请求(阿里云esc)。
    解决方案:卸载安全狗,或者提示云盾设置白名单。如何处理,这里可以参考。https://www.feiniaomy.com/post/155.html

    2.4 虚拟主机使用临时域名去验证导致被系统拦截(适用于万网的虚拟主机)
    解决方案: 使用已经接入备案的正式域名来进行验证操作。

    说明:如果上面的情况都排除了还没解决,这里还有一个方向去排除是服务器的配置问题,那就是确认微信服务器是否发送了请求到我们自己的服务器。如果能确认在确认修改配置时微信服务器没有发送请求到我们的服务器,就能确认是微信服务器的问题。

    如何确认微信服务是否发送请求到我们服务器,这里有两种方法: 1. 查看日志,参考https://www.cnblogs.com/kenshinobiy/p/5433705.html, 后面讲到了如何进行写入日志; 2. 进行数据抓包, 参考https://blog.csdn.net/u012322855/article/details/52080071

    通过最后抓包,我确认了微信服务器没有响应到我的开发服务器,我这个运气可去买彩票了,微信服务器出现故障既被我撞到了T_T, 既然确定是微信服务器没有请求发到开发服务器,接下来就需要跟微信客服进行沟通了。

    三. 如果是微信服务器出现问题该么办?

    1. 如果不是很急,就可以在微信开发者论坛:https://developers.weixin.qq.com/community/develop/mixflow去提问题, 或主动的在论坛上找官方客服进行咨询。
    2. 如果比较急,就直接打微信平台的客服电话。

    腾讯的事业部门及产品很多,一定要找对咨询的地方,要不会浪费双方的时间。
    查寻腾讯不同产品客服的地方:http://kf.qq.com/product/weixinmp.html

    注: 和微信公众平台客服在开发者社区提问的帖子:https://developers.weixin.qq.com/community/develop/doc/000e4208ad8670b2bbd8c0e2e53400?jumpto=reply&parent_commentid=00028266b1835097c3d87e8605ac&commentid=000a2c9bd3ccb02ac4d84aed6564

    参考:

    1. https://help.aliyun.com/knowledge_detail/42508.html?spm=5176.2000002.0.0.60061073MSFZvK
    2. https://bbs.csdn.net/topics/390991193

    我已经开通了我个人网站, 欢迎访问!

    展开全文
  • 云服务器 ECS 服务器中微信公众平台 Token 验证失败常见原因 很多的用户的程序后台在 ECS 服务器进行微信公众平台 Token 验证是显示失败如下图:   1、非正常编辑文件(记事本,在线编辑),...

    云服务器 ECS 服务器中微信公众平台 Token 验证失败常见原因



    很多的用户的程序后台在 ECS 服务器进行微信公众平台 Token 验证是显示失败如下图:

    blob.png

     



    1、非正常编辑文件(记事本,在线编辑),导致添加了 utf8 的 bom 签名

    建议处理办法:使用多功能编辑器去除 bom。

     

    2、php 文件结束符后包含换行或其他字符

    1. //文件开始
    2. ?>
    3. //文件结束

    建议处理办法:去除多余的字符。

     

    3. 程序 gzip 加密异常

    建议处理办法:可临时取消程序 gzip 功能排查测试。

    4. 服务器用户如果安装了安全狗或者云盾可能会拦截腾讯服务器的请求

    建议处理办法:卸载安全狗,或者提示云盾设置白名单。

     

    5. 虚拟主机使用临时域名去验证导致被系统拦截(适用于万网的虚拟主机)

    建议处理办法:使用已经接入阿里云备案的正式域名来进行验证操作。



    这个问题的最佳调试工具 curl,可以模拟微信请求 api 来判断问题

    1. curl http://xxx/index.php/api/xx

    我的问题:

     

    是因为php文件结束时候的空格回车符导致的。 



    删除空格回车后验证成功。





    展开全文
  • 最近开始折腾一下微信公众号开发,踩的一些莫名其妙的坑,给大家分享一下:首当其冲,当然是基础步骤中的开发者配置了。其实呢,只要认真读文档也就木有问题,但是总有一些粗心大意的人——我。 坑一:端口号未...
        最近开始折腾一下微信公众号开发,踩的一些莫名其妙的坑,给大家分享一下:首当其冲,当然是基础步骤中的开发者配置了。其实呢,只要认真读文档也就木有问题,但是总有一些粗心大意的人——我。
    
        坑一:端口号未得到注意和重视,须检查你的服务器的端口是否被开放或者被占用
    

    在这里插入图片描述

    ​    ​坑二:当然就是自以为将信息填完提交就会OK的事了。
    

    在这里插入图片描述

    ​    ​注意注意,你都没有和微信服务器做验证,怎么会提交成功呢?是不是傻,傻的也只有我。下面是文档说的清清楚楚,唉。
    

    在这里插入图片描述

    贴一下Laravel验证Token的简易代码:

    /**

    • 成为微信开发者URL和Token验证

    • @param Request $request

    • @return array|string
      */
      public function wxToken(Request $request)
      {

           $signature = $request->input('signature');
           
           $timestamp = $request->input('timestamp');
           
           $nonce = $request->input('nonce');
       	    
           $echoStr = $request->input('echostr');
       
           if( $this->checkSignature($signature, $timestamp, $nonce) ){
       
               return $echoStr;
           }else{
       
               dd('Token verification failed.');
           }
      

      }

    /**

    • 微信提供的校验规则

    • @param $signature

    • @param $timestamp

    • @param $nonce

    • @return bool
      */
      private function checkSignature($signature, $timestamp, $nonce)
      {

           $token = 'nodexpo';
           
           $tmpArr = array($token, $timestamp, $nonce);
           
           sort($tmpArr, SORT_STRING);
           
           $tmpStr = implode( $tmpArr );
           
           $tmpStr = sha1( $tmpStr );
           
           if( $tmpStr == $signature ){
               return true;
           }else{
               return false;
           }
      

      }

    其实只要注重了这两个步骤,公众号开发这个门槛你就踏了进来,接下来你便会如鱼得水啦。本人使用的Laravel框架开发微信公众号,那就不得不说到组件,那么EasyWeChat当然是首推了。https://www.easywechat.com/docs/master/overview 这是官方给出的文档。具体操作仔细看文档。个人总结,勿喷。谢谢合作。

    展开全文
  • 微信公众号开发时需要在公众平台填写服务器配置,其中有一个填写token项,本人在学习过程中出现了验证失败的结果,经上网查阅发现有许多人都出现过这样的问题,现在就此我总结了一些关于填写token时需要注意的事项...
  • 微信公众号开发基本设置中官方文档bug,致使token验证无法通过 这篇博文主要要讲的是,根据腾讯官方开发者文档进行公众号开发者基本配置后,出现的token验证无法通过的问题,在此我将叙述整个懵逼及思考的过程。 ...
  • 微信公众平台服务器配置时,需要引入token,但是提交的时候总是提示token验证失败,是因为微信后台并未检测到你代码中有验证token的代码,那么应该按照官方文档对token进行验证,验证后再将结果返回微信公众平台即可...
  • 有时候我们发现所有的配置都设置好了,网上也查了不少的资料,还是不行 请您检查这几项: ...1. 在您的URL(服务器地址)页面里,直接Get获取echostr参数打印到页面上。...在火狐浏览器里Firebug里面看到echostr前面...
  • 最开始是这么写: @GetMapping(produces = "text/plain;charset=utf-8") public String authGet( @RequestParam(name = "..., required = false) String signature, ...times...
  • 微信公众号开发者模式验证token验证失败 在开通公众号开发者模式时,里面有服务器配置这块 服务器地址(URL): 令牌(Token): 1.服务器地址要填写你自己买的服务器地址,同时要部署一个http服务,可以接收get...
  • 微信开发遇到问题总结
  • 大家好,最近在学习用java开发微信公众平台,第一次写的代码token验证通过了,用的是阿里云的服务器换系统(server2008->2003)后就怎么也通过不过验证。直接输入域名www.zhenggufang.com/aip/longin网页显示404....
  • 今天困扰我好长时间的问题终于得到了解决,那就是微信众众号平台配置Token一直提示token验证失败的,接下来我就说说我是怎么解决的(还能咋解决,查资料,copy别人的例子一个一个试呗) 问题 微信公众号配置token...
  • 【转】微信公众开发URL和token填写详解 很多人不明白微信公众号开发者中心服务器配置里面的url和token是什么,不会填写。看了教程也不理解是什么,本文详述一下这个问题。 第一步:作为一名微信公众号开发者,别人...
  • 最近在研究用PHP做微信开发的时候,“修改配置时”,总是遇到token验证失败的提示。历经一番查找,种种输出日志和echo,发现,如果不echo调试信息,也不写日志,就不需要ob_clean(),如果一旦启用了输出或者写日志...
  • 围绕signature,timestamp,nonce,echostr取值都为null的问题...不过微信提供了测试号供开发者使用。 根据大神 https://blog.csdn.net/chmod_R_755/article/details/75554735 的文章,他最后的checkSignature方法和...
  • 使用 NodeJS 进行微信公共号开发,首先需要响应微信发送的Token验证,官方文档 填写服务器配置 登录微信公共平台,在开发下的基本配置打开该页面。 依次填写接口的 URL、自定义的 Token、点击随机生成生成 ...
  • 一、关于微信公众号接入网址 这是从开发者文档上面弄下来的,下图就是接入的地方,在开发者中心-服务器的配置,看一下微信开发者文档是怎么说的 URL:就是你的服务器的URL(要能响应TOKEN验证,还要能在外网访问到...
  • 针对客户在对接微信公众号时,微信公众号提交开发者时,提示token验证失败错误,下面请大家跟随68ecshop的技术学习一下测试处理方法:    首先,确认域名是否备案成功,不是正式域名是不能支持配置的。 ...
1 2 3 4 5 ... 20
收藏数 3,912
精华内容 1,564