Java微信公众号开发笔记——接入公众号

Java微信公众号开发笔记——接入公众号

    • 了解接入公众号所需接口配置信息
    • 接入测试

了解接入公众号所需接口配置信息

在接入公众号时,我们需要填入接口配置信息。
Java微信公众号开发笔记——接入公众号_第1张图片
其中url为我们的服务器地址,token是我们提供给微信服务器的令牌,可以任意定义。我们提交这两个信息后微信服务器会发送get请求到我们填写的url上,其中get请求会附带如下的参数:
Java微信公众号开发笔记——接入公众号_第2张图片
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

接入测试

基于以上了解,接下来我们编写一个简单的测试代码:
1)先在eclipse创建一个dynamic web project:
Java微信公众号开发笔记——接入公众号_第3张图片
其目录结构如下:
Java微信公众号开发笔记——接入公众号_第4张图片
其中服务器 WxServlet.java 的代码如下:

package servlet;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
 
/**
 * 使用@WebServlet注解配置WxServlet,urlPatterns属性指明了WxServlet的访问路径
 */
@WebServlet(urlPatterns="/WxServlet")
public class WxServlet extends HttpServlet {
 
    /**
     * Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
     * 这里将Token设置为myToken
     */
    private final String TOKEN = "myToken";
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
    }
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("开始校验签名");
        /**
         * 接收微信服务器发送请求时传递过来的4个参数
         */
        String signature = request.getParameter("signature");//微信加密签名signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        String timestamp = request.getParameter("timestamp");//时间戳
        String nonce = request.getParameter("nonce");//随机数
        String echostr = request.getParameter("echostr");//随机字符串
        if (signature == null) System.out.println("获取不到数据");//若接受不到微信服务器发来的数据则发送获取不到数据的报错
        //排序
        String sortString = sort(TOKEN, timestamp, nonce);
        //加密
        String mySignature = sha1(sortString);
        //校验签名
        if (mySignature != null && mySignature != "" && mySignature.equals(signature)) {
            System.out.println("签名校验通过。");
            //如果检验成功输出echostr,微信服务器接收到此输出,才会确认检验完成。
            response.getWriter().write(echostr);
        } else {
            System.out.println("签名校验失败.");
        }
 
    }
 
    /**
     * 排序方法
     *
     * @param token
     * @param timestamp
     * @param nonce
     * @return
     */
    public String sort(String token, String timestamp, String nonce) {
        String[] strArray = {token, timestamp, nonce};
        Arrays.sort(strArray);
        StringBuilder sb = new StringBuilder();
        for (String str : strArray) {
            sb.append(str);
        }
 
        return sb.toString();
    }
 
    /**
     * 将字符串进行sha1加密
     *
     * @param str 需要加密的字符串
     * @return 加密后的内容
     */
    public String sha1(String str) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte messageDigest[] = digest.digest();
            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();
 
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
}

2)修改一下web.xml
Java微信公众号开发笔记——接入公众号_第5张图片
3)最后把它丢掉我们的Server中运行(关于主机Tomcat配置网上教程很多这里就不再赘述),出现如下界面则说明成功了(由于服务器还没给我们传参所以会报空指针错误)
Java微信公众号开发笔记——接入公众号_第6张图片
这里需要注意的是,如果我们的8080端口被其他程序用掉了,则这里需要把Tomcat的默认8080端口改成其他未被使用的端口,不然会报端口冲突的错,我这里改成了8002。
4)接下来打开natapp进行内网穿透
Java微信公众号开发笔记——接入公众号_第7张图片
5)然后进入测试号界面,把我们localhost:8002换成我们内网穿透的外网地址,token则填入刚刚编程时我们设置的token。点击提交,若弹出“配置成功”的提示则说明我们接入完成。
Java微信公众号开发笔记——接入公众号_第8张图片
*6)若要放到云服务器上运行,则需要将我们的项目打包成war包,并把该war包放入服务器Tomcat文件夹的webapps目录下,然后执行startup文件,在配置接口的时候url项把我们原先内网穿透的地址改成服务器的公网ip地址即可。

参考文章:https://www.cnblogs.com/xdp-gacl/p/5151857.html

你可能感兴趣的:(java)