前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信公众号开发之服务器接入指南之Java版本

微信公众号开发之服务器接入指南之Java版本

作者头像
Jerry Wang
发布2019-05-31 11:20:23
7790
发布2019-05-31 11:20:23
举报

版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1439854

微信公众号开发的官方文档:

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

其中我们开发好的服务器,在配置到微信公众号开发平台的"服务器地址"之后(下图),在真正生效之前,需要通过验证。

验证逻辑:

微信服务器会发送一个HTTP GET请求到我们填写的服务器地址URL上。

这个HTTP GET请求携带的参数:

  1. signature: 微信加密签名,这是微信平台计算好的一个值,基于开发者填写的token参数和请求中的timestamp参数、nonce参数。
  2. timestamp:时间戳
  3. nonce:随机数
  4. echostr:随机字符串

开发者需要通过编程,若确认此次GET请求是否来自微信服务器。确认的逻辑就是把token, 请求中的timestamp和nouce三个参数作为输入,按照微信公众号开发平台规定的逻辑再计算一次,结果同

如果确实是,需要原样返回echostr参数内容,这样我们开发的微信消息服务器就接入成功了。

不幸的是微信官网上提供的示例代码只有PHP版本的,

所以我这里提供一份Java版本的:

代码语言:javascript
复制
@GetMapping("/message")
    @ResponseBody
    public String checkToken(@RequestParam String signature, @RequestParam String timestamp,
                             @RequestParam String nonce, @RequestParam String echostr) {
        boolean result = wxService.checkSignature(signature, timestamp, nonce, echostr);
        if (result) 
            return echostr;
        return "FAILURE";
    }

checkSignature方法的实现:

代码语言:javascript
复制
public boolean checkSignature(String signature, String timestamp, String nonce, String echostr) {
    String[] array = new String[]{ "这里可以硬编码一个token", timestamp, nonce};
        //先对这三个字符串字典排序,然后拼接
        Arrays.sort(array);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < array.length; i++) {
            sb.append(array[i]);
        }

        //使用SHA-1算法对拼接字符串加密
        MessageDigest messageDigest = null;
        String hexStr = null;

        try {
            messageDigest = MessageDigest.getInstance("SHA-1");
            byte[] digest = messageDigest.digest(sb.toString().getBytes());
            //将加密后的字符串转换成16进制字符串
            hexStr = StringUtil.bytesToHexStr(digest);

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        //返回校验结果
        return signature.equalsIgnoreCase(hexStr);
    }

bytesToHexStr函数的实现:

代码语言:javascript
复制
/**
     * @param bytes 加密字节数组
     * @return 转换后的16进制字符串
     * @description 字节数组转换成16进制字符串
     */
    public static String bytesToHexStr(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        int len = bytes.length;
        for (int i = 0; i < len; i++) {
            String hexStr = Integer.toHexString(bytes[i] & 0xff);
            if (hexStr.length() < 2) {
                sb.append(0);
            }
            sb.append(hexStr);
        }
        return sb.toString();
    }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档