个推功能简介:
将信息推送至手机端,手机端人员可以看到收到的信息。 个推功能需要借助第三方平台的接口(需要申请账号),单独开发很难完成,这里就是用到了第三方接口。
完成个推需要完成三步:
- 获取token,调用个推接口需要获取用于验证的token
- 获取taskId(任务ID)
- 通过获取的token与taskId发送信息至手机端
代码中用到的接口地址与相关参数可以配置在yml文件中:
测试类的代码如下:
@Value("${getui.token-url}")
private String tokenUrl;
@Value("${getui.taskid-url}")
private String taskIdUrl;
@Value("${getui.push-cids-url}")
private String pushCidsUrl;
@Value("${getui.appkey}")
private String appkey;
@Value("${getui.masterSecret}")
private String masterSecret;
1.获取token
private String getToken() {
//获取token鉴权
String timestamp = String.valueOf(new Date().getTime());
String sign = CommonUtil.getSha256(appkey + timestamp + masterSecret);
String token = redisTemplate.opsForValue().get(redisKeyPrefix + StaticConstant.PHONETOKEN + "PHONE_TOKEN");
if (StrUtil.isEmpty(token)) {
Map<String, Object> map = new HashMap<>();
map.put("sign", sign);
map.put("timestamp", timestamp);
map.put("appkey", appkey);
Map<String, Object> resultMap = restTemplate.postForObject(tokenUrl, map, Map.class);
Map<String, String> dataMap = (Map<String, String>) resultMap.get("data");
token = dataMap.get("token");
redisTemplate.opsForValue().set(redisKeyPrefix + StaticConstant.PHONETOKEN + "PHONE_TOKEN",
token, Long.parseLong(tokenTimeOut), TimeUnit.MILLISECONDS.MILLISECONDS);
}
return token;
}
2.获取taskId
private String getTaskId() {
//获取token
String token = getToken();
Map<String, String> push_messageMap = new HashMap<>();
push_messageMap.put("transmission", "个推程序测试,收到请在QQ回复OK!");
Map<String, Object> params = new HashMap<>();
params.put("push_message", push_messageMap);
HttpHeaders headers = new HttpHeaders();
headers.set("token", token);
HttpEntity httpEntity = new HttpEntity(params, headers);
Map<String, Object> resultMap = restTemplate.postForObject(taskIdUrl, httpEntity, Map.class);
Map<String, String> dataMap = (Map<String, String>) resultMap.get("data");
String taskid = dataMap.get("taskid");
return taskid;
}
3.推送消息
@Test
void test1() {
//获取token
String token = getToken();
//获取taskId
String taskId = getTaskId();
Map<String, Object> audienceMap = new HashMap<>();
String[] array = new String[]{"47c61f1eb4c49afc8a7d74307e86416f"};
audienceMap.put("cid", array);
Map<String, Object> params = new HashMap<>();
params.put("audience", audienceMap);
params.put("taskid", taskId);
// params.put("is_async",true);是否异步推送,true是异步,false同步。异步推送不会返回data详情
HttpHeaders headers = new HttpHeaders();
headers.set("token", token);
HttpEntity httpEntity = new HttpEntity(params, headers);
Map<String, Object> resultMap = restTemplate.postForObject(pushCidsUrl, httpEntity, Map.class);
String code = resultMap.get("code").toString();
log.info(code);
}
注:本功能中应业务要求使用到了redis,用于保留设置token过期时间