微信公众号开发(一)开发者接入微信公众号

微信公众号开发(一)开发者接入微信公众号

1.前言

该文章基于JDK1.8 springboot2.1.7.RELEASE环境

实现开发者第一次接入微信公众号后台的需求

2.准备工作

2.1 进入微信公众平台注册账号

https://mp.weixin.qq.com/

个人用户建议注册订阅号

2.2 内网穿透

因为要直接用内网本机开发调试,微信网页授权在回调时要访问本机,所以直接做个内网穿透,可以直接在外网访问到本机,做法如下:

  1. 登录 https://natapp.cn/ (我用的natapp.cn,你可以用其他类似的,个人感觉这个不错)

  2. 购买隧道:购买后使用方式:

    参考官方教程:https://natapp.cn/article/natapp_newbie

使用后会得到natapp分配的网址,如 xxx.natapp.cn,这个地址就可以访问到开发本机。

  1. 下载并配置config.ini, 运行natapp

3.接入认证成为开发者

可参考微信官方开发文档 https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

3.1 填写服务器配置

登录微信公众号开发平台:https://mp.weixin.qq.com/ 开发开发者工具公众平台测试账号

  • Tips:
  1. 微信公众号接口必须以http://或https://开头,分别支持80端口和443端口!
  2. 这里的url可以选择自己买的服务器地址,记得必须开放80端口去使用! 或者使用内网映射外网工具生成一个域名地址供给你开发使用,此方法自行百度,如下就是其中一种使用~
  3. 目前提交是无法配置成功的, 不要着急

3.2 提交验证URL有效性

3.2.1 搭建SpingBoot工程

项目结构

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>

application.yaml

1
2
3
4
5
6
wechat:
mpAppId: xxxxxxxx #公众平台测试账号---测试号信息, 目前可以不填
mpAppSecret: xxxxxx #公众平台测试账号---测试号信息, 目前可以不填
mpToken: xxxxx #与前面在公众平台测试账号---接口配置信息所填写保持一致
server:
port: 80 #端口号

sha1加密工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class SecurityUtil {
public static String sha1(String str) {
try {
StringBuilder sb = new StringBuilder();
MessageDigest digest = MessageDigest.getInstance("sha1");
// 放入加密字符串
digest.update(str.getBytes());
// 进行加密
byte[] digestMsg = digest.digest();
// byte转换16进制
for (byte b : digestMsg) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return str;
}
}
1
2
3
4
5
6
7
8
@Data
@Component
@ConfigurationProperties(prefix = "wechat")
public class WechatAccountConfig {
private String mpAppId;
private String mpAppSecret;
private String mpToken;
}

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Slf4j
@RestController
@RequestMapping("/wechat/index")
public class IndexController {
@Autowired
private WechatAccountConfig wechatAccountConfig;



/**
* 处理微信认证:验证服务器地址的有效性,get提交
* signature: 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
* timestamp 时间戳
* nonce: 随机数
* echostr: 随机字符串
*/
@GetMapping
public void checkSignature(HttpServletRequest request, HttpServletResponse response) throws IOException, IOException {
System.out.println("============= 处理微信认证 ===============");
// 拿到微信的请求参数
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
// TODO 这里的token是微信公众平台上自己所配的!
String token = wechatAccountConfig.getMpToken();

// ① 将token、timestamp、nonce三个参数进行字典序排序 b a d c h ==>a b c d h
String[] strArr = {token, timestamp, nonce};
// 字典排序
Arrays.sort(strArr);
// ② 将三个参数字符串拼接成一个字符串进行sha1加密
StringBuffer sb = new StringBuffer();
// 字符串拼接
for (String str : strArr) {
sb.append(str);
}
// 加密
String sha1Str = SecurityUtil.sha1(sb.toString());
// ③ 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (sha1Str.equals(signature)) {
// 如果相等,就是来自微信请求
// 若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效
response.getWriter().println(echostr);
}
}
}

启动类

1
2
3
4
5
6
@SpringBootApplication
public class WeChatService {
public static void main(String[] args) {
SpringApplication.run(WeChatService.class);
}
}
3.2.2 测试
  1. 启动该SpringBoot项目
  2. 回到公众平台测试账号—接口配置信息, 点击提交即可
请作者喝瓶肥宅快乐水