话不多说,先上官方文档
两个圆码一个方码,喜欢哪个码用哪个码。注意:第一个和第三个生成数量有限制,只能生成100000个,根据业务需求进行选择,本文选择第二种方式进行演示。
获取Token
官方文档第一步都是获取Token,照着来
public Object getWXToken() {
//先从redis里拿token
Object accessToken = redisTemplate.opsForValue().get(这里用appId作为key);
//如果没有才请求获取token
if (null == accessToken){
// 拼接code发起请求到微信认证服务器获取token
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"
.replace("APPID", "小程序appid")
.replace("APPSECRET", "小程序SECRET"));
String tokenObjStr = HttpUtils.sendGet(tokenUrl);
JSONObject tokenObj = JSONObject.parseObject(tokenObjStr);
//获取token
accessToken = tokenObj.getString("access_token");
String expiresIn = tokenObj.get("expires_in").toString();
if (null != accessToken) {
redisTemplate.opsForValue().set(tenant.getAppId(),accessToken, Long.parseLong(expiresIn), TimeUnit.SECONDS);
return accessToken;
}else {
throw new RuntimeException("小程序参数不正确");
}
}
return accessToken;
}
其HttpUtils.sendGet(tokenUrl);是一个发送http请求的方法,这里是使用的若依的类和方法
这里是获取token的官方说明:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
获取小程序码
//获取小程序码
String codeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN"
.replace("ACCESS_TOKEN", "上面获取的token值");
Map<String, Object> map = new HashMap<>();
map.put("scene", "小程序码里面的参数值");
map.put("page", "扫码跳转的页面路径");
byte[] wxCodeBytes = HttpUtils.sendPost2Byte(codeUrl, map);
//然后做图片上传,我这里的项目是使用若依的上传,将byte数组转为MutipartFile就可以了,如果需要可以去生成预览图那里复制该类
/**
* 向指定 URL 发送POST方法的请求,并将返回数据转为byte[]
*
* @param url 发送请求的 URL
* @param data 请求参数,请求参数是Map<String,Object>的形式。
* @return 所代表远程资源的响应结果
*/
public static byte[] sendPost2Byte(String url, Map<String,Object> data) {
byte[] bytes = null;
try {
CloseableHttpResponse response = null;
try {
ObjectMapper objectMapper = new ObjectMapper();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader(HTTP.CONTENT_TYPE, "application/json");
httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(data),
ContentType.create("text/json", "UTF-8")));
response = HttpClients.createDefault().execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
HttpEntity entity = response.getEntity();
if (entity != null) {
//这里不一定需要转为byte,根据你的项目自己选择
bytes = readStream(entity.getContent());
}
}
} finally {
if (response != null) {
response.close();
}
}
} catch (Exception e) {
log.error("调用HttpUtils.sendPostRequest Exception, url=" + url + ",map=" + data, e);
}
return bytes;
}
/**
* 得到图片字节流 数组大小
* */
public static byte[] readStream(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = inStream.read(buffer)) != -1){
outStream.write(buffer, 0, len);
}
outStream.close();
inStream.close();
return outStream.toByteArray();
}
小程序码上传到服务器后,浏览器打开图片地址就可以了。
忘了说一下,微信返回的是二进制,打印出来是乱码的,所以我这里直接就拿返回结果做图片上传了