Java获取微信小程序二维码并上传至腾讯COS

最近在做项目的过程中发现,微信官方提供的获取小程序二维码接口返回的是一个二进制文本,如果直接由前端调用生成二维码,会由于文件太大导致图片无法正常加载的问题。因此决定通过后端服务生成二维码图片并上传至腾讯cos,将图片访问地址返回给前端的方式。

这是小程序获取二维码的官方文档 获取不限制的小程序码 | 微信开放文档

废话不多说,直接上代码

public String getQRCode() {
    byte[] qrcodeData = getWechatQRCode();
    if (Objects.isNull(qrcodeData)) {
        throw new BizException("系统异常");
    }
    return uploadToCOS(qrcodeData);
}

/**
 * 获取小程序二维码二进制内容
 */
private byte[] getWechatQRCode() {
    WxAccessTokenVO accessToken = wxUserService.getAccessToken();
    if (Objects.isNull(accessToken)) {
        log.error("获取小程序二维码异常, accessToken为空");
        return null;
    }

    try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
        HttpPost httpPost = new HttpPost(wxConfig.getQrCodeApiUrl() + "?access_token=" + accessToken.getAccessToken());

        String page = "PATH";        
        String scene = "SCENE";
        String envVersion = "env_version";
        Integer width = 280;
        boolean checkPath = true;
    
        String jsonInput = String.format("{\"page\": \"%s\", \"scene\": \"%s\", \"env_version\": \"%s\", \"width\": %d, \"check_path\": %b}",
                    path, scene, envVersion, width, checkPath);

        StringEntity entity = new StringEntity(jsonInput, "UTF-8");
        httpPost.setEntity(entity);
        httpPost.setHeader("Content-Type", "application/json");
        httpPost.setHeader("Accept", "application/json");

        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity responseEntity = response.getEntity();

        return EntityUtils.toByteArray(responseEntity);
    } catch (Exception e) {
        log.error("获取小程序二维码异常:", e);
        return null;
    }
}

在调用获取小程序二维码的接口之前,我们需要先获取接口调用凭证access_token,获取方法很简单,参照官方文档获取接口调用凭据 | 微信开放文档 即可。

拿到access_token以后,我们就可以调用获取二维码的接口了,这里有几个常用的参数需要注意:

1. page: 扫码后的跳转页面,如果不填写则默认跳主页面

2. scene: 自定义的参数可以放在这个字段里面,方便扫码以后,获取一些相关信息,可根据自身业务自行填写

3. env_version: 版本控制,正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。

4. width: 二维码的宽度,默认430,单位 px,最小 280px,最大 1280px

5. check_path: 默认是true,检查page 是否存在,为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在

目前为止,我们已经拿到了小程序二维码的二进制内容了,下面要做的就是将其上传至腾讯cos并以图片的形式保存,然后返回图片访问链接。

使用腾讯cos的sdk之前,我们需要引入对于的依赖包

<!-- 腾讯cos -->
<dependency>
    <groupId>com.qcloud</groupId>
    <artifactId>cos_api</artifactId>
    <version>5.6.8</version>
</dependency>
/**
 * 上传二维码至腾讯cos
 */
private String uploadToCOS(byte[] data) {
    ClientConfig clientConfig = new ClientConfig(new Region(tencentCosConfig.getRegion()));
    COSCredentials cred = new BasicCOSCredentials(tencentCosConfig.getSecretId(), tencentCosConfig.getSecretKey());
    COSClient cosClient = new COSClient(cred, clientConfig);

    InputStream inputStream = new ByteArrayInputStream(data);

    ObjectMetadata objectMetadata = new ObjectMetadata();
    objectMetadata.setContentLength(data.length);
    objectMetadata.setContentType("image/png");
        
    String fileName = "image/upload/" + UUID.randomUUID() + "-qrcode.png";

    PutObjectRequest putObjectRequest = new PutObjectRequest(tencentCosConfig.getBucketName(), fileName, inputStream, objectMetadata);
    PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);

    return "https://" + tencentCosConfig.getBucketName() + ".cos." + tencentCosConfig.getRegion() + ".myqcloud.com/" + fileName;
}

当然上传至腾讯cos还需要一些相关的配置参数:secret_id, secret_key, region, bucket_name

这里就不详细讲怎么获取这些参数啦,到目前为止,我们已经能成功将微信小程序二维码的二进制内容上传到腾讯cos并保存成为一张png格式的图片啦。将最终的链接地址返回给前端就能显示二维码咯。

今天的分享就到这里啦,祝大家编码愉快~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值