1. 登录微信公众平台——开发管理——启用消息推送

2. 微信扫码确认开启
3. 可查看消息推送配置指南,并获取测试工具(或直接跳过,直接操作下列操作)
4. 编写接口(微信消息推送需要验证请求的合法性)
① 项目中yml中配置微信配置,如下
appId和appSecret都可以从公众平台上获取,在开发管理-开发者ID里面
token自己随便定义(必须为英文或数字,长度为3-32字符),待会要配置到消息推送的配置中
②编写微信工具类
@Service
public class WxService {
private static final Logger log = LoggerFactory.getLogger(WxService2.class);
@Autowired
private RedisService redisService;
@Value("${wx.appId}")
private String appId;
@Value("${wx.appSecret}")
private String appSecret;
@Value("${wx.token}")
private String token;
private static RestTemplate restTemplate = new RestTemplate();
/**
* 获取access_token,每个公众账号一天请求2000次Access_Token
* @return
*/
public String getAccessToken() {
String accessToken = (String) redisService.getKey("wxAccessToken");
if (StringUtils.isBlank(accessToken)) {
String interfaceUrl = "https://api.weixin.qq.com/cgi-bin/token";
String url = interfaceUrl + "?grant_type=client_credential" + "&appid=" + appId + "&secret=" + appSecret;
String result = restTemplate.getForObject(url, String.class);
JSONObject entries = JSONUtil.parseObj(result);
log.info("access_token:{}", entries);
accessToken = entries.getStr("access_token");
if (StringUtils.isNotBlank(accessToken)) {
redisService.setKey("wxAccessToken", accessToken, 1L, TimeUnit.HOURS);
}
}
log.info("accessToken:{}", accessToken);
return accessToken;
}
/**
* 消息推送配置 验证请求的合法性
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public boolean checkSignature( String signature, String timestamp, String nonce) {
// 小程序消息推送自己配置的token
log.info("验证token:{}" + token);
String[] arr = new String[]{token, timestamp, nonce};
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
// 将排序后的结果拼接成一个字符串
String content = String.join("", arr);
try {
//获取加密工具
MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
// 使用SHA-1加密
byte[] hashBytes = sha1.digest(content.getBytes());
//将字节数组转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
String hex = Integer.toHexString(0xff & b);
if (hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
log.info("加密后signature:{}", hexString);
// 将加密后的字符串与微信服务器提供的签名进行对比
return hexString.toString().equals(signature);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 如果签名不匹配,则返回false
return false;
}
}
③编写controller
@Api(tags = "微信相关接口")
@RequestMapping("/wx")
@RestController
@Validated
public class WxController {
@Autowired
private WxService wxService;
@ApiOperation("微信消息配置验证")
@GetMapping("/mesRecive")
public String mesRecive(String signature, String timestamp, String nonce, String echostr) {
//消息合法
if (wxService.checkSignature(signature, timestamp, nonce)) {
return echostr;
}
return null;
}
}
5. 部署到服务器,使用官方工具测试接口
微信调试工具
AccessToken:可以参考 微信工具类getAccessToken()方法
URL(服务器地址):必须以http://或https://开头,分别支持80端口和443端口,填写接口路径
Token:就刚刚项目中配置的token
6. 测试工具验证结果成功后,填写消息推送配置(如果超时,回到启用页面重新开启然后填写配置)
若是URL和Token填写不正确,会提交不了