200.微信公众号开发【接入】
第一步:申请微信公众号
注意,个人只能选择订阅号
这里需要注意,要用一个绑定了银行卡的微信号扫码才能注册。
第二步:公众号开发环境准备
- 需要一个微信公众号
- 需要一个外网映射工具(如ngrok、花生壳、NAT123等),直接是公网IP的忽略这条。
与微信对接的URL需要具备的条件:
- 公网上能访问
- 需要支持80端口(58.xxx.194.xx正好支持80和公网,所以上面第2条忽略)
注意:早期是可以使用IP地址的,现在必须使用认证的域名
Ngrok是国外的服务器,不太稳定,可以寻找国内的,比如Tunnel(现在失效了)
映射完成后得到:
第三步:进入开发模式,查看接入指南
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319&token=&lang=zh_CN
两个是互斥的,开启开发模式,编辑模式就失效;开启编辑模式,开发模式就失效
第四步:开始接入微信【doGet做验证,doPost做消息处理】
- 创建一个Java Web项目
- 创建一个Servlet,在Servlet中的Get方法中接受服务器发来的几个参数
- 创建一个工具类,用来验证服务器发来的参数(具体验证方法微信有要求)
1)将token、timestamp、nonce三个参数进行字典序排序(token是自己随便填的)
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
public class CheckUtil {
private static final String token = "njusttz";
public static boolean checkSignatrue(String signature,String timestamp,String nonce){
String[] arr = new String[]{token,timestamp,nonce};
//对网络上传来的三个参数排序
Arrays.sort(arr);
//拼接成字符串
StringBuffer content = new StringBuffer();
for(int i = 0; i<arr.length;i++){
content.append(arr[i]);
}
//SHA1加密
String temp = SHA1.hex_sha1(content.toString());
return temp.equals(signature);
}
}
下面是Servlet中的doGet方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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(CheckUtil.checkSignatrue(signature, timestamp, nonce)){
out.print(echostr);
}
}
然后用公网IP进行测试一下Servlet,因为没有传参数,所以结果是:
500服务器错误,说明已经访问到了服务器。
第五步:将这个Servlet地址配置到微信平台
在开发—》基本配置 里设置如下:
完成后点击提交,如果提交成功,就说明接入成功了。