注:订阅号操作
登录微信公众平台 --> 开发[基本配置] --> 填写基本配置信息 --> 接入微信公众平台
1、搭建环境
- [楼主环境:
SpringMVC
+Mybatis
,Tomcat v8.0
,Jdk1.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
config.properties 用来配置TOKEN的值
TOKEN = xxx
3、开始调试
- 检查启动看是否报错,然后访问 http://localhost:8080/weixin/index ,看控制台是否报空指针异常,是则代码没有问题
- 发布代码到服务器上。[服务器配置:
Tomcat v8.0
+jdk 1.8+
] - 启动服务器。
-
在微信公众平台上打开 开发[基本配置] --> 填写基本配置信息[或者修改基本信息],如图所示。
- 注意:
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
写在结尾的话,第一次接触微信公众号,这是我的一点小小的学习心得,浅显之间,希望各位大牛们多多批评指正,也希望能帮助那些初入微信公众号开发的朋友们。在此拜谢各位多多支持。