微信公众号开发之服务器接入指南之Java版本-阿里云开发者社区

开发者社区> 开发者小助手-bz5> 正文

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

简介: 微信公众号开发之服务器接入指南之Java版本
+关注继续查看

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


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


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


验证逻辑:


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


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


signature: 微信加密签名,这是微信平台计算好的一个值,基于开发者填写的token参数和请求中的timestamp参数、nonce参数。

timestamp:时间戳

nonce:随机数

echostr:随机字符串

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


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


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


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

@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方法的实现:

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函数的实现:

/**
     * @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();
    }

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
6 0
ECS使用感受
阿里云服务器初体验
3 0
ECS初体验
esc简单的初体验
4 0
Java 强、弱、软、虚,你属于哪一种?
Java中的四种引用 Java中有四种引用类型:强引用、软引用、弱引用、虚引用。
3 0
微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)
Spring Cloud 要实现统一配置管理,需要解决两个问题:如何获取远程服务器配置和如何动态更新配置;在这之前,我们先要知道 Spring Cloud 什么时候给我们加载配置文件;
3 0
高校学生在家实践ECS弹性云服务器
简单谈谈我这几周使用ECS弹性云服务器的体验感
5 0
微服务架构 | *2.4 Nacos 获取配置与事件订阅机制的源码分析
为方便理解与表达,这里把 Nacos 控制台和 Nacos 注册中心称为 Nacos 服务器(就是 web 界面那个),我们编写的业务服务称为 Nacso 客户端; 由于篇幅有限,这里将源码分析分为上下两篇,其中上篇讲获取配置与事件订阅机制,下篇讲长轮询定时机制;
4 0
ECS使用体验
使用阿里云服务器搭建个人博客网站
4 0
C# 同步 异步 回调 状态机 async await Demo
C# 同步 异步 回调 状态机 async await Demo 我们项目的客户端和服务端通信用的是WCF,我就想,能不能用异步的方式调用WCF服务呢?或者说能不能用async await的方式调用WCF服务呢?
6 0
2497
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载