欢迎加入群:347245650 345531810 进行讨论相互交流 我的微信号:572838485
我的微信公众账号 我的微社区欢迎关注
图床:没有服务器 拖拽图片
外网即可访问
http://2.crazyflower.duapp.com/home
微信公众帐号申请成功后,要想接收处理用户的请求,就必须要在“高级功能”里进行配置,点击“高级功能”,将看到如下界面
从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种模式是互斥关系,即两种模式不能同时开启。那两种模式有什么区别呢?
编辑模式:主要针对非编程人员及信息发布类公众帐号使用。开启该模式后,可以方便地通过界面配置“自定义菜单”(认证的订阅号、服务号)和“自动回复的消息”。
开发模式:主要针对具备开发能力的人使用。开启该模式后,能够使用微信公众平台开放的接口,通过编程方式实现自定义菜单的创建、删除、用户消息的交互。这种模式更加灵活,建议有接触过开发的人员用该模式。
编辑模式与开发模式 二者只能开启一个
1、编辑模式请看:http://www.cnblogs.com/zyw-205520/p/3516495.html
2、开发模式
1)PHP开发者接入:http://www.cnblogs.com/zyw-205520/p/3500761.html
2)Java开发者接入如下
详细的接口文档说明:微信接口文档
创建一个Java
Web工程,命名任意,
代码如下
1 package com.javen.course.servlet; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import com.javen.course.service.CrazyService; 12 import com.javen.course.util.SignUtil; 13 14 /** 15 * 核心请求处理类 16 * @author 简爱微萌 17 * @Email zyw205@gmail.com 18 * 19 */ 20 public class CrazyServlet extends HttpServlet { 21 22 private static final long serialVersionUID = -5021188348833856475L; 23 @Override 24 protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { 25 // 微信加密签名 26 String signature = request.getParameter("signature"); 27 // 时间戳 28 String timestamp = request.getParameter("timestamp"); 29 // 随机数 30 String nonce = request.getParameter("nonce"); 31 // 随机字符串 32 String echostr = request.getParameter("echostr"); 33 PrintWriter out = response.getWriter(); 34 // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 35 if (SignUtil.checkSignature(signature, timestamp, nonce)) { 36 out.print(echostr); 37 } 38 out.close(); 39 out = null; 40 } 41 42 43 @Override 44 protected void doPost(HttpServletRequest request, HttpServletResponse response) 45 throws ServletException, IOException { 46 // TODO 消息的接收、处理、响应 47 } 48 }
代码中只完成了doGet方法,它的作用正是确认请求是否来自于微信服务器;而doPost方法这里验证不需要我们先放着。
在doGet方法中调用了SignUtil.java 实现代码如下:
1 package com.javen.course.util; 2 3 import java.security.MessageDigest; 4 import java.security.NoSuchAlgorithmException; 5 import java.util.Arrays; 6 7 /** 8 * 请求校验工具类 9 * @author 简爱微萌 10 * @Email zyw205@gmial.com 11 * 12 */ 13 public class SignUtil { 14 // 与接口配置信息中的Token要一致 15 private static String token = "Javen"; 16 17 /** 18 * 验证签名 19 * 20 * @param signature 21 * @param timestamp 22 * @param nonce 23 * @return 24 */ 25 public static boolean checkSignature(String signature, String timestamp, String nonce) { 26 String[] arr = new String[] { token, timestamp, nonce }; 27 // 将token、timestamp、nonce三个参数进行字典序排序 28 Arrays.sort(arr); 29 StringBuilder content = new StringBuilder(); 30 for (int i = 0; i < arr.length; i++) { 31 content.append(arr[i]); 32 } 33 MessageDigest md = null; 34 String tmpStr = null; 35 36 try { 37 md = MessageDigest.getInstance("SHA-1"); 38 // 将三个参数字符串拼接成一个字符串进行sha1加密 39 byte[] digest = md.digest(content.toString().getBytes()); 40 tmpStr = byteToStr(digest); 41 } catch (NoSuchAlgorithmException e) { 42 e.printStackTrace(); 43 } 44 45 content = null; 46 // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 47 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; 48 } 49 50 /** 51 * 将字节数组转换为十六进制字符串 52 * 53 * @param byteArray 54 * @return 55 */ 56 private static String byteToStr(byte[] byteArray) { 57 String strDigest = ""; 58 for (int i = 0; i < byteArray.length; i++) { 59 strDigest += byteToHexStr(byteArray[i]); 60 } 61 return strDigest; 62 } 63 64 /** 65 * 将字节转换为十六进制字符串 66 * 67 * @param mByte 68 * @return 69 */ 70 private static String byteToHexStr(byte mByte) { 71 char[] Digit = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘ }; 72 char[] tempArr = new char[2]; 73 tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; 74 tempArr[1] = Digit[mByte & 0X0F]; 75 76 String s = new String(tempArr); 77 return s; 78 } 79 }
注意:SignUtil类中的成员变量token,这里赋予什么值,在接口配置信息中的Token就要填写什么值,两边要保持一致
最后再来看一下CoreServlet是怎么配置的,web.xml中的配置代码如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 3 <display-name></display-name> 4 <servlet> 5 <servlet-name>CrazyServlet</servlet-name> 6 <servlet-class> 7 com.javen.course.servlet.CrazyServlet 8 </servlet-class> 9 </servlet> 15 16 <servlet-mapping> 17 <servlet-name>CrazyServlet</servlet-name> 18 <url-pattern>/Javen</url-pattern> 19 </servlet-mapping> 20 24 <welcome-file-list> 25 <welcome-file>index.jsp</welcome-file> 26 </welcome-file-list> 27 </web-app>
到目前为止,所有编码都完成了,就是这么简单。接下来就是将工程发布到公网服务器上,如果没有公网服务器环境,可以去了解下BAE、SAE或者租赁一个服务器。发布到服务器上后,我们在浏览器里访http://你服务器的Ip或者域名/Javen(项目名)/Javen,如果看到如下界面就表示我们的代码没有问题:
PS:在浏览器中直接访问就相当于提交的是GET请求,而我们什么参数都没有传,在验证的时候当然会报空指针异常。
最好在功能>>高级功能>>开发模式中填写对应的URL和Token即可 没有找到页面的可以参考 http://www.cnblogs.com/zyw-205520/p/3500761.html
我的微信公众账号 人脸识别、天气查询、公交查询、周公解梦、星座运势、手机归属地查询、聊天唠嗑等