微信公众号Java开发记录(一)接入
发表时间:2020-10-2
发布人:葵宇科技
浏览次数:52
文章目录
- 一、申请测试号
- 二、内网穿透接入
- 三、云服务器接入
- 三、代码接入
- 项目结构
- application.yml
- Controller
- ServiceImpl
- 实体类
微信公众平台开发概述|微信官方文档
一、申请测试号
首先申请测试公众号,
因为我们个人申请的公众号,无法认证,有很多权限无法获得,申请一个测试号会方便很多。
申请测试号
二、内网穿透接入
我们需要用到内网穿透,方便我们测试,直接部署在云服务器上也是可以。
我用到的是免费的Sunny-Ngrok内网转发,如果不稳定的话多试几次就好。
三、云服务器接入
对接云服务的话需要配置nginx转发
location /wx {
proxy_pass http://116.62.13.104:8083;
}
然后重启nginx./nginx -s reload
URL :http://116.62.13.104/wx/
三、代码接入
可以看到页面有接口配置信息:
URL
就是我们给微信服务器要访问我们的项目的地址,这里我使用的内网穿透,所以使用的是人家分配的域名地址,(只用云服务器的话直接填写正常的ip+port+路径即可)。
Token
是我们自己随意定义的。
注意:我们需要当我们的项目(在本地启动起来配置内网穿透或者是在云服务上部署好)能通过URL让微信的服务器访问到才能配置成功。
项目结构
application.yml
server:
port: 8083
tomcat:
# tomcat的URI编码
uri-encoding: UTF-8
# tomcat最大线程数,默认为200
# Tomcat启动初始化的线程数,默认值25
threads:
max: 800
min-spare: 30
spring:
datasource:
url: jdbc:mysql://116.62.13.104:3306/countdown?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: true
redis:
host: 116.62.13.104
port: 6379
# token配置
token:
# token 值
value: liushihao123
# 令牌自定义标识
header: Authorization
# 令牌秘钥
secret: abcdefghijklmnopqrstuvwxyz
# 令牌有效期(默认30分钟)
expireTime: 30
logging:
file:
path: /data/wx/logs/
Controller
package com.wx.controller;
import com.wx.model.Param;
import com.wx.service.WXService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
* @author :LiuShihao
* @date :Created in 2020/9/28 2:49 下午
* @desc :
*/
@RestController
@RequestMapping("/wx")
public class WXController {
@Autowired
WXService wxService;
/**
* signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
* timestamp 时间戳
* nonce 随机数
* echostr 随机字符串
*
* 开发者通过检验signature对请求进行校验(下面有校验方式)。
* 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
* @return
*/
@GetMapping
public String test1(Param param) throws IOException {
System.out.println("param:"+param);
if(wxService.check(param)){
System.out.println("接入成功");
//原样返回
return param.getEchostr();
}else {
System.out.println("接入失败");
return null;
}
}
}
ServiceImpl
service接口
package com.wx.service.Impl;
import com.wx.model.Param;
import com.wx.service.WXService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* @author :LiuShihao
* @date :Created in 2020/10/2 1:12 下午
* @desc :
*/
@Service
public class WXServiceImpl implements WXService {
@Value("${token.value}")
public String token;
/**
* 开发者通过检验signature对请求进行校验(下面有校验方式)。
* 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
*
* 1)将token、timestamp、nonce三个参数进行字典序排序
* 2)将三个参数字符串拼接成一个字符串进行sha1加密
* 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
* @param param
* @return
*/
@Override
public boolean check(Param param) {
//1)将token、timestamp、nonce三个参数进行字典序排序
String[] strs = {token,param.getTimestamp(),param.getNonce()};
Arrays.sort(strs);
//2)将三个参数字符串拼接成一个字符串进行sha1加密
String str = strs[0]+strs[1]+strs[2];
String mysign = sha1(str);
System.out.println("加密前:"+str);
System.out.println("Signature:"+param.getSignature());
System.out.println("mysign::"+mysign);
//3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
return param.getSignature().equals(mysign);
}
private String sha1(String str) {
StringBuilder sb = new StringBuilder();
try {
//获取一个加密对象
MessageDigest md = MessageDigest.getInstance("sha1");
//加密
byte[] digest = md.digest(str.getBytes());
char[] chars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
//处理加密结果
for (byte b : digest){
sb.append(chars[(b>>4)&15]);
sb.append(chars[b&15]);
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sb.toString();
}
}
实体类
package com.wx.model;
import lombok.Data;
/**
* @author :LiuShihao
* @date :Created in 2020/9/29 5:13 下午
* @desc :
*/
@Data
public class Param {
/**
* signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
* timestamp 时间戳
* nonce 随机数
* echostr 随机字符串
* @return
*/
private String signature;
private String timestamp;
private String nonce;
private String echostr;
}
在页面点击提交