微信开发中token怎么使用_微信开发公众号微信登陆授权后在谷歌浏览器上取不到token - CSDN
  • 2、验证token说明:在微信公众号测试平台填写了正确的url、token后,微信会向填写的url地址发送一条get请求。该请求带有signature、timestamp、nonce、echostr参数。服务端返回echostr参数,则表示token验证成功。...

    1、配置springMVC环境。

    这里就不贴代码了。不知道的朋友,可以去看我的博客。

    2、验证token

    说明:在微信公众号测试平台中填写了正确的url、token后,微信会向填写的url地址发送一条get请求。该请求带有signature、timestamp、nonce、echostr参数。服务端返回echostr参数,则表示token验证成功。

    @Controller
    public class HelloWorldController {
        /**
         * 微信消息接收和token验证
         * @param model
         * @param request
         * @param response
         * @throws IOException
         */
        @RequestMapping("/hello")
        public void hello(Model model, HttpServletRequest request,HttpServletResponse response) throws IOException {
            boolean isGet = request.getMethod().toLowerCase().equals("get");
            PrintWriter print;
            if (isGet) {
                // 微信加密签名
                String signature = request.getParameter("signature");
                // 时间戳
                String timestamp = request.getParameter("timestamp");
                // 随机数
                String nonce = request.getParameter("nonce");
                // 随机字符串
                String echostr = request.getParameter("echostr");
                // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
                if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {
                    try {
                        print = response.getWriter();
                        print.write(echostr);
                        print.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        }

    请求校验工具类

    public class CheckoutUtil {
        // 与接口配置信息中的Token要一致
        private static String token = "Javen";
    
        /**
         * 验证签名
         * 
         * @param signature
         * @param timestamp
         * @param nonce
         * @return
         */
        public static boolean checkSignature(String signature, String timestamp, String nonce) {
            String[] arr = new String[] { token, timestamp, nonce };
            // 将token、timestamp、nonce三个参数进行字典序排序
            // Arrays.sort(arr);
            sort(arr);
            StringBuilder content = new StringBuilder();
            for (int i = 0; i < arr.length; i++) {
                content.append(arr[i]);
            }
            MessageDigest md = null;
            String tmpStr = null;
    
            try {
                md = MessageDigest.getInstance("SHA-1");
                // 将三个参数字符串拼接成一个字符串进行sha1加密
                byte[] digest = md.digest(content.toString().getBytes());
                tmpStr = byteToStr(digest);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            content = null;
            // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
            return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
        }
    
        /**
         * 将字节数组转换为十六进制字符串
         * 
         * @param byteArray
         * @return
         */
        private static String byteToStr(byte[] byteArray) {
            String strDigest = "";
            for (int i = 0; i < byteArray.length; i++) {
                strDigest += byteToHexStr(byteArray[i]);
            }
            return strDigest;
        }
    
        /**
         * 将字节转换为十六进制字符串
         * 
         * @param mByte
         * @return
         */
        private static String byteToHexStr(byte mByte) {
            char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
            char[] tempArr = new char[2];
            tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
            tempArr[1] = Digit[mByte & 0X0F];
            String s = new String(tempArr);
            return s;
        }
        public static void sort(String a[]) {
            for (int i = 0; i < a.length - 1; i++) {
                for (int j = i + 1; j < a.length; j++) {
                    if (a[j].compareTo(a[i]) < 0) {
                        String temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                    }
                }
            }
        }
    }

    3、在微信公众号测试平台中,填写url、token

    这里写图片描述

    注:

    1、url为项目路径且必须可以通过外网80端口访问
    2、token必须和项目中token一致

    展开全文
  • 引子微信公众号开启开发者模式时,需要配置“服务器配置”,但在配置这个东西时有很多坑需要注意。网上解决的问题这里就不再赘述,下面说的是我碰到的问题,同时也叙述了“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

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

    展开全文
  • 以前一直做过微信的开发,毕竟微信开发是现在广大程序猿不得不做的一个开发。其中包括微信的支付,微信的oauth登录。但是一直都没有系统的去完成过一个微信的所有开发,略有遗憾。最近自己申请了一个微信的订阅号,...

    以前一直做过微信的开发,毕竟微信开发是现在广大程序猿不得不做的一个开发。其中包括微信的支付,微信的oauth登录。但是一直都没有系统的去完成过一个微信的所有开发,略有遗憾。最近自己申请了一个微信的订阅号,下面记录下,微信的Token验证吧。

    进行微信公众平台的开发,进行token验证是第一步,如下图所示。url填写自己的服务器地址。Token这里可以自定义,但是要和代码中的Token保持一致。

    验证代码如下:

    var crypto = require('crypto');
    var url = require('url');
    exports.wechat = function(req,res){
    	var query = url.parse(req.url,true).query;
    	var signature = query.signature;
    	var timestamp = query.timestamp;
    	var nonce = query.nonce;
    	var echostr = query.echostr;
    	if(check(timestamp,nonce,signature,"weixin")){
    	res.end(echostr);
    	}else{
    	res.end("It is not from weixin");
    	}
    };
    
    
    function check(timestamp,nonce,signature,token){
    	var currSign,tmp;
    	tmp = [token,timestamp,nonce].sort().join("");
    	currSign = crypto.createHash("sha1").update(tmp).digest("hex");
    	return (currSign === signature);
    };

    获取url中包含的signature,timestamp,nonce,echostr。然后将token,timestamp,nonce按照字典序排列。并且加密,再与接收到的signature进行比对,如果相同,则是来自微信的请求,反之则不是。在配置完了后,本来进行其他开发。到最后发现个人申请的订阅号并不能进行认证,所以,这次只能再忍着了。以后公司有类似的资源的话,再做吧。

    展开全文
  • token是一个令牌; 有了token之后,我们才能去换取access_token,access_token俗称凭证,有了凭证,我们才可以去调用微信公众号的接口。 那么在配置公众号的时候,怎么验证...微信公众号开发token验证 ...

    token是一个令牌;

    有了token之后,我们才能去换取access_token,access_token俗称凭证,有了凭证,我们才可以去调用微信公众号所提供的接口。

    那么在配置公众号的时候,怎么验证token了?

    我录好了视频;

    我觉得视频讲解更加的生动和具体。

    微信公众号开发之token验证

    如果看不清楚,就点下面的按钮全屏观看:)

    全屏观看

    展开全文
  • 首先要开启开发模式必须要进行Token的一个验证,你给出一个地址,微信发送请求,然后你给出相应,就这么简单。虽然说是简单,但是这是事后才说的,官方只有PHP的DEMO,我用JAVA开发的时候各种蛋疼不会弄,不过好在...
  • 最近开始折腾一下微信公众号开发,踩的一些莫名其妙的坑,给大家分享一下:首当其冲,当然是基础步骤的开发者配置了。其实呢,只要认真读文档也就木有问题,但是总有一些粗心大意的人——我。 坑一:端口号未...
  • 【转】微信公众开发URL和token填写详解 很多人不明白微信公众号开发者中心服务器配置里面的url和token是什么,不会填写。看了教程也不理解是什么,本文详述一下这个问题。 第一步:作为一名微信公众号开发者,别人...
  • 微信小程序开发离不开推送消息,现在小编为大家写一篇关于获取token后台Java的文章,欢迎大家互相学习。 获取token方法 该方法需要微信小程序的appid和微信密匙appsecret 另外使用该方法需要引入JSONObject包与工具...
  •  WeChatAPIError: invalid credential, ...问题: 公众号网页开发,后台使用node去微信服务器换取access_token,微信token的有效时间为7200s,但是换取的token很短的时间就失效了。 解决: 刚开始以为是代码有问...
  • 之前在服务器上成功部署并验证已通过,后开换了一个服务器地址就始终不能通过token验证,尝试了网上的很多办法,包括在 echo $echoStr;前面加上ob_clean();清空缓存等等。现在终于定位到原因,原来是在类class ...
  • 为何我用ngrok出来的token那么长,根本输不进去微信公众号配置里的token
  • 微信开发需要用到的access_token,其实是分为两个种类的,一种是普通的access_token,另一种是网页授权access_token。 普通的access_token,是微信开发者调用微信所提供的各种借口的一个凭证,有效时间为7200秒,也...
  • 微信对access_token的请求有数量限制, 如果用户量特别多的话,access_token 可能会不够用 两种方案:  1. access_token 加入缓存并设置2小时的失效时间,每次从缓存取,如果失效再继续生成 access_token, ...
  • 云服务器 ECS 服务器中微信公众平台 Token 验证失败常见原因 很多的用户的程序后台在 ECS 服务器进行微信公众平台 Token 验证是显示失败如下图:   1、非正常编辑文件(记事本,在线编辑),...
  • 微信access_token的介绍

    2018-08-09 13:59:21
    access_token的介绍 1) access_token是什么 ... 可以把它比喻成一个钥匙,通过access_token微信公众号才能调用微信接口,如微信服务器 IP的获取接口,长链接转短链接接口、获取微信关注用户...
  • 好久没有更新博客,最近课余时间看看微信的开发,本文主要介绍如何认证微信的token,开启微信开发之旅。 首先我是申请了一个新浪云的一个应用,进行开发(SAE),主要利用php进行验证
  • 首先我是按照方倍工作室的微信开发公众号的步子来进行开发的,没想到这里面居然埋了一个大坑, 折磨得我不要不要的 这个坑就是:token验证老是不通过。试了许多网上的方法,有关于utf-8无bom格式的,有关于网络不好...
  • 微信开发里面的token有什么用啊,站内解释才给分,否则不给哦。
1 2 3 4 5 ... 20
收藏数 29,838
精华内容 11,935
关键字:

微信开发中token怎么使用