java 微信公众号接入

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;
}
发布了194 篇原创文章 · 获赞 11 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_29393273/article/details/104881296