当前位置:   article > 正文

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

java生成小程序二维码 带参数

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

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

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

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

  1. /**
  2. * 获取微信accesstoken
  3. *
  4. * @param wxappid
  5. * @param wxappkey
  6. * @return
  7. */
  8. public static String getWxAcesstoken(String wxappid, String wxappkey) throws CustomizeException {
  9. String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxappid + "&secret=" + wxappkey;
  10. try {
  11. String jsonstr = HttpUtil.get(tokenUrl);
  12. JSONObject jsonObject = JSON.parseObject(jsonstr);
  13. if (jsonObject.containsKey("access_token")) {
  14. String accesstoken = jsonObject.getString("access_token");
  15. return accesstoken;
  16. } else {
  17. log.error("未获取到token");
  18. throw new CustomizeException("未获取到token");
  19. }
  20. } catch (Exception e) {
  21. log.error("未获取到token");
  22. throw new CustomizeException(e.getMessage());
  23. }
  24. }

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

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

  1. public static ByteArrayInputStream sendPost(String URL, String json) {
  2. InputStream inputStream = null;
  3. ByteArrayInputStream byteArrayInputStream = null;
  4. // 创建默认的httpClient实例.
  5. CloseableHttpClient httpclient = HttpClients.createDefault();
  6. // 创建httppost
  7. HttpPost httppost = new HttpPost(URL);
  8. httppost.addHeader("Content-type", "application/json; charset=utf-8");
  9. httppost.setHeader("Accept", "application/json");
  10. try {
  11. StringEntity s = new StringEntity(json, Charset.forName("UTF-8"));
  12. s.setContentEncoding("UTF-8");
  13. httppost.setEntity(s);
  14. HttpResponse response = httpclient.execute(httppost);
  15. if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  16. // 获取相应实体
  17. HttpEntity entity = response.getEntity();
  18. inputStream = entity.getContent();
  19. ByteArrayOutputStream outStream = new ByteArrayOutputStream();
  20. // 创建一个Buffer字符串
  21. byte[] buffer = new byte[1024];
  22. // 每次读取的字符串长度,如果为-1,代表全部读取完毕
  23. int len = 0;
  24. // 使用一个输入流从buffer里把数据读取出来
  25. while ((len = inputStream.read(buffer)) != -1) {
  26. // 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
  27. outStream.write(buffer, 0, len);
  28. }
  29. // 关闭输入流
  30. inputStream.close();
  31. // 把outStream里的数据写入内存
  32. byteArrayInputStream = new ByteArrayInputStream(outStream.toByteArray());
  33. }
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. } finally {
  37. // 关闭连接,释放资源
  38. try {
  39. httpclient.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. return byteArrayInputStream;
  45. }

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

  1. /**
  2. * 获取小程序菊花码
  3. *parm:machineNo 二维码想携带的参数
  4. **/
  5. public String getWXCode(String machineNo) throws CustomizeException {
  6. private String appId ="asdasdasd"; //自己小程序的appid
  7. private String secret ="454654645564"; //自己小程序的密钥
  8. String aiyunUrl = "";
  9. try {
  10. //这里调用的是上面的获取access_token方法
  11. String access_token = getWxAcesstoken(appId, secret);
  12. String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + access_token;
  13. String scene = machineNo; /携带参数放在scene 内
  14. Map<String, String> param = new HashMap<>();
  15. param.put("scene", scene);
  16. //这里的page如果没有的话可以不写,默认是跳主页,如果写了没有的页面的话,会返回错误信息
  17. // param.put("page", "pages/index/index");
  18. String json = JSON.toJSONString(param);
  19. ByteArrayInputStream inputStream = sendPost(url, json);
  20. //这里判断的是返回的图片还是错误信息,一般错误信息不会大于200
  21. if (inputStream.available() <= 200) {
  22. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  23. int i;
  24. byte[] buffer = new byte[200];
  25. while ((i = inputStream.read(buffer)) != -1) {
  26. byteArrayOutputStream.write(buffer, 0, i);
  27. }
  28. String str = new String(byteArrayOutputStream.toByteArray());
  29. //错误信息的格式在官方文档里有
  30. JSONObject jsonObject = JSONObject.parseObject(str);
  31. if ("41030".equals(jsonObject.getString("errcode"))) {
  32. log.error("所传page页面不存在,或者小程序没有发布");
  33. throw new CustomizeException("所传page页面不存在,或者小程序没有发布");
  34. } else if ("45009".equals(jsonObject.getString("errcode"))) {
  35. log.error("调用分钟频率受限");
  36. throw new CustomizeException("调用分钟频率受限");
  37. }
  38. byteArrayOutputStream.close();
  39. }
  40. //上传阿里云,也可以不上传
  41. String aiyunUrl= ossClientUtil.UploadImgAndReturnImgUrlInputStream(inputStream, fileName, path);
  42. //输出到本地的代码
  43. FileOutputStream fileOutputStream = new FileOutputStream("D:/123.png");
  44. int i;
  45. byte[] buffer = new byte[200];
  46. while ((i = inputStream.read(buffer)) != -1) {
  47. fileOutputStream.write(buffer, 0, i);
  48. }
  49. fileOutputStream.flush();
  50. fileOutputStream.close();
  51. inputStream.close();
  52. log.error("二维码生成成功");
  53. } catch (Exception e) {
  54. log.error("获取二维码异常");
  55. throw new CustomizeException(e.getMessage());
  56. }
  57. return aiyunUrl;
  58. }

4.用到的自定义的一个异常

  1. public class CustomizeException extends Exception {
  2. public CustomizeException(String message) {
  3. super(message);
  4. }
  5. }

至此二维码生成成功! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/397887
推荐阅读
相关标签
  

闽ICP备14008679号