微信测试公众号平台开发(一)——测试公众号的申请及接口信息配置

第一步、开通测试公众号

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

通过上面的链接,然后登陆微信账号之后按照指引可以得到一个测试公众号;开通成功后的页面如下,会显示微信号以及appId和appSecret;这些用于之后的接口配置信息配置

微信测试公众号平台开发(一)——测试公众号的申请及接口信息配置

第二步、接口信息配置

这一个步骤主要是让微信验证你的项目接口有效性,关于服务器资源,可以用内网穿透natapp,

https://natapp.cn/ 这个是官网,按照指示,登录注册后获取到免费渠道后,下载他的natapp.exe文件,开启,将自己的127.0.0.1变成域名地址,要注意的是,因为微信你URL的时候是80端口的,所以你要讲你tomcat的端口设置成80的;

在微信调用URL后,会传送signature,timestamp, nonce三个参数,解析然后获取到然后与token拼接加密,与signature进行比较,下面贴出我的验证代码,

====================进行token加密=====================

    /**
     * 微信token校验
     * @param weChatSign
     * @return
     */
    public static boolean checkSignNature(WeChatSign weChatSign)
    {
        //对token,timestamp,nonce按字典排序
        String[] paramArr = new String[] {SignUtil.token, weChatSign.gettimestamp(), weChatSign.getNonce()};
        Arrays.sort(paramArr);
        
        String content = "";
        for (String target : paramArr)
        {
            //排序后的结果拼成字符串
            content += target;
        }
        
        String cipherText = null;
        try
        {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            //拼接后的字符串SHA-1加密
            byte[] digest = md.digest(content.toString().getBytes());
            cipherText = byteToStr(digest);
        }
        catch (NoSuchAlgorithmException ex)
        {
            ex.printStackTrace();
        }
        
        //将SHA-1加密后的字符串与signature进行对比
        return cipherText != null ? cipherText.equals(weChatSign.getsignature().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;
    }

=============验证并返回信息给微信接口提示验证成功===============

    /**
     * 微信请求校验
     * @param weChatSign
     */
    @RequestMapping(value={"/wx"}, method= {RequestMethod.GET})
    public void checkToken(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {    
        //初始化
        WeChatSign weChatSign = new WeChatSign();
        weChatSign.setNonce(request.getParameter("nonce"));
        weChatSign.setsignature(request.getParameter("signature"));
        weChatSign.settimestamp(request.getParameter("timestamp"));
        
        PrintWriter out = response.getWriter();
        //随机字符串
        String echostr = request.getParameter("echostr");
        //若校验成功则返回echostr
        if (SignUtil.checkSignNature(weChatSign))
        {
            System.out.println( "===========请求校验成功========");
            out.print(echostr);
        }
        else
        {
            System.out.println("===========请求校验失败========");
        }
        
        out.close();
        out = null;
    }