一、获取微信接口调用凭证
获取微信接口调用凭证
access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效;
这里我们使用redis维护access_token。
/**
* 获取调用微信平台的微信token
*
* @return
*/
public static String getToken() {
String tokenKey = "xxxxxxxxxxxx";
StringRedisTemplate stringRedisTemplate = SpringUtils.getBean(StringRedisTemplate.class);
String token = stringRedisTemplate.opsForValue().get(tokenKey);
if (token != null) {
log.info("从redis中取出token:{}", token);
return token;
}
String url = "https://api.weixin.qq.com/cgi-bin/token";
Map<String, Object> param = new HashMap<>();
param.put("appid", appId);//换成自己的
param.put("secret", appSecret);//换成自己的
param.put("grant_type", "client_credential");
JSONObject jsonObject = JSONUtil.parseObj(HttpUtil.get(url, param));
Integer expires_in = jsonObject.getInt("expires_in"); //token有效时长,最大7200秒
String access_token = jsonObject.getStr("access_token"); //token
//存入缓存
stringRedisTemplate.opsForValue().set(tokenKey, access_token, expires_in, TimeUnit.SECONDS);
log.info("从微信服务器获取token:{},并存入redis,过期时间为:{}秒", access_token, expires_in);
return access_token;
}
二、生成微信小程序码
/**
* @ClassName ApiController
* @Description TODO
* @Author hgq
* @Date 2022/4/15 15:08
* @Version 1.0
**/
@RestController
@RequestMapping("/apiController")
@Api(tags = "接口控制器")
@Slf4j
public class ApiController {
// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
private static final String ENDPOINT = "https://XXXXXXXXXXX";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
private static final String ACCESS_KEY_ID = "XXXXXXXXXXXXXXXXXXXXXX";
private static final String ACCESS_KEY_SECRET = "XXXXXXXXXXXXXXXXXXXX";
private static final String BUCKET = "XXXXXXXXXXXXXXXXXXX";
/**
* bucket下的文件夹名称
*/
private static final String FOLDER = "XXXXXXXXXXXXX";
private static final String PREFIX = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
private static OSS oss;
public static void init() {
// 创建OSSClient实例。
oss = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
log.debug("ali oss初始化成功");
}
public static void close() {
log.debug("ali oss关闭成功");
oss.shutdown();
}
/**
* base64图片 contentType
*/
private static final String CONTENT_TYPE = "image/png";
@ApiOperation("生成微信小程序码")
@PostMapping("/generateWxCode")
@AnonymousAccess
public AjaxResult generateWxCode(@RequestBody Map<String, Object> map) throws IOException {
log.info("入参:[{}]", map);
// 1. 调用微信接口获取图片
// 1.1 获取accessToken
String accessToken = WxRequestUtil.getToken();
// 1.2 调用微信接口生成小程序码
String url = String.format("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s", accessToken);
// 1.3 微信返回的图片文件流
String body = JSON.toJSONString(map, SerializerFeature.IgnoreNonFieldGetter);
log.info("请求入参:[{}]", body);
InputStream inputStream = HttpUtil.createPost(url).body(body).execute().bodyStream();
// 2. 图片上传阿里云OSS
// 2.1 OSS初始化
init();
// 2.2 拼接上传路径
String path = String.format("%s/%s.png", FOLDER, IdUtil.fastSimpleUUID());
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(CONTENT_TYPE);
// 2.3 上传
oss.putObject(BUCKET, path, inputStream, objectMetadata);
// 2.4 关闭OSS
close();
inputStream.close();
log.info("上传文件:{},文件类型:{}", PREFIX + path, CONTENT_TYPE);
return AjaxResult.success("生成小程序码成功", PREFIX + path);
}
}