首先我们来看两张图,第一张是微信公众号中设置的图
第二张是测试号中的图片,之所以打马赛克是怕不良之心的人,如果有疑问可以在文章后留言,因为本人在这个问题上捣鼓了好几天,所以比较有心得,而微信公众号的开发文档或者百度的资料都不多,所以很容易走弯路
现在讲讲接口配置信息里面的url和token到底填啥
微信需要一个请求一个URL来响应token验证,也就是你点击确定的时候是向你指定的URL发送一个请求,在请求里面验证你的token是否正确。也就是我们需要一个外网接口让微信访问,这个接口不需要传入任何参数;注意必须是外网服务器接口,微信才能调用.
所以需要写一个接口放在服务器上
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/wechat")
@Controller
public class WechatController {
private static Logger logger = Logger.getLogger(WechatController.class);
private static String WECHAT_TOKEN = "wx_oms";
@RequestMapping(value = "/wx.do")
public void get(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.error("WechatController ---- WechatController");
System.out.println("========WechatController========= ");
logger.info("请求进来了...");
Enumeration pNames = request.getParameterNames();
while (pNames.hasMoreElements()) {
String name = (String) pNames.nextElement();
String value = request.getParameter(name);
// out.print(name + "=" + value);
String log = "name =" + name + " value =" + value;
logger.error(log);
}
String signature = request.getParameter("signature");/// 微信加密签名
String timestamp = request.getParameter("timestamp");/// 时间戳
String nonce = request.getParameter("nonce"); /// 随机数
String echostr = request.getParameter("echostr"); // 随机字符串
PrintWriter out = response.getWriter();
//if (SignUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
// }s
out.close();
// out = null;
}
}
现在我来讲讲验证原理:微信使用我们提供的token,通过算法生成签名,然后将这几个参数(signature ,timestamp ,nonceechostr )传给我们,我们服务端通过我们提供的token按照微信的算法得出一个值,如果是同一个值说明token有效
现在你需要通过之前说的那个外网可以访问的url访问到我们这个类,也就是用url+' /wechat/wx.do '访问到我们的方法,这样微信就可以拿到我们的token了,然后就把这个url+' /wechat/wx.do '填写在url的地方,你自己在代码中设置的token填写在token的地方就可以完成验证了