上一节课说的比较啰嗦,所以额外又写了一节简洁版的。想看详细版请点击java微信公众平台接入。
微信公众平台服务器配置需要两个参数,一个是URL,另一个是token,假如我们的服务器ip为100.200.300.400,那么URL配置为http://100.200.300.400/weChat/weChatServlet,token可以任意取,假如我们token取名为weixinTest,模式为明文模式。
weChatServlet是一个普通的javaservlet,代码为:
package com.test; 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; /** * 核心请求处理类 */ public class WeChatServlet extends HttpServlet { private static final long serialVersionUID = 1508798736675904038L; /** * 确认请求来自微信服务器 */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 微信加密签名 String signature = request.getParameter("signature"); System.out.println("微信加密签名signature:-----------------------"+signature); // 时间戳 String timestamp = request.getParameter("timestamp"); System.out.println("时间戳timestamp:-----------------------"+timestamp); // 随机数 String nonce = request.getParameter("nonce"); System.out.println("随机数nonce:-----------------------"+nonce); // 随机字符串 String echostr = request.getParameter("echostr"); System.out.println("随机字符串echostr:-----------------------"+echostr); //System.out.println("token-----------------------:"+token); PrintWriter out = response.getWriter(); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignUtil.checkSignature("weixinTest", signature, timestamp, nonce)) { out.print(echostr); //System.out.println("这是:"+echostr); } out.close(); out = null; } /** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
根据微信文档,接入的时候只是get请求,所以在这里dopost暂且搁置,只填充doget方法,还有个工具类SignUtil,作用为通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败。代码如下:
package com.test; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 请求校验工具类 */ public class SignUtil { /** * 验证签名 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String token, String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 将字节数组转换为十六进制字符串 * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将字节转换为十六进制字符串 * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; } }
代码写好了,直接把代码项目部署到linux服务器tomcat下的webapps目录,weChat是项目
名称,公众平台配置好URL token 点击提交,查看tomcat日志,看是否有打印输出,观察提交提示信息,如果提示失败有可能是以下原因造成:
1,URL配置不正确
2,servlet代码不正确
3,servlet代码中的token值和微信配置的不一致
4,项目并未运行在80端口
5,检验signature的工具类代码不正确。
6,服务器的tomcat未启动(我在这里用的tomcat 你也可以用其它web容器
7,servlet请求路径错误,可以在本地测试下servlet请求
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程