一、准备环境
1、JDK1.6及以上版本
2、MyEclipse
3、Tomcat
4、Ngrok(搭建本地服务器)
二、具体操作步骤
1.访问微信公众平台开发者手册 https://mp.weixin.qq.com/wiki 如下是接入规则(来自开发者手册):
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 |
2、接入微信开发者模式开始
我们细细品味微信提供的规则:若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败
我们索性就在get方法中获取echostr直接返回,按照此规则,我先来创建一个web项目,并创建一个Servlet,代码如下:
1 public class WeixinServlet extends HttpServlet{ 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { 4 String signature = req.getParameter("signature"); 5 String timestamp = req.getParameter("timestamp"); 6 String nonce = req.getParameter("nonce"); 7 String echostr = req.getParameter("echostr"); 8 9 PrintWriter out = resp.getWriter(); 10 if(CheckUtil.checkSignature(signature, timestamp, nonce)){ 11 out.print(echostr); 12 } 13 } 14 15 @Override 16 protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException { 17 doGet(req, resp); 18 }
因为我们现在用的是servlet需要在web.xml中添加配置信息,代码如下:
1 <servlet> 2 <servlet-name>weixinServlet</servlet-name> 3 <servlet-class>com.weixin.servlet.WeixinServlet</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>weixinServlet</servlet-name> 7 <url-pattern>/wx.do</url-pattern> 8 </servlet-mapping>
将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
检验signature的Java示例代码:
1 public class CheckUtil { 2 private static final String token = "icon";//token是在验证的时候进行配置的 3 public static boolean checkSignature(String signature,String timestamp,String nonce){ 4 String[] arr = new String[]{token,timestamp,nonce}; 5 //排序 6 Arrays.sort(arr); 7 //生成字符串 8 StringBuffer content = new StringBuffer(); 9 for(int i=0;i<arr.length;i++){ 10 content.append(arr[i]); 11 } 12 //sha1加密 13 String temp = getSha1(content.toString()); 14 return temp.equals(signature); 15 } 16 public static String getSha1(String str){ 17 if (null == str || 0 == str.length()){ 18 return null; 19 } 20 char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 21 'a', 'b', 'c', 'd', 'e', 'f'}; 22 try { 23 MessageDigest mdTemp = MessageDigest.getInstance("SHA1"); 24 mdTemp.update(str.getBytes("UTF-8")); 25 26 byte[] md = mdTemp.digest(); 27 int j = md.length; 28 char[] buf = new char[j * 2]; 29 int k = 0; 30 for (int i = 0; i < j; i++) { 31 byte byte0 = md[i]; 32 buf[k++] = hexDigits[byte0 >>> 4 & 0xf]; 33 buf[k++] = hexDigits[byte0 & 0xf]; 34 } 35 return new String(buf); 36 } catch (Exception e) { 37 return null; 38 } 39 } 40 }
3.微信公众号测试号调试配置
设置完成之后点击提交,提示配置成功就可以了。