目之瞬间-专注于互联网平台

Java实现微信小程序生成小程序二维码,并携带参数。

业务需求:生成小程序的二维码,并携带指定参数;

生成小程序二维码官方链接

官方提供两个接口,我选择了wxacode.getUnlimited,生成数量不受限制;

1.首先需要获取微信的access_token

public static String getWxAcesstoken(String wxappid, String wxappkey) throws CustomizeException {String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxappid + "&secret=" + wxappkey;try {String jsonstr = HttpUtil.get(tokenUrl);JSONObject jsonObject = JSON.parseObject(jsonstr);if (jsonObject.containsKey("access_token")) {String accesstoken = jsonObject.getString("access_token");return accesstoken;} else {log.error("未获取到token");throw new CustomizeException("未获取到token");}} catch (Exception e) {log.error("未获取到token");throw new CustomizeException(e.getMessage());}}

2.重写了一个发送http请求的方法

返回的格式是ByteArrayInputStream,它是一个访问数组的字节输入流

public static ByteArrayInputStream sendPost(String URL, String json) {InputStream inputStream = null;ByteArrayInputStream byteArrayInputStream = null;// 创建默认的httpClient实例.CloseableHttpClient httpclient = HttpClients.createDefault();// 创建httppostHttpPost 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;}

3.第三步就是生成小程序二维码的逻辑

public String getWXCode(String machineNo) throws CustomizeException {private String appId ="asdasdasd";   //自己小程序的appidprivate String secret ="454654645564";   //自己小程序的密钥String aiyunUrl = "";try {//这里调用的是上面的获取access_token方法String access_token = getWxAcesstoken(appId, secret);String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + access_token;String scene = machineNo;  /携带参数放在scene 内Map<String, String> param = new HashMap<>();param.put("scene", scene);//这里的page如果没有的话可以不写,默认是跳主页,如果写了没有的页面的话,会返回错误信息//            param.put("page", "pages/index/index");String json = JSON.toJSONString(param);ByteArrayInputStream inputStream = sendPost(url, json);//这里判断的是返回的图片还是错误信息,一般错误信息不会大于200if (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"))) {log.error("所传page页面不存在,或者小程序没有发布");throw new CustomizeException("所传page页面不存在,或者小程序没有发布");} else if ("45009".equals(jsonObject.getString("errcode"))) {log.error("调用分钟频率受限");throw new CustomizeException("调用分钟频率受限");}byteArrayOutputStream.close();}//上传阿里云,也可以不上传String aiyunUrl= ossClientUtil.UploadImgAndReturnImgUrlInputStream(inputStream, fileName, path);//输出到本地的代码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);}