[一]微信公众号开发[订阅号] —— 接入微信公众号

注:订阅号操作
登录微信公众平台 --> 开发[基本配置] --> 填写基本配置信息 --> 接入微信公众平台

1、搭建环境

  • [楼主环境:SpringMVC + MybatisTomcat v8.0Jdk1.8+],不会搭 SpringMVC+Mybatis 自行百度解决。
  • [编码工具:Eclipse(Eclipse Jee Oxygen) + MySQL(Navicat Premium)]

2、开始编码

WinxinController
package com.wx.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.wx.util.CheckUtil;
@Controller
public class WeixinController {

    /**
     * 开始接入微信公众号
     * 
     * @param signature
     * @param timestamp
     * @param nonce
     * @param echostr
     * @throws IOException 
     */
    @RequestMapping("/index")
    public void index(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String signature = request.getParameter("signature");   // 微信加密签名  
        String timestamp = request.getParameter("timestamp");   // 时间戳  
        String nonce = request.getParameter("nonce");           // 随机数  
        String echostr = request.getParameter("echostr");       // 随机字符串  
        PrintWriter out = response.getWriter();
        System.out.println("====== 开始接入微信服务器 ======");
        try {
            if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
                System.out.println("signature ======> " + signature);
                System.out.println("timestamp ======> " + timestamp);
                System.out.println("nonce     ======> " + nonce);
                System.out.println("echostr   ======> " + echostr);
                System.out.println("echostr   ======> " + CheckUtil.getSignature(signature, timestamp, nonce));
                response.getWriter().write(echostr);
                System.out.println("====== 接入微信服务器成功 ======");
            } else {
                System.out.println("====== 微信服务器验证失败 ======");
            }
        } catch (Exception e) {
            System.out.println("====== 连接微信服务器异常 ======");
        } finally {
            System.out.println("====== 释放微信服务器资源 ======");
            out.close();
        }
    }
}
CheckUtil [为了灵活,我将TOKEN写入配置文件,通过读取配置文件来获取,如下]
package com.wx.util;
import java.util.Arrays;
import org.apache.commons.codec.digest.DigestUtils;
/**
 * 签名检验工具类
 * 
 * @author HuPan
 *
 */
public class CheckUtil {

    public static String token = PropertyUtil.getProperty("TOKEN");

    /**
     * 校验 获取的签名与解析后的签名
     * 
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        // sha1加密
        String temp = getSHA1String(getData(signature, timestamp, nonce));
        return temp.equalsIgnoreCase(signature); // 与微信传递过来的签名进行比较
    }

    public static String getSHA1String(String data) {
        return DigestUtils.sha1Hex(data); // 使用commons codec生成sha1字符串
    }

    /**
     * 将 signature, timestamp, nonce 生成字符串
     * 
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static String getData(String signature, String timestamp, String nonce) {
        String[] arr = new String[] { token, timestamp, nonce };
        // 排序
        Arrays.sort(arr);
        // 生成字符串
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        String contentStr = content.toString();
        return contentStr;
    }

    /**
     * 获取解析后的签名
     * 
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static String getSignature(String signature, String timestamp, String nonce) {
        String temp = getSHA1String(getData(signature, timestamp, nonce));
        return temp;
    }
}
PropertyUtil 用来读取配置文件里的参数的工具类
package com.wx.util;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Properties;
/**
 * Property文件加载工具类
 * 
 * @author HuPan
 *
 */
public class PropertyUtil {

    private static Properties props;

    static {
        loadProps();
    }

    /**
     * 加载 properties 文件
     */
    synchronized static void loadProps() {
        System.out.println("======= 开始加载 config.properties 文件内容 =======");
        props = new Properties();
        InputStream inputStream = null;
        try {
            inputStream = PropertyUtil.class.getResourceAsStream("/config/properties/config.properties");
            props.load(inputStream);
        } catch (FileNotFoundException e) {
            System.out.println("======= config.properties 文件未找到 =======");
        } catch (IOException e) {
            System.out.println("======= 开始加载 config.properties 出现异常 =======");
        } finally {
            try {
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (IOException e) {
                System.out.println("======= 开始关闭 config.properties 出现异常 =======");
            }
        }
        System.out.println("======= 加载 config.properties 文件内容成功 =======");
        System.out.println("======= 正在读取 config.properties 文件内容 =======");
        Iterator> it = props.entrySet().iterator();
        while (it.hasNext()) {
            Entry entry = it.next();
            Object key = entry.getKey();
            Object value = entry.getValue();
            System.out.println("key:" + key + "\t\t\t" + "value:" + value);
        }
        System.out.println("======= 读取 config.properties 文件内容成功 =======");
    }

    public static String getProperty(String key) {
        if (null == props) {
            loadProps();
        }
        return props.getProperty(key);
    }

    public static String getProperty(String key, String defaultValue) {
        if (null == props) {
            loadProps();
        }
        return props.getProperty(key, defaultValue);
    }
}
config.properties 用来配置TOKEN的值
TOKEN = xxx

3、开始调试

  • 检查启动看是否报错,然后访问 http://localhost:8080/weixin/index ,看控制台是否报空指针异常,是则代码没有问题
  • 发布代码到服务器上。[服务器配置:Tomcat v8.0 + jdk 1.8+]
  • 启动服务器。
  • 在微信公众平台上打开 开发[基本配置] --> 填写基本配置信息[或者修改基本信息],如图所示。


    [一]微信公众号开发[订阅号] —— 接入微信公众号_第1张图片
    基本配置
  • 注意:

    URL:只能是80或者443端口
    URL:只能是备案后的域名或者用映射工具将本地的服务器映射到公网
    Token:此处 Token 必须与 config.properties 的 TOKEN 保持一致

4、成功:配置成功

  • 失败:检查TOKEN是否唯一,检查环境以及代码……
    内网映射工具:https://www.ngrok.cc/
    微信公众号接入请参考博文:
    http://www.cnblogs.com/liuhongfeng/p/4846441.html
    http://www.cnblogs.com/wqsbk/p/5977797.html
    http://blog.csdn.net/jaybill/article/details/52966430
    https://blog.yimik.com/archives/840
    失败原因请参考博文:
    http://www.cnblogs.com/VicTang/p/4799518.html
    [一]微信公众号开发[订阅号] —— 接入微信公众号_第2张图片
    项目结构
[一]微信公众号开发[订阅号] —— 接入微信公众号_第3张图片
WexinController
[一]微信公众号开发[订阅号] —— 接入微信公众号_第4张图片
CheckUtil
[一]微信公众号开发[订阅号] —— 接入微信公众号_第5张图片
PropertyUtil

写在结尾的话,第一次接触微信公众号,这是我的一点小小的学习心得,浅显之间,希望各位大牛们多多批评指正,也希望能帮助那些初入微信公众号开发的朋友们。在此拜谢各位多多支持。

你可能感兴趣的:([一]微信公众号开发[订阅号] —— 接入微信公众号)