最近在做项目的过程中发现,微信官方提供的获取小程序二维码接口返回的是一个二进制文本,如果直接由前端调用生成二维码,会由于文件太大导致图片无法正常加载的问题。因此决定通过后端服务生成二维码图片并上传至腾讯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格式的图片啦。将最终的链接地址返回给前端就能显示二维码咯。
今天的分享就到这里啦,祝大家编码愉快~