微信服務器發送 GET 請求攜帶四參數:signature、timestamp、nonce、echostr。開發者需:
token、timestamp、nonce 字典序排序signature,相等則原樣返回 echostr,接入成功@WebServlet("/CoreServlet")
public class CoreServlet extends HttpServlet {
private static final String TOKEN = "wgyscsf";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
String[] arr = {TOKEN, timestamp, nonce};
Arrays.sort(arr); // 字典序
StringBuilder sb = new StringBuilder();
for (String s : arr) sb.append(s);
String sha1 = SHA1.encode(sb.toString()); // 需自行實現或引用工具類
if (sha1.equals(signature)) {
out.print(echostr); // 驗證通過
} else {
out.print(""); // 驗證失敗
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp); // 後續消息推送也走此入口
}
}
public class SHA1 {
public static String encode(String str) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(str.getBytes(StandardCharsets.UTF_8));
StringBuilder hex = new StringBuilder();
for (byte b : digest) {
String h = Integer.toHexString(b & 0xFF);
if (h.length() == 1) hex.append('0');
hex.append(h);
}
return hex.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
https://IP:Port/ContextPath/CoreServlet