- 填写好域名(ps:域名需要通过备案,没有则失败)
- 注意是直接到你的项目名字地方,还有就是你的端口一定要是80端口或者是443端口,如果你是云上的服务器,可以将80端口映射到你的tomcat端口上面
80端口直接映射到tomcat的8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
- 这里填写url的时候,你要填写到你的servlet响应的一整条路劲,因为这里,微信服务器,会发送一天get请求到这个url,然后根据你的返回的数值,来判断是否成功
现在开始代码:
首先是你的Servlet处理代码
package weChatServlet;
import javax.servlet.ServletException;
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;
public class weChatAccounts extends HttpServlet {
// static Logger logger = LoggerFactory.getLogger(weChatAccounts.class);
/*
* 自定义token, 用作生成签名,从而验证安全性
* */
private final String TOKEN = "cherry";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-----开始校验签名-----");
/**
* 接收微信服务器发送请求时传递过来的参数
*/
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce"); //随机数
String echostr = req.getParameter("echostr");//随机字符串
/**
* 将token、timestamp、nonce三个参数进行字典序排序
* 并拼接为一个字符串
*/
String sortStr = sort(TOKEN,timestamp,nonce);
/**
* 字符串进行shal加密
*/
String mySignature = shal(sortStr);
/**
* 校验微信服务器传递过来的签名 和 加密后的字符串是否一致, 若一致则签名通过
*/
if(!"".equals(signature) && !"".equals(mySignature) && signature.equals(mySignature)){
System.out.println("-----pass-----");
resp.getWriter().write(echostr);
}else {
System.out.println("-----down-----");
}
}
/**
* 参数排序
* @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();
}
/**
* 字符串进行shal加密
* @param str
* @return
*/
public String shal(String str){
try {
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update(str.getBytes());
byte messageDigest[] = digest.digest();
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 "";
}
}
web.xml代码如下
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>weChatServlet</servlet-name>
<servlet-class>weChatServlet.weChatAccounts</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>weChatServlet</servlet-name>
<url-pattern>/weChatServlet</url-pattern> <!--url-pattern必须与servlet-name一致-->
</servlet-mapping>
</web-app>
项目地址github
至此配置完成,我使用的是阿里云服务器+tomcat进行访问的,实践有效,如有问题,欢迎交流~