接口调用凭据
具体可见获取接口调用凭据接口文档。
// 获取access_token
private String getAccessToken(){
// 通过appid和secret来获取token
// wechatId, wechatSecret是自定义的全局变量
String tokenUrl = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", wechatId, wechatSecret);
JSONObject token = JSON.parseObject(HttpUtil.get(tokenUrl));
return token.getString("access_token");
}
但是后来访问报错:
{
"errcode": 45009,
"errmsg": "reach max api daily quota limit, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: 6694d1c1-3e539e55-2bb67662"
}
见接口调用凭证 / 获取稳定版接口调用凭据 (qq.com)文档修改接口:注意改为POST请求
private String getAccessToken(){
String url = "https://api.weixin.qq.com/cgi-bin/stable_token";
Map<String, String> postMap = new HashMap<>();
postMap.put("grant_type", "client_credential");
postMap.put("appid", wechatId);
postMap.put("secret", wechatSecret);
String body = HttpRequest.post(url)
.body(JSONObject.toJSONString(postMap))
.execute().body();
JSONObject token = JSON.parseObject(body);
return token.getString("access_token");
}
短剧媒资管理
获取微信媒资列表
/**
* 获取媒资列表
* @param dramaId 剧目id
* @return
*/
@GetMapping("/getVideoList")
public CommonResult<Object> getVideoList(String dramaId) {
String url = "https://api.weixin.qq.com/wxa/sec/vod/listmedia?access_token=" + getAccessToken();
//封装请求体
Map<String, String> paramMap = Maps.newHashMap();
paramMap.put("drama_id", dramaId);
//封装请求头
HttpHeaders headers = getHeaders();
HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(paramMap,headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);
String totalCount = JSONObject.parseObject(JSON.toJSONString(response.getBody())).getString("total_count");
return CommonResult.data(response.getBody());
}
// 获取access_token
private String getAccessToken(){
// 通过appid和secret来获取token
// wechatId, wechatSecret是自定义的全局变量
String tokenUrl = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s", wechatId, wechatSecret);
JSONObject token = JSON.parseObject(HttpUtil.get(tokenUrl));
return token.getString("access_token");
}
// 封装请求体
private HttpHeaders getHeaders(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
若该剧目列表(集数)超过100:
获取列表注意是偏移量、不是第多少页,假设偏移量为100.则从101显示(获取媒资列表)。
/**
* 获取媒资列表
* @param dramaId 剧目id
* @return
*/
@GetMapping("/getVideoList")
public CommonResult<Object> getVideoList(String dramaId) {
String url = "https://api.weixin.qq.com/wxa/sec/vod/listmedia?access_token=" + getAccessToken();
//封装请求体
Map<String, String> paramMap = Maps.newHashMap();
paramMap.put("drama_id", dramaId);
//封装请求头
HttpHeaders headers = getHeaders();
HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(paramMap,headers);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);
String totalCount = JSONObject.parseObject(JSON.toJSONString(response.getBody())).getString("total_count");
if (Integer.valueOf(totalCount) <= 100) {
return CommonResult.data(response.getBody());
} else {
String dramaInfoList = JSONObject.parseObject(JSON.toJSONString(response.getBody())).getString("media_info_list");
StringBuffer buffer = new StringBuffer();
buffer.append(dramaInfoList);
Integer value = Integer.valueOf(totalCount);
int count = value / 100;
for (int i = 0;i < count;i++) {
// 分页拉取的起始偏移量。默认值:0。分页拉取的最大返回结果数。默认值:100;最大值:100。
paramMap.put("offset", String.valueOf((i + 1) * 100));
httpEntity = new HttpEntity<>(paramMap,headers);
String mediaInfoList = JSONObject.parseObject(JSON.toJSONString(restTemplate.postForEntity(url, httpEntity, Object.class).getBody())).getString("media_info_list");
buffer.deleteCharAt(buffer.length() - 1);
mediaInfoList = mediaInfoList.substring(1);
buffer.append("," + mediaInfoList);
}
String result = JSONObject.parseObject(JSON.toJSONString(response.getBody())).toJSONString().replace(dramaInfoList, buffer.toString());
return CommonResult.data(JSONObject.parse(result));
}
}
// 获取access_token:
private String getAccessToken(){
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wechatId + "&secret=" + wechatSecret;
JSONObject token = JSON.parseObject(HttpUtil.get(tokenUrl));
return token.getString("access_token");
}
// 封装请求体
private HttpHeaders getHeaders(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
获取媒资详细信息
根据单个媒资(某一集)的mediaId获取详细信息。
/**
*
* 获取文件信息
* @param mediaId 文件id
* @return
*/
@GetMapping("/getVideoInfo")
public CommonResult<Object> getVideoInfo(String mediaId) {
//通过token和code来获取用户手机号
String url = "https://api.weixin.qq.com/wxa/sec/vod/getmedia?access_token=" + getAccessToken();
//封装请求体
Map<String, Integer> paramMap = Maps.newHashMap();
paramMap.put("media_id", Integer.valueOf(mediaId));
//封装请求头
HttpHeaders headers = getHeaders();
HttpEntity<Map<String, Integer>> httpEntity = new HttpEntity<>(paramMap,headers);
//返回到前端展示
return commonReturn(url,httpEntity);
}
private CommonResult<Object> commonReturn(String url,HttpEntity<Map<String, Integer>> httpEntity){
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);
//返回到前端展示
return CommonResult.data(response.getBody());
}
private HttpHeaders getHeaders(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
private String getAccessToken(){
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wechatId + "&secret=" + wechatSecret;
JSONObject token = JSON.parseObject(HttpUtil.get(tokenUrl));
return token.getString("access_token");
}
其他媒资操作
获取媒资播放链接:该接口用于获取视频临时播放链接,用于给用户的播放使用(当然,上面两种方法也可以获取到临时链接,mp4_url:mp4格式临时链接 ;hls_url:hls格式临时链接)。只有审核通过的视频才能通过该接口获取播放链接,获取播放链接与获取媒资详细信息必填请求参数不同点是它除了包含access_token、media_id参数外,还需要填入播放地址的过期时间戳 t ,其有效的时间最长不能超过2小时后。(它还可以设置试看时长)
注意,报错{"code": 200, "msg": "操作成功", "data": "{errcode=10090016, errmsg=流量资源包余额不足 rid: 65d6ed18-1f0aff98-694c9c76}"},表示媒资管理中没有播放流量。
获取用户信息
获取用户手机号
/**
* 获取用户手机号
* @param code 微信code
* @return
*/
@GetMapping("/getUserPhone")
public CommonResult<Object> getPhoneNumber(String code) {
if(StringUtils.isBlank(code)){
return CommonResult.data("");
}
//通过token和code来获取用户手机号
String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + getAccessToken();
//封装请求体
Map<String, String> paramMap = new HashMap<>();
paramMap.put("code", code);
//封装请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Map<String, String>> httpEntity = new HttpEntity<>(paramMap,headers);
//通过RestTemplate发送请求,获取到用户手机号码
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);
//返回到前端展示
return CommonResult.data(response.getBody());
}
private CommonResult<Object> commonReturn(String url,HttpEntity<Map<String, Integer>> httpEntity){
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);
//返回到前端展示
return CommonResult.data(response.getBody());
}
private HttpHeaders getHeaders(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
private String getAccessToken(){
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wechatId + "&secret=" + wechatSecret;
JSONObject token = JSON.parseObject(HttpUtil.get(tokenUrl));
return token.getString("access_token");
}
获取用户Scheme码
请求体:
@Getter
@Setter
public class WxInfoEntity {
private String path;
private String query;
private String envVersion;
}
过程:
/**
* 获取用户Scheme码
* @param entity
* @return
*/
@GetMapping("/getScheme")
public CommonResult<Object> getScheme(WxInfoEntity entity) {
//通过token和code来获取用户手机号
String url = "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + getAccessToken();
JSONObject jsonObject = new JSONObject();
JSONObject objectField = new JSONObject();
objectField.put("path", entity.getPath());
objectField.put("query", entity.getQuery());
objectField.put("env_version", entity.getEnvVersion());
jsonObject.put("jump_wxa", objectField);
jsonObject.put("is_expire", true);
jsonObject.put("expire_type", 1);
//失效一天
jsonObject.put("expire_interval", 1);
//封装请求头
HttpHeaders headers = getHeaders();
HttpEntity<String> httpEntity = new HttpEntity<>(jsonObject.toString(),headers);
//通过RestTemplate发送请求,获取到用户手机号码
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);
//返回到前端展示
return CommonResult.data(response.getBody());
}
private CommonResult<Object> commonReturn(String url,HttpEntity<Map<String, Integer>> httpEntity){
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> response = restTemplate.postForEntity(url, httpEntity, Object.class);
//返回到前端展示
return CommonResult.data(response.getBody());
}
private HttpHeaders getHeaders(){
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
private String getAccessToken(){
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wechatId + "&secret=" + wechatSecret;
JSONObject token = JSON.parseObject(HttpUtil.get(tokenUrl));
return token.getString("access_token");
}