思路
- 微信公众平台上开启开发者模式
- 服务器后台代码实现
具体实现如下:
微信公众平台上开启开发者模式
登录微信公众平台,在 开发 —-> 基本配置菜单中
服务器端
spring.xml 文件中添加如下代码
<servlet>
<servlet-name>wechatServlet</servlet-name>
<servlet-class>你的实现接口验证的类,我这里是AccessAndDo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>wechatServlet</servlet-name>
<url-pattern>/wechat.do</url-pattern>
</servlet-mapping>
AccessAndDo 类
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import *.Constant; // 涉及到公司隐私,路径以*号代替
import *.CheckSignature;
import *.CreateMenu;
import *.GetAccessToken;
/**
* 链接微信接口,获取来自微信的请求,并响应
* @author ligj
*
*/
public class AccessAndDo extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 确认请求来自微信服务器
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, 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();
if (CheckSignature.checkSign(signature, timestamp, nonce, Constant.authToken)) {
out.print(echostr); // 校验通过,原样返回echostr参数内容
}
}
/**
* 处理微信服务器发来的消息
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 调用核心业务类接收消息、处理消息
String respMessage = HandlingEvents.handlingEvents(request);
// 响应消息
PrintWriter out = response.getWriter();
out.print(respMessage);
out.close();
}
}
CheckSignature.checkSign 方法如下
/**
* 链接微信时,验证是否时微信发来的请求
*
* @author liguiji
*
*/
public class CheckSignature {
public static Boolean checkSign(String signature, String timestamp,
String nonce, String token) {
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]);
}
// sha1加密
String temp = SHA1.getSha1(content.toString());
// 与微信传递过来的签名进行比较
return temp.equals(signature);
}
}
Constant 类如下
import cn.eleph.util.PropertyUtil;
public class Constant {
// 微信服务号开发 账号
public static final String appid = PropertyUtil.getProperty("appId");
// 微信服务号开发 密码
public static final String secret = PropertyUtil.getProperty("appSecret");
// 微信服务号开发 链接微信接口校验码 即在微信公众平台上填写的 令牌(Token) 内容
public static final String authToken = PropertyUtil.getProperty("authToken");
}
PropertyUtil 类详见这里写链接内容
接入验证成功后,微信公众平台上方会有一个绿色的验证成功提示。