a.微信公众号介绍
1.分为服务号,订阅号,小程序,企业微信;
2.当用户在微信公众号发消息时,会把信息发送给微信服务器,
公众号管理员在管理平台指定规则保存到微信服务器,
微信服务器会根据设置好的规则区和公众号交互;
3.当自己开发的程序,希望微信服务器不处理请求,
而是把请求推送到我们自己的程序中处理请求,
然后将结果返回给微信服务,微信服务器在将结果返回给用户;
b.开发环境搭建
1.开发好的程序在自己电脑通过浏览器是可以直接访问的;
另外一台电脑是没有办法访问的,我们可以让这些电脑连接
到同一个局域网中,然后通过ip访问;
2.在互联网上其他的人是看不到我们开发的程序的,出发把程序发到到云服务器上;
在开发的过程中我们需要程序需要和微信服务器做对接,
如果微信服务器不能找到我们程序就没有办法对接,所以在开发时,
我们首先需要做内网穿透;
3.内网穿透目的时为了让我们的项目可以被互联网上的其他电脑访问;
内网穿透软件:花生壳,nat123,ngrok(免费,不是很稳定)
内网穿透原理:
4.ngrok:http://www.ngrok.cc/
1.下载,注册账号;
2.开通隧道
协议:http
名称:随便写;
前置域名:随便写;
本地端口: localhost:80(本地项目访问端口)
其他不需要填写;
3.复制隧道id,启动ngrok客户端;
c.开发接入
1.开发接入准备
a.登录微信公众号平台(需要修改开发》基本配置);
b.个人账号下很多的功能都无法使用,微信提供了测试账号申请
(https://mp.weixin.qq.com/–>服务号–》开发文档–》开始开发—》接口测试号申请);
c. 接入微信公众平台开发,开发者需要按照如下步骤完成:
https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
2.url 内网穿透的url+项目名+方法名
token:需要和代码中的一致;
相关代码
@RequestMapping("/index")
public String index(HttpServletRequest request) {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
System.out.println(signature+"\n"+timestamp+"\n"+nonce+"\n"+echostr);
if(check(timestamp,nonce,signature,TOKEN)) {
System.out.println("接入成功");
}else {
System.out.println("接入失败");
}
return "index";
}
/**
* 校验参数
* @param timestamp
* @param nonce
* @param signature
* @param token
* @return
*/
private boolean check(String timestamp, String nonce, String signature,String token) {
//1.将token、timestamp、nonce三个参数进行字典序排序
String [] str = {token,timestamp,nonce};
Arrays.sort(str);
//2)将三个参数字符串拼接成一个字符串进行sha1加密
String strs = str[0]+str[1]+str[2];
String mysig= sha1(strs);
System.out.println("mysig:---->"+mysig);
//3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
return mysig.equals(signature);
}
private String sha1(String strs) {
// TODO Auto-generated method stub
try {
//获取加密对象
MessageDigest md = MessageDigest.getInstance("sha1");
//加密处理
byte[] digest = md.digest(strs.getBytes());
//处理加密结果
char [] chars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append((chars)[(b>>4)&15]);
sb.append(chars[b&15]);
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}