首先申请微信小程序的测试账号测试账号(这个链接藏的比较深)
获取二维码的api文档地址:二维码文档
我这里使用的是方式B,需要传scene这里需要先获取AccessToken,构建参数:
JSONObject jsonObject = new JSONObject();
jsonObject.put("scene", inviter.getInviterCode());
jsonObject.put("page", "");
jsonObject.put("width", 600);
jsonObject.put("auto_color", true);
JSONObject colorJson = (JSONObject) JSON.parse("{\"r\":\"0\",\"g\":\"0\",\"b\":\"0\"}");
jsonObject.put("line_color", colorJson);
jsonObject.put("is_hyaline", false);
注意这里的line_color一定得传一个JSON对象,并且里面的rgb三个参数不能少,不然请求返回报错
{"errcode":47001,"errmsg":"data format error hint: [h4fcVA0113b451]"}
接下来就是发送请求,如果请求正常返回的是一张图片流,这里不能直接使用String 接受,否则得到的是乱码,我这里使用的是InputStream接收
public static InputStream postJson(String url, String json) {
InputStream is = null;
CloseableHttpClient httpClient = null;
try {
httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
StringEntity requestEntity = new StringEntity(json, "utf-8");
requestEntity.setContentEncoding("UTF-8");
httpPost.setHeader("Content-type", "application/json");
httpPost.setEntity(requestEntity);
HttpResponse response;
response = httpClient.execute(httpPost);
int code = response.getStatusLine().getStatusCode();
if (HttpStatus.OK.value() == code) {
is = response.getEntity().getContent();
}
} catch (Exception e) {
log.error("", e);
} finally {
/*if(httpClient != null) {
try {
httpClient.close();
} catch (IOException e) {
log.error("", e);
}
}*/
}
return is;
}
这里不要使用spring 的 restTemplate封装,不然拿不到InputStream,或者我这里用的方法不对。
接下来我直接把流返回到前端展示就OK了
private void encodeQrcodeInputStream(InputStream inputStream, HttpServletResponse response) {
if (inputStream == null) {
return;
}
try {
OutputStream outputStream = response.getOutputStream();
//输出二维码图片流
try {
IOUtils.copy(inputStream, outputStream);
} catch (IOException e) {
logger.error("", e);
}
} catch (Exception e1) {
logger.error("", e1);
}
}
这里也可以保存到本地
File file = new File("/Users/apple/test1.png");
FileOutputStream outputStream = new FileOutputStream(file);
IOUtils.copy(inputStream, outputStream);
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
这里IOUtils使用的是org.apache.commons.io.IOUtils,很好用的一个工具