首先,奉上微信官方文档:获取小程序码 - https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html
适用于需要的码数量较少的业务场景
生成小程序码,可接受 path 参数较长,生成个数受限,请谨慎使用。接口路径:
POST https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN
适用于需要的码数量极多的业务场景
生成小程序码,可接受页面参数较短,生成个数不受限。接口路径:
POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
适用于需要的码数量较少的业务场景
生成二维码,可接受 path 参数较长,生成个数受限。接口路径:
POST https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
1、小程序码和小程序二维码有什么区别?
请看下图:
|
|
2、接口1和接口3中的个数限制到底是多少?
微信官方描述:接口 1 加上接口 3,总共生成的码数量限制为 100,000,请谨慎使用
3、每个接口生成的码,可接受的页面参数具体有多少?
path
表示扫码进入的小程序页面路径,最大长度 128 字节,不能为空page
必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面scene
表示扫码后的携带的业务参数,最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&’()*+,/:;=?@-._~path
表示扫码进入的小程序页面路径,最大长度 128 字节,不能为空access_token
获取token的请求url:https://api.weixin.qq.com/cgi-bin/token
获取token的请求参数:
以下为获取token的示例代码**(请求微信url时,是https的post请求,此处忽略post请求的代码,网上到处都是0.0)**:
public static String getToken() {
try {
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("grant_type", "client_credential");
map.put("appid", "自己的appId");// 改成自己的appid
map.put("secret", "自己的secret"); //改成自己的secret
String rt = sendPost("https://api.weixin.qq.com/cgi-bin/token", map);
JSONObject json = JSONObject.fromObject(rt);
if (json.getString("access_token") != null || json.getString("access_token") != "") {
System.out.println("token:" + json.getString("access_token"));
return json.getString("access_token");
} else {
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
生成小程序码的请求url:https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=token
相关的请求参数(这里只标明常用的参数,其他参数可到微信官网查看):
以下为生成二维码的示例代码:
注意请求成功后,接收的返回值为返回的图片 Buffer,可根据具体情况处理,以下示例代码采用的是第二种方法:
//sceneStr:链接到改小程序界面所要的参数
//accessToken:上一个方法中所生产的token
public static String getminiqrQr(String sceneStr, String accessToken) {
RestTemplate rest = new RestTemplate();
InputStream inputStream = null;
OutputStream outputStream = null;
try {
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken;
Map<String, Object> param = new HashMap<>();
param.put("scene", sceneStr);
param.put("page", "pages/index/index");
param.put("width", 430);
param.put("auto_color", false);
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
HttpEntity requestEntity = new HttpEntity(param, headers);
ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class,
new Object[0]);
System.out.println("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
byte[] result = entity.getBody();
inputStream = new ByteArrayInputStream(result);
String imageStr = EncryptUtil.base64Encode(inputStreamToByte(inputStream));
System.out.println(imageStr);
return imageStr;
} catch (Exception e) {
throw new RuntimeException("生成二维码异常!");
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private static byte[] inputStreamToByte(InputStream inputStream) throws IOException{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int index = -1;
while((index = inputStream.read()) != -1){
baos.write(index);
}
return baos.toByteArray();
}
前端代码:
生成的小程序码
<img alt="小程序码" src="data:image/jpeg;base64,${后端返回来的流字符串}">
真实html代码效果
生成的小程序码
<img alt="小程序码" src="data:image/jpeg;base64,/9j/4AAQSkZJRg...">