赞
踩
业务需求:生成小程序的二维码,并携带指定参数;
官方提供两个接口,我选择了 wxacode.getUnlimited,生成数量不受限制 ;
- /**
- * 获取微信accesstoken
- *
- * @param wxappid
- * @param wxappkey
- * @return
- */
- 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());
- }
- }
返回的格式是ByteArrayInputStream,它是一个访问数组的字节输入流
- 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;
- }
- /**
- * 获取小程序菊花码
- *parm:machineNo 二维码想携带的参数
- **/
- public String getWXCode(String machineNo) throws CustomizeException {
- private String appId ="asdasdasd"; //自己小程序的appid
- private 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);
- //这里判断的是返回的图片还是错误信息,一般错误信息不会大于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"))) {
- 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);
- }
- fileOutputStream.flush();
- fileOutputStream.close();
-
- inputStream.close();
- log.error("二维码生成成功");
- } catch (Exception e) {
- log.error("获取二维码异常");
- throw new CustomizeException(e.getMessage());
- }
- return aiyunUrl;
- }
- public class CustomizeException extends Exception {
-
- public CustomizeException(String message) {
- super(message);
- }
- }
至此二维码生成成功!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。