Chen's Blog

守得云开见月明

因为最近的项目需要做微信方面的开发,之前也有过微信开发的经验,但每逢项目中遇到跟微信沾边的东西就得从头写起,一直也没单独把微信开发方面的代码单独独立出来。

首先到微信开放平台申请一个测试号,绑定安全域名

weixin4j环境配置

这是一个封装了相当完善的Java微信开发工具,项目主页:weixin4j

建议先了解微信传统Oauth2.0开发流程再使用该工具

引入Maven配置

1
2
3
4
5
6
//这里引入weixin4j公众号开发Api,还有企业号和服务器的这里不引入
<dependency>
<groupId>com.foxinmy</groupId>
<artifactId>weixin4j-mp</artifactId>
<version>1.7.4</version>
</dependency>

weixin4j相关依赖还有fastjson和HttpClient

配置开发代理Bean

将com.foxinmy.weixin4j.mp.WeixinProxy类注入Spring容器管理

1
2
3
4
@Bean
public WeixinProxy mpWeixinProxy() {
return new WeixinProxy();
}

获取用户信息需要使用的几个对象

  • com.foxinmy.weixin4j.mp.api.OauthApi
    公众号Oauth开发流程API
  • com.foxinmy.weixin4j.mp.model.OauthToken
    Token实体
  • com.foxinmy.weixin4j.mp.model.User
    微信用户信息封装实体

配置开发者账号

在classpath下创建weixin4j.properties配置文件,配置Appid和secret

1
weixin4j.account={"id":appid,"secret":secret}

用户信息获取接口

贴上获取用户信息的代码,按照微信逻辑走即可

  1. snapi_userinfo 授权,需用户手动确认授权,因此无需关注或与公众号产生消息交互
1
2
3
4
5
6
7
8
@GetMapping(value = "/user_authenticator")
public APIResult userAuthenticator(@RequestParam(name = "code") String code) {
OauthApi oauthApi = weixinProxy.getOauthApi();
OauthToken oauthToken = oauthApi.getAuthorizationToken(code);
logger.info("{}", oauthToken.toString());
User user = oauthApi.getAuthorizationUser(oauthToken);
return asSuccess(user);
}
  1. snapi_base 授权,获取用户openid,并通过openid获取用户信息。用户信息中带有用户是否关注公众号的状态字段。用此字段来判断用户是否已关注公众号,达到强制关注的效果
    1
    2
    3
    4
    5
    6
    @GetMapping(value = "/user_authenticator")
    public APIResult userAuthenticator(@RequestParam(name = "code") String code) {
    OauthApi oauthApi = weixinProxy.getOauthApi();
    OauthToken oauthToken = oauthApi.getAuthorizationToken(code);
    return weixinProxy.getUser(oauthToken.getOpenId());
    }

创建授权连接

weixin4j提供了构造授权连接的Api,传入回调地址、state、scope即可

com.foxinmy.weixin4j.mp.api.OauthApi#getUserAuthorizationURL(redirectUri, state, scope)

scope分为两种snsapi_base和snsapi_userinfo,具体请查阅微信开发文档

通过微信访问授权连接,应该会得到用户信息的输出。

总结

使用weixin4j大大简化了java微信开发的时间,而且weixin4j还提供了一套非常灵活的token缓存机制。这篇先到这里,下一篇会分享通过weixin4j开发分享到朋友圈的功能。

使用letsencrypt搞了一套免费SSL证书,绿了,看着就舒服,看看老哥的大A(虽么h2老钱的A+牛)

image

1.准备

下载Certbot:https://github.com/certbot/certbot

2.注册

移步解压目录,执行命令,如果没错,应有类似如下提示

1
./certbot-auto certonly --standalone --email 邮箱地址 -d 域名1 -d 域名2 ... -d 域名n

image

3.配置(Nginx)

直接贴上本站配置。重启Nginx即可

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
server {
listen 80;
listen 443 ssl;
ssl on;

ssl_certificate /etc/letsencrypt/live/域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/域名/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 密码套件来自 http://www.oschina.net/translate/strong_ssl_security_on_nginx
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;

if ($scheme = http){
rewrite ^(.*)$ https://$host$1 permanent;
}

location ~ /\.
{
deny all;
}

location ~ /.well-known {
allow all;
}

# and so on

}

过期咋办?

证书过期时间为90天,所以需要定期的执行重新注册命令。当然,一个定时任务就搞定

1
2
./certbot-auto renew --dry-run
./certbot-auto renew -v

常见问题

1. 证书注册失败?

Failed authorization procedure. chenzhihao.com (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Error getting validation data

  1. 首先检查Nginx配置文件是否正确
  2. 关闭防火墙

2. 配置好为何无法访问?

没有什么是重启一下Nginx解决不了的,重启后肯定会有报错

3. 为什么我无法重新注册?

Attempting to renew cert (域名) from /etc/letsencrypt/renewal/域名.conf produced an unexpected error: Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.

在完全杀掉Nginx后执行重新注册命令,然后启动Nginx

4. 为毛有的页面绿,有的不绿?

检查不绿页面是否有单纯的 http:// 链接,有则改之

0%