上一篇博客初始化项目已经完成,现在我们继续学习
1.装填spring-boot-starter-weixin依赖并完成快速开发框架的前置代码(README.md)
pom.xml填写依赖
完整依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>spring-boot-starter-weixin</artifactId>
<version>1.3.6</version>
</dependency>
</dependencies>
boot入口函数RedDustFootprintApplication开启缓存注解
配置文件application.yml
这个配置文件我配了我自己服务器的数据库和redis缓存,如果只是单纯的微信后台而不牵扯数据存储是可以不写的,这是我直接照搬的以前写过的
这三个方框的参数是很重要的,这是你链接微信官方接口的通行证
这是测试号
这是正式号
然后我们直接写控制器
@WxMsgController("/weixin/wx")
public class WeixinController extends DreamMsgControllerAdapter {
@Autowired
private DreamWeixinProperties weixinProperties;
@Override
protected void processInFollowEvent(InFollowEvent inFollowEvent) {
OutTextMsg outMsg = new OutTextMsg(inFollowEvent);
outMsg.setContent("关注消息~");
render(outMsg);
}
@Override
protected void processInTextMsg(InTextMsg inTextMsg) {
System.out.println(weixinProperties.getWxaConfig().getAppId());
OutTextMsg outMsg = new OutTextMsg(inTextMsg);
outMsg.setContent(inTextMsg.getContent());
render(outMsg);
}
@Override
protected void processInMenuEvent(InMenuEvent inMenuEvent) {
OutTextMsg outMsg = new OutTextMsg(inMenuEvent);
outMsg.setContent("菜单消息~");
render(outMsg);
}
}
这个控制器最原始的代码是我照搬这个框架的demo的,主要是一个例子
做完这些我们运行一下,如果控制台不报错我们在继续
2.配置外网穿透
说到外网穿透自然是免费的最好了,因为我们只是个人偶尔使用
natapp官网
时间长了,我也忘了当时是怎么注册得了,想学的自己弄吧(总不至于一个注册还要教吧?那干脆别当程序员了)
natapp官网教程
这是我的配置,记住本地端口配到你的boot项目配置的端口就行了
启动natapp,复制下域名填到测试号接口配置信息URL
点击提交,出现配置成功即建立起与微信官网接口的联系
然后我们测试一下
用你的微信扫一下测试号界面中间的二维码关注一下
后台显示的信息是微信传递过来的信息,是xml类型的
微信开发文档有介绍,我这里就不说了,文档是每一个攻城狮或者程序员必须了解的东西
如果只是讲解方法也是太过于无趣了,不如我们来点有难度的,没兴趣或者基础的可以不看下边的了
扩展
首先建立连接是微信根据appid,appsecret,token进行的验证
开发文档中也有这样的一段说明
不严谨的,我们写个接口也不用校验直接原样将echoster发给微信服务器也可以对接成功,不过这样一来安全性大大的降低了,不是微信服务器的请求也会被直接对接
解析流程:
1.我们先来创建一个控制器WeiXinTestController,加上注解
@RestController
public class WeiXinTestController {
@GetMapping("/weixin")
public void test(String signature,String timestamp,String nonce,String echostr){
System.out.println(signature);
System.out.println(echostr);
}
}
运行项目,然后把微信配置的url由“/weixin/wx”改成“/weixin”提交
可以看到后台打印出
证明信息接收到了,这里接收参数太多可以写成对象实体,我就不写了,省点劲,这里也只是稍微讲点原理,也不是彻底剖析这个快速开发框架,水平还不到
那接下来就好办了,根据开发文档的校验流程去写
@RestController
public class WeiXinTestController {
@GetMapping("/weixin")
public void test(String signature,String timestamp,String nonce,String echostr){
String token = "123456";
String[] array = new String[]{token, timestamp, nonce};
Arrays.sort(array);
String tempStr = array[0] + array[1] + array[2];
tempStr = EncryptUtils.getShaUseApacheCodec(tempStr,"SHA-1");
System.out.println(tempStr);
System.out.println(signature);
}
}
这里用了一个加解密工具,是开源中国找到的(不用也可以,直接用依赖的加密方法)https://my.oschina.net/hongchq/blog/70348
还需要导入依赖
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
</dependency>
package com.test.weixin.controller;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import java.security.MessageDigest;
/**
* 加密方式工具类 (JDK1.6以上)
*/
public class EncryptUtils {
/**
* 使用指定的加密算法加密字符串<br>
* @param text 待加密的字符串
* @param encName 加密方法,为null时默认为SHA-256,可以为SHA-1,MD5,SHA-256,SHA-384,SHA-512
* @return
*/
public static byte[] degestString(String text, String encName) {
MessageDigest md = null;
byte[] bt = text.getBytes();
try {
if (null == encName) {
encName = "SHA-256";
}
md = MessageDigest.getInstance(encName);
md.update(bt);
return md.digest();
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
/**
* BASE64加密
* @param origin 待机解密的byte数组
* @return
*/
public static byte[] encryptBASE64(byte[] origin) {
if (origin == null) {
return null;
}
return Base64.encodeBase64(origin);
}
/**
* BASE64解密,采用Apache的commons-codec包中方法,不建议使用sun自己的
* @param dest 待解密的字节数组
* @return
*/
public static byte[] decryptBASE64(byte[] dest) {
if (dest == null) {
return null;
}
return Base64.decodeBase64(dest);
}
/**
* 使用Apache的codec加密,使用MD5算法<br>
* 注意:返回的字符串为小写,请比较时注意
* @param text 待加密的字符串
* @return
*/
public static String getMd5UseApacheCodec(String text) {
if (null == text) {
return null;
}
return DigestUtils.md5Hex(text);
}
/**
* 使用Apache的codec加密,使用SHA算法<br>
* 注意:返回值为小写字符,请比较时注意
* @param text 待加密的字符串
* @param algorithm 加密算法 SHA-1,SHA-256,SHA-384,SHA-512
* @return
*/
public static String getShaUseApacheCodec(String text, String algorithm) {
if (text == null) {
return null;
}
if (null == algorithm) {
return DigestUtils.shaHex(text);
} else {
if ("SHA-1".equals(algorithm)) {
return DigestUtils.shaHex(text);
} else if ("SHA-256".equals(algorithm)) {
return DigestUtils.sha256Hex(text);
} else if ("SHA-384".equals(algorithm)) {
return DigestUtils.sha384Hex(text);
} else if ("SHA-512".equals(algorithm)) {
return DigestUtils.sha512Hex(text);
} else {
return null;
}
}
}
}
这点java反而感觉写着难了,加解密没接触过,水平还是太低了
至于框架的签名校验部分我也找到了
项目这里
大概107行,用ctrl+左键找着就行了,对于这框架我毕竟不常用,而且快速开发嘛,对着文档会用就行了,提升水平才来找根源
至于这一个接口是怎么处理那么多事件(关注,消息,推广链接等)就是在于微信发送的消息了
微信发送的消息是xml数据包,本质还是字符串,以字符串接收过来进行xml方式的解析,然后找对应的格式就知道是什么类型的推送了,这里就不用多说了,可以直接找这个快速框架来学习
这个就是它的消息控制了