1.微信公众号开发准备
相关博客:
https://blog.csdn.net/Abysscarry/article/details/89071469
1.注册微信公众号账号
2.开发环境准备
1.开发好的程序在自己电脑通过浏览器是可以直接访问的;
另外一台电脑是没有办法访问的,我们可以让这些电脑连接
到同一个局域网中,然后通过ip访问;
2.在互联网上是访问不到我们本地的程序的,只有把程序放到
云服务器上才可以在互联网上访问;
3.在开发的过程中我们需要程序和微信服务器进行网络通信,
如果微信服务器不能找到我们程序就没有办法进行网络通信,
所以在开发时,为了让我们的项目可以被互联网上的其他电脑访问,
我们需要做内网穿透;
4.内网穿透软件:花生壳,nat123,ngrok(免费,不是很稳定)
5.ngrok:http://www.ngrok.cc/
1.下载,注册账号;
2.开通隧道
协议:http;
名称:随便写;
前置域名:随便写;
本地端口: localhost:80(本地项目访问端口)
其他不需要填写;
3.复制隧道id,启动ngrok客户端;
6.接入微信公众平台开发步骤:
1、填写服务器配置
1.服务器地址(内网穿透工具的域名)
2.token 需要和程序中一致;
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
/**
* 接入微信公众平台开发
* 1.填写服务器配置;
* a.开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上;
* 2.验证消息的确来自微信服务器
* a.开发者通过检验signature对请求进行校验,确认此次GET请求来自微信服务器,
* 请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败;
* 3.第三步:依据接口文档实现业务逻辑;
* @param request
* @param response
* @throws IOException
*/
@RequestMapping(value="/start",method = RequestMethod.GET)
public void start(HttpServletRequest request,HttpServletResponse response) throws IOException {
//验证消息的确来自微信服务器
if(wechatUtil.check(request)) {
PrintWriter writer = response.getWriter();
writer.write( request.getParameter("echostr"));
writer.flush();
writer.close();
System.out.println("接入成功");
}else {
System.out.println("接入失败");
}
}
/**
* 验证消息的确来自微信服务器
* @param timestamp
* @param nonce
* @param signature
* @param token
* @return
*/
public boolean check(HttpServletRequest request) {
//微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
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);
//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);
}
/**
* 加密处理
* @param strs
* @return
*/
public 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;
}