Java生成小程序码并上传阿里OSS

一、获取微信接口调用凭证

获取微信接口调用凭证
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);
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值