专栏首页g歌德aJava微信公众平台开发(一)--接入微信公众平台 一、验证服务器代码编写。二、服务器端验证。

Java微信公众平台开发(一)--接入微信公众平台 一、验证服务器代码编写。二、服务器端验证。

今天正式开始微信公众平台的二次开发。网上有很多的及射入微信公众平台的教程。总的来说都差不多,当了解了接入流程解析,什么都显得理所当然。

所以我们还是先看微信给出的官网文档吧:

地址:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html

通过文档我们可以看出其中接入微信公众平台开发,开发者需要按照如下步骤完成:

  • 填写服务器配置
  • 验证服务器地址的有效性
  • 依据接口文档实现业务逻辑

一、验证服务器代码编写。

按照开发文档我们知道我们的应用服务器需要接受微信服务器的get请求,其中包含四个参数(signature、timestamp、nonce、echostr)然后通过校验方式校验服务器的可靠性,校验方式如下:

  • 将token、timestamp、nonce三个参数进行字典序排序
  • 将三个参数字符串拼接成一个字符串进行sha1加密
  • 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

①我在这里写了一个工具类去实现其中的前两步,将三个参数排序并返回sha1加密后的字符串,代码如下:

 1 package com.gede.wechat.util;
 2 
 3 import java.security.MessageDigest;
 4 import java.security.NoSuchAlgorithmException;
 5 import java.util.Arrays;
 6 
 7 /**
 8 * @author gede
 9 * @version date:2019年5月22日 下午2:50:43
10 * @description :
11 */
12 public class SignUtil {  
13     // 与接口配置信息中的 Token 要一致   
14     private static String token = "gede";  
15     /** 
16      * 验证签名 
17      * @param signature 
18      * @param timestamp 
19      * @param nonce 
20      * @return 
21      */  
22     public static boolean checkSignature(String signature, String timestamp, String nonce) {  
23         String[] arr = new String[] { token, timestamp, nonce };  
24         // 将 token、timestamp、nonce 三个参数进行字典序排序   
25         Arrays.sort(arr);  
26         StringBuilder content = new StringBuilder();  
27         for (int i = 0; i < arr.length; i++) {  
28             content.append(arr[i]);  
29         }  
30         MessageDigest md = null;  
31         String tmpStr = null;  
32 
33         try {  
34             md = MessageDigest.getInstance("SHA-1");  
35             // 将三个参数字符串拼接成一个字符串进行 sha1 加密   
36             byte[] digest = md.digest(content.toString().getBytes());  
37             tmpStr = byteToStr(digest);  
38         } catch (NoSuchAlgorithmException e) {  
39             e.printStackTrace();  
40         }  
41 
42         content = null;  
43         // 将 sha1 加密后的字符串可与 signature 对比,标识该请求来源于微信   
44         return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;  
45     }  
46 
47     /** 
48      * 将字节数组转换为十六进制字符串 
49      * @param byteArray 
50      * @return 
51      */  
52     private static String byteToStr(byte[] byteArray) {  
53         String strDigest = "";  
54         for (int i = 0; i < byteArray.length; i++) {  
55             strDigest += byteToHexStr(byteArray[i]);  
56         }  
57         return strDigest;  
58     }  
59 
60     /** 
61      * 将字节转换为十六进制字符串 
62      * @param mByte 
63      * @return 
64      */  
65     private static String byteToHexStr(byte mByte) {  
66         char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
67         char[] tempArr = new char[2];  
68         tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
69         tempArr[1] = Digit[mByte & 0X0F];  
70         String s = new String(tempArr);  
71         return s;  
72     }  
73 }

②将我们的工具类应用到我们的服务器验证过程中,这里我新建一个controller为WechatSecurity,实现同一个get用于接收参数和返回验证参数,简单代码如下:

 1 package com.gede.wechat.controller;
 2 
 3 import java.io.PrintWriter;
 4 
 5 import javax.servlet.http.HttpServletRequest;
 6 import javax.servlet.http.HttpServletResponse;
 7 
 8 import org.apache.log4j.Logger;
 9 import org.springframework.stereotype.Controller;
10 import org.springframework.web.bind.annotation.RequestMapping;
11 import org.springframework.web.bind.annotation.RequestMethod;
12 import org.springframework.web.bind.annotation.RequestParam;
13 
14 import com.gede.wechat.util.SignUtil;
15 
16 /**
17 * @author gede
18 * @version date:2019年5月22日 下午2:53:46
19 * @description :
20 */
21 @Controller
22 @RequestMapping("/wechat")
23 public class WechatSecurity {
24     private static Logger logger = Logger.getLogger(WechatSecurity.class);
25  
26     @RequestMapping(value = "security", method = RequestMethod.GET)
27     public void doGet(
28             HttpServletRequest request,
29             HttpServletResponse response,
30             @RequestParam(value = "signature", required = true) String signature,
31             @RequestParam(value = "timestamp", required = true) String timestamp,
32             @RequestParam(value = "nonce", required = true) String nonce,
33             @RequestParam(value = "echostr", required = true) String echostr) {
34         try {
35             if (SignUtil.checkSignature(signature, timestamp, nonce)) {
36                 PrintWriter out = response.getWriter();
37                 out.print(echostr);
38                 out.close();
39             } else {
40                 logger.info("这里存在非法请求!");
41             }
42         } catch (Exception e) {
43             logger.error(e, e);
44         }
45     }
46  
47     @RequestMapping(value = "security", method = RequestMethod.POST)
48     // post方法用于接收微信服务端消息
49     public void DoPost() {
50         System.out.println("这是post方法!");
51     }
52 }

那么到这里我们的服务器验证的代码就基本完成了,下面我们就进入验证过程!

二、服务器端验证。

 1、首先要将我们的内网穿透工具运行起来,然后再本地服务器上运行我们的项目。

 2.、在这里我用的是测试号,其他的大家对号入座。测试号登录网址 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

3、当我们点击提交时,发现提交失败。原因是之前忘记配置springMVC ,在准备工作中我们只是开启了spring功能,现在我们开始配置springMVC

  在我们项目的src 下,新增appServlet.xml配置文件。开启mvc,并指明mvc扫描包,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    <mvc:annotation-driven></mvc:annotation-driven> 
    <mvc:default-servlet-handler/>
    <context:component-scan base-package="com.gede.wechat.controller"></context:component-scan>
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

4、再打开我们的web.xml,添加appServlet.xml的扫描。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>mychat</display-name>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  
  <servlet>
      <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
            classpath:appServlet.xml
            </param-value>
        </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>

5、这个时候我们再次重启本地服务器,然后提交接口配置信息就大功告成了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java微信公众平台开发(四)--回复消息的分类及实体的创建

    前面有说道对接收到微信服务器消息后对消息的分类,当时主要分为普通消息和事件消息,这里我们要讲述的是我们在给用户回复的消息类型,在这里也可以大致分为两类:一种为不...

    用户2417870
  • Java微信公众平台开发(七)--多媒体消息回复之图片回复

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复【普通消息类型消息】,这里将讲述多媒体消息的回复方法,【多媒体消息】包含回复图片消息...

    用户2417870
  • Spring------自动化装配Bean(三) 一、打开application.xml

    上一篇是基于java手动装配bean的实现,这一篇将通过xml手动装配bean来实现。

    用户2417870
  • SSM框架整合项目 :投票系统

    框架: Spring SpringMVC MyBatis 题目: 投票系统 ? 导包: 1, spring 2, MyBatis 3, mybatis-spri...

    二十三年蝉
  • ubuntu 12.04 14.04 source.list 源

    用户1130771
  • 爬虫——综合案例流程版

    用户2398817
  • 想在Java中实现Excel和Csv的导出吗?看这就对了

    最近在项目中遇到一个需求,需要后端提供一个下载Csv和Excel表格的接口。这个接口接收前端的查询参数,针对这些参数对数据库做查询操作。将查询到的结果生成Exc...

    SH的全栈笔记
  • SpringCloud教程(Finchley版本)-04:断路器(Hystrix-Ribbon)

    写一套简单的业务代码,然后调用前面创建的company-server服务提供的接口。

    IT云清
  • Jmeter(三十四)_Beanshell解析并提取json响应

    将fastjson-1.2.49.jar包置于jmeter的lib目录下,并将该jar包添加到测试计划的Library中;否则会报:Typed variable...

    飞天小子
  • springMVC是实现前台带进度条文件上传

    项目框架采用spring+hibernate+springMVC如果上传文件不想使用flash那么你可以采用html5;截图前段模块是bootstarp框架;不...

    用户6625441

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动