
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET因为此接口就是正常返回json数据的接口,这里我们就不写原生的http代码,我用了hutool的工具包
接口实现的具体代码:cn.hutool hutool-all5.3.7
1.参数dto类
package com.sun.module.http.dto;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "WeiXinAccessTokenDTO", description = "微信小程序http对接参数(auth.getAccessToken)")
public class WeiXinAccessTokenDTO {
private String grant_type;
private String appid;
private String secret;
}
2.控制层controller类
public Map到这一步,就拿到了token,因为调用生成菊花二维码的接口必填参数就是token, 每个token有2个小时的有效时间,所以可以拿到后本地缓存起来一下 2.通过传入token,利用代码访问接口生成菊花二维码,并返回给前端getWeiXinAccessToken(@RequestBody WeiXinAccessTokenDTO dto) { Map params = new HashMap<>(); params.put("grant_type", dto.getGrant_type()); params.put("appid", dto.getAppid()); params.put("secret", dto.getSecret()); String resultStr = HttpUtil.get("https://api.weixin.qq.com/cgi-bin/token", params); String[] strings = resultStr.split(","); String[] access_token = strings[0].split(":"); Map map = new HashMap<>(); map.put(access_token[0], access_token[1]); //包含access_token的map return map; }
POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
这里需要maven依赖
com.google.code.gson gsonorg.apache.httpcomponents httpclientcom.alibaba fastjson1.2.67
1.参数dto类
@Data
@ApiModel(value = "WeiXinUnlimitedDTO", description = "微信小程序http对接参数(wxacode.getUnlimited)")
public class WeiXinUnlimitedDTO {
private String access_token;
//访问接口需要的选填的参数,直接map键值对转换json
private Map params;
}
2.服务层service类
这里可以选择是下载本地或者返回web选择性下载,具体参详注释内容package com.sun.module.http;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
@Service
@Slf4j
public class HttpService {
public static ByteArrayInputStream sendPost(String URL, String json) {
InputStream inputStream = null;
ByteArrayInputStream byteArrayInputStream = null;
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建httppost
HttpPost httppost = new HttpPost(URL);
httppost.addHeader("Content-type", "application/json; charset=utf-8");
httppost.setHeader("Accept", "application/json");
try {
StringEntity s = new StringEntity(json, Charset.forName("UTF-8"));
s.setContentEncoding("UTF-8");
httppost.setEntity(s);
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 获取相应实体
HttpEntity entity = response.getEntity();
inputStream = entity.getContent();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// 创建一个Buffer字符串
byte[] buffer = new byte[1024];
// 每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
// 使用一个输入流从buffer里把数据读取出来
while ((len = inputStream.read(buffer)) != -1) {
// 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 关闭输入流
inputStream.close();
// 把outStream里的数据写入内存
byteArrayInputStream = new ByteArrayInputStream(outStream.toByteArray());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
try {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return byteArrayInputStream;
}
public Map getWXCode(String access_token, String paramJson, HttpServletResponse response) {
Map map = new HashMap<>();
try {
log.info("access_token:[{}]", access_token);
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + access_token;
ByteArrayInputStream inputStream = sendPost(url, paramJson);
//这里判断的是返回的图片还是错误信息,一般错误信息不会大于200
if (inputStream.available() <= 200) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int i;
byte[] buffer = new byte[200];
while ((i = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, i);
}
String str = new String(byteArrayOutputStream.toByteArray());
//错误信息的格式在官方文档里有
JSonObject jsonObject = JSONObject.parseObject(str);
if ("41030".equals(jsonObject.getString("errcode"))) {
map.put("aa", "所传page页面不存在,或者小程序没有发布");
} else if ("45009".equals(jsonObject.getString("errcode"))) {
map.put("bb", "调用分钟频率受限");
}
byteArrayOutputStream.close();
return map;
}
//返回web前端
response.setContentType("image/png");
BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[1024];
int n;
while ((n = inputStream.read(buff)) != -1) {
outputStream.write(buff, 0, n);
}
outputStream.flush();
outputStream.close();
inputStream.close();
//下载到本地的代码
// FileOutputStream fileOutputStream = new FileOutputStream("D:/123.png");
// int i;
// byte[] buffer = new byte[200];
// while ((i = inputStream.read(buffer)) != -1) {
// fileOutputStream.write(buffer, 0, i);
// }
// fileOutputStream.flush();
// fileOutputStream.close();
// inputStream.close();
map.put("trun", "菊花码生成成功");
} catch (Exception e) {
map.put("flase", "获取菊花码异常");
}
return map;
}
}
3.控制层controller类
public Map最后在提一嘴,我所使用的jdk是1.8 ,spring parent如下:getWeiXinUnlimited(@RequestBody WeiXinUnlimitedDTO dto, HttpServletResponse response) { Gson gson = new Gson(); String paramJson = gson.toJson(dto.getParams()); Map map = service.getWXCode(dto.getAccess_token(), paramJson, response); return map; }
创作不易,给个赞,希望有帮助到各位org.springframework.boot spring-boot-starter-parent2.3.3.RELEASE
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)