zoukankan      html  css  js  c++  java
  • 微信公众号开发(二)

    咳咳,间隔了这么久,现在终于有时间继续了。废话不多说,接上篇微信公众号开发引言。

     说明:博主使用的开发工具为IntelliJ IDEA,开发语言为JAVA。
    
    环境搭建部分就不在这里多说什么了。使用IDEA创建一个SpringBoot项目,之后我们就进入开发阶段吧~
    

    1.修改公众号的服务器配置
    填写公众号服务器配置
    URL处填写能从公网访问到你本机的一个地址,博主在这里选用的是花生壳内网穿透版,但是由于最近实名认证,博主还没有来得及认证[因为博主的花生壳是14年就购置的,好久不用了。在最近才知道要认证]。具体使用方式,博主过些日子认证一下在介绍吧。反正很容易的~

    Token处填写的是自定义字符串,不过要注意!!!此处填写的Token一定要和程序中所设置的一样!此处博主写的是“DeveloperHome”。
    
    然后不要点提交~因为此时提交是肯定会说Token验证失败的~~接下来请看:
    

    2.验证消息来自微信服务器

    首先,从官网的文档中可以看到,验证大约分为三个步骤。

    • 将token,timestamp,nonce三个参数进行字典排序。

    • 将三个参数字符串拼接成一个字符串进行SHA-1加密。

    • 使用加密后提到的字符串与参数中的signature进行对比。

    • 若能确认此GET请求来自微信服务器,则原样返回echor参数内容。
      验证消息来自微信服务器
      步骤知道了,现在就开始撸代码吧。

      在项目中添加一个类ValidateWeChat

    ValidateWeChat.java代码

    package org.yyx.study.wechat.util;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
    import org.yyx.study.config.WeChatConfig;
    
    import javax.annotation.Resource;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.util.Arrays;
    
    /**
     * 验证工具类
     * Created by 叶云轩 on 2017/6/20-11:50
     * Concat ycountjavaxuan@outlook.com
     */
    @Component
    public class ValidateWeChat {
    
        private Logger logger = LoggerFactory.getLogger(ValidateWeChat.class);
        /**
         * 1)将token、timestamp、nonce三个参数进行字典序排序
         * 2)将三个参数字符串拼接成一个字符串进行sha1加密
         * 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
         */
        @Resource
        private WeChatConfig weChatConfig;
    
        /**
         * 对参数进行排序与加密
         *
         * @param timestamp 时间戳
         * @param nonce     随机字符串
         */
        private String sortParams(String timestamp, String nonce) {
            logger.info("排序....");
            String[] array = new String[]{weChatConfig.getDeafultAccessToken(), timestamp, nonce};
            StringBuffer sb = new StringBuffer();
            // 字符串排序
            Arrays.sort(array);
            for (int i = 0, length = array.length; i < length; i++) {
                sb.append(array[i]);
            }
            String sortString = sb.toString();
            try {
                MessageDigest md = MessageDigest.getInstance("SHA-1");
                md.update(sortString.getBytes());
                byte[] digest = md.digest();
                StringBuffer hexstr = new StringBuffer();
                String shaHex;
                for (int i = 0; i < digest.length; i++) {
                    shaHex = Integer.toHexString(digest[i] & 0xFF);
                    if (shaHex.length() < 2) {
                        hexstr.append(0);
                    }
                    hexstr.append(shaHex);
                }
                logger.info("排序完成...");
                return hexstr.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public boolean validate(String signature, String timestamp, String nonce) {
            String s = sortParams(timestamp, nonce);
            return signature.equals(s);
        }
    
    }
    

    之后呢,在controller包中创建一个类,用于验证消息.
    AccessEntrance.java代码

    package org.yyx.study.wechat.controller;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    import org.yyx.study.wechat.util.ValidateWeChat;
    
    import javax.annotation.Resource;
    
    /**
     * 接入微信服务器入口
     * Created by 叶云轩 on 2017/6/20-10:59
     * Concat ycountjavaxuan@outlook.com
     */
    @RestController
    public class AccessEntrance {
    
        private Logger logger = LoggerFactory.getLogger(AccessEntrance.class);
    
        /**
         * 验证工具类
         */
        @Resource
        private ValidateWeChat validateWeChat;
    
        /**
         * 验证消息来自微信服务器方法
         *
         * @param signature 微信加密签名
         * @param timestamp 时间戳
         * @param nonce     随机数
         * @param echostr   随机字符串
         * @return 验证结果
         */
        @GetMapping("/")
        public String accessGet(@RequestParam String signature, @RequestParam String timestamp,
                                @RequestParam String nonce, @RequestParam String echostr) {
            logger.info("method invoke...");
            logger.info("参数[signature]={},[timestamp]={},[nonce]={},[echostr]={}", signature, timestamp, nonce, echostr);
            boolean validate = validateWeChat.validate(signature, timestamp, nonce);
            if (validate) {
                logger.info("验证成功...");
                return echostr;
            }
            logger.info("验证失败...");
            return "wrong";
        }
    }
    
    在AccessEntrance类中,有一个accessGet方法用于接收从微信服务器转发的GET请求,其中有四个必填参数,符合微信公众号开发文档的要求。现在启动我们的项目。
    
    此时,我们回到微信公众号的服务器配置界面,点击提交按钮,则会在页面上方弹出提交成功的字样,如下图:
    

    提交服务器配置
    而我们的开发服务器则会输出如下图所示的日志信息:
    IDE输出日志信息
    至此,微信公众号接入三方服务器成功。

    项目包结构见下图:
    

    项目目录结构

  • 相关阅读:
    在 Solaris 下有内核参数对应 TIME_WAIT 状态保持时间
    Properties获取属性
    jQuery Validate 动态添加验证
    解决struts2 action中double型在页面默认带有小数点的方法
    jsp、java下载附件
    方法参数数量不确定时应该怎么做?
    eclipse的java转web项目
    iBatis批量操作
    ORA19706和_external_scn_rejection_threshold_hours的前世今生
    Oracle官方书籍阅读顺序
  • 原文地址:https://www.cnblogs.com/tdg-yyx/p/7054442.html
Copyright © 2011-2022 走看看