摘要
获取微信小程序二维码,根据返回内容类型获取buffer 图片信息、失败解析:json格式等信息。主要根据返回内容类型contentType 区分
微信开发平台:
获取不限制的小程序码(getUnlimitedQRCode)
返回参数
属性 | 类型 | 说明 |
---|---|---|
buffer | Buffer | 成功时返回的图片 Buffer |
errcode | number | 失败时返回错误码 |
errmsg | string | 失败时返回错误信息 |
contentType | contentType | 返回内容类型(重点根据返回内容类型就可以知道小程序码生成成功失败等信息,做一下洽其他处理) |
返回成功参数
{
"errcode": 0,
"errmsg": "ok",
"contentType": "image/jpeg",
"buffer": Buffer
}
获取微信小程序方法
/**
* 获取不限制的小程序码
*
* @param appId 小程序APPID
* @param query 小程序path携带的参数
*/
public String getMiniProgramUnlimitedQrCode(String appId, String query) throws Exception {
String secret = PrivateAppSecretEnum.getAppSecret(appId);
String accessToken = getAccessToken(appId, secret);
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
//构建head body 请求参数
String requestBodyJson = buildHeadersBodyString(query);
//获取生成微信小程序二维码。图片地址(二进制转换、图片上传)
return getRestTemplateQrCode(url, requestBodyJson);
}
/**
* 构建head body 请求参数
*
* @param query 携带参数
* @return head body参数
*/
@NotNull
private String buildHeadersBodyString(String query) {
String envVersion = "release";
Map<String, Object> paramMap = new HashMap<>();
//path携带的参数,最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
//eg: env=pre&placeId=14721&channelType=1003
paramMap.put("scene", query);
//默认是主页,页面 page,例如 pages/index/index,根路径前不要填加 /,不能携带参数(参数请放在 scene 字段里),如果不填写这个字段,默认跳主页面
paramMap.put("page", "index/index1");
//默认是true,检查page 是否存在,为 true 时 page 必须是已经发布的小程序存在的页面(否则报错);为 false 时允许小程序未发布或者 page 不存在, 但page 有数量上限(60000个)请勿滥用
paramMap.put("check_path", Boolean.TRUE);
//要打开的小程序版本。正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
paramMap.put("env_version", envVersion);
//默认430,二维码的宽度,单位 px,最小 280px,最大 1280px
paramMap.put("width", 720);
return JSON.toJSONString(paramMap);
}
1、RestTemplate 请求方式
/**
* 获取生成微信小程序二维码。图片地址(
* 1、二进制转换
* 2、图片上传
* @param url url
* @param requestBodyJson 请求body json
* @return 图片地址
* @throws IOException IO 异常
* @throws SaasException 自定义返回异常
*/
private String getRestTemplateQrCode(String url,String requestBodyJson) throws IOException, SaasException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.IMAGE_JPEG);
HttpEntity requestBody = new HttpEntity(requestBodyJson, headers);
ResponseEntity<byte[]> result = restTemplate.exchange(url, HttpMethod.POST, requestBody, byte[].class);
//判断返回内容类型是否 image/jpeg 图片类型
if (MediaType.IMAGE_JPEG == result.getHeaders().getContentType()){
InputStream inputStream = new ByteArrayInputStream(result.getBody());
return UploadTool.uploadOss(inputStream, result.getBody().length);
}
//判断返回内容类型是否 application/json;charset=UTF-8 json格式
if (MediaType.APPLICATION_JSON_UTF8 == result.getHeaders().getContentType()){
JSONObject jsonObject = JSONObject.parseObject(new String(result.getBody()));
logger.error("【微信小程序生成携带参数二维码】生成结果:{},失败信息:","失败",jsonObject.toJSONString());
}
return "http://moren.jpeg";
}
2、OkHttpClient 请求方式
/**
* OkHttpClient 方式 获取生成微信小程序二维码。图片地址
* 1、二进制转换
* 2、图片上传
* @param url url
* @param requestBodyJson 请求body json
* @return 图片地址
* @throws IOException IO 异常
* @throws SaasException 自定义返回异常
*/
private String getOkHttpClientQrCode(String url,String requestBodyJson) throws IOException, SaasException {
OkHttpClient client = new OkHttpClient().newBuilder().build();
okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, requestBodyJson);
Request request = new Request.Builder().url(url).method("POST", body)
.addHeader("User-Agent", "apifox/1.0.0 (https://www.apifox.cn)")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
//返回结构类型是否image/jpeg
if ("image/jpeg".equals(response.body().contentType().toString())) {
InputStream inputStream = new ByteArrayInputStream(response.body().source().readByteArray());
return UploadTool.uploadOss(inputStream, response.body().contentLength());
} else if ("application/json; charset=UTF-8".equals(response.body().contentType().toString())) {
JSONObject jsonObject = JSONObject.parseObject(response.body().string());
logger.error("【微信小程序生成携带参数二维码】生成结果:{},失败信息:","失败",jsonObject.toJSONString());
}
return "http://moren.jpeg";
}