0%

现在尽量使用新的API,把Date换成LocalDateTime。

使用LocalDateTime时,我们可以通过如下方法把LocalDateTime转换为Unix Timestamp。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
System.out.println(System.currentTimeMillis());
System.out.println(now.toEpochSecond(ZoneOffset.of("+8")));
System.out.println(now.toInstant(ZoneOffset.of("+8")).toEpochMilli());
System.out.println(now.toInstant(ZoneOffset.UTC).toEpochMilli());
System.out.println(now.plusDays(1).toInstant(ZoneOffset.of("+8")).toEpochMilli());
}

2021-03-10T13:45:39.411
1615355139422
1615355139
1615355139411
1615383939411
1615441539411

LocalDateTime格式化为指定格式:

1
2
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd hh:mm:ss");
String timeStr = LocalDateTime.now().atZone(ZoneOffset.of("+8")).format(formatter);

举个例子,假如我要显示当前时间往后推4小时后,UTC的时间表示。

1
2
3
LocalDateTime now = LocalDateTime.now();
ZonedDateTime zonedDateTime = now.plusHours(4).atZone(ZoneOffset.ofHours(8));
String future = zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("YYYY-MM-dd hh:mm:ss"));

简单记录一下微信公众号开发流程,很多年前就开发过,然后过了一段时间,又完全忘了。还得一点一点看文档。所以这次先做一个记录。开发的功能就是,当用户发送消息以后,回复一条消息给用户。

申请微信开发测试号

先申请一个测试号,不需要注册什么,有微信,扫码一下就注册了。

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

进去后,我们可以获取到 appID, appsecret。Token是自己设置的,随便设置一个就行。aesKey在正式生产环境里面才需要。

内网穿透

微信开发后台需要连接到我们开发的电脑,一般情况下这台电脑是没有公网IP的,而且都是在局域网内,所以要把这台机器的端口映射出去。

ngrok.com 去注册一个账号就可以了。

然后按使用说明运行命令,把token存入本地。然后启动 ngrok,我是把本地 8080 映射要外网。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ./ngrok authtoken [token]
$ ./ngrok http 8080
ngrok by @inconshreveable (Ctrl+C to quit)

Session Status online
Account S (Plan: Free)
Version 2.3.35
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://020170f28e33.ngrok.io -> http://localhost:8080
Forwarding https://020170f28e33.ngrok.io -> http://localhost:8080

Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00

配置微信平台接口信息

weixin-java-mp-demo-springboot 项目要求,配置微信公众号中的接口地址:http://公网可访问域名/wx/portal/xxxxx (注意,xxxxx为对应公众号的appid值)

几年前,一般还要点两下才会成功,现在一下就成功了。

自动回复消息

我打算以回复一张图片。首先需要先上传一张图片,并得到其mediaId。

我们先看看这个项目的开发文档。

https://github.com/Wechat-Group/WxJava/wiki

找到微信公众号开发文档,永久素材管理页面,https://github.com/Wechat-Group/WxJava/wiki/MP_永久素材管理

然后写一段上传永久素材图片的代码。

1
2
3
4
5
WxMpMaterial wxMpMaterial = new WxMpMaterial();
wxMpMaterial.setFile(new File("/Users/simon/Desktop/logo.png"));
wxMpMaterial.setName("logo");
WxMpMaterialUploadResult res = wxMpService.getMaterialService().materialFileUpload("png", wxMpMaterial);
System.out.println(JsonUtils.toJson(res));

这时,我们就可以获得这个图片的 mediaId 了,然后修改 MsgHandler 的逻辑,返回一个 ImageBuilder 就可以了。

redirect_uri 参数错误

调试微信前公众号的时候,往往会遇到这个错误,这时,需要在 OAuth2.0 网页授权页面配置好授权回调页面域名。沙盒号回调地址支持域名和ip,正式公众号回调地址只支持域名。所以这里不能使用
localhost,但写成本地的ip地址是可以的。还需要特别注意的是,这里只能写ip和端口号,不能把协议http加入,不然还是会出现这个错误。

调试平台

我们可以通过调试平台来创建菜单,获取token等。获取token时,可能会遇到invalid ip, not in whitelist错误。

这时,需要把获取access_token的机器的ip添加到白名单中。位置在 基础配置 -> IP白名单

在某些网络下,IDEA 的插件市场打不开,就安装不了所需要的插件。造成不能访问的原因可能 jetbrains 相关域名解析的 ip 无法访问。

我们可以通过站长工具,查询一下 jetbrains.com 的 ip 地址,再看能否 ping 通这个地址。

1
2
3
4
5
6
$ ping 99.84.238.36
PING 99.84.238.36 (99.84.238.36): 56 data bytes
64 bytes from 99.84.238.36: icmp_seq=0 ttl=238 time=283.909 ms
64 bytes from 99.84.238.36: icmp_seq=1 ttl=238 time=277.733 ms
64 bytes from 99.84.238.36: icmp_seq=2 ttl=238 time=287.680 ms
64 bytes from 99.84.238.36: icmp_seq=3 ttl=238 time=282.584 ms

然后修改电脑的 hosts 文件,加入如下两行:

1
2
99.84.238.36    plugins.jetbrains.com
99.84.238.36 jetbrains.com

这时,重启 IDEA,再次进入插件市场,就可以打开了。