zoukankan      html  css  js  c++  java
  • Java 生成微信小程序二维码(可以指定小程序页面 与 动态参数)

    一、准备工作

    1. 微信公众平台接口调试工具
    2. 小程序的唯一标识(appid)
    3. 小程序的密钥(secret)

    二、获取access_token

    打开微信公众平台接口调试工具,在参数列表中输入小程序的appid和secret,点击检查问题,如果appid和secret正确,则可以返回正确的access_token结果(图中下方的红框)

    获取access_token

    三、生成微信小程序二维码

    生成小程序二维码官方文档

    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html

    一共有三种生成二维码的方式,可以根据使用场景去选择,这里我使用的是第三种生成方式 wxacode.getUnlimited

    wxacode.createQRCode
    获取小程序二维码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制,详见获取二维码。
    POST https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN
    
    
    wxacode.get 
    获取小程序码,适用于需要的码数量较少的业务场景。通过该接口生成的小程序码,永久有效,有数量限制,详见获取二维码。
    POST https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN
    
    
    wxacode.getUnlimited     
    获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。 更多用法详见 获取二维码。
    POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

    使用wxacode.getUnlimited生成小程序二维码 

    获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。 更多用法详见 获取二维码。
    POST https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
    

      

    说明

    通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene字段的值,再做处理逻辑。
    使用如下代码可以获取到二维码中的 scene 字段的值。
    调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode
    // 这是首页的 js
    Page({
      onLoad: function(options) {
        // options 中的 scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
        var scene = decodeURIComponent(options.scene)
      }
    })

    获取接口调用凭证

     1     /**
     2      * 接口调用凭证 access_token
     3      */
     4     public static String postToken(String appId, String appKey) throws Exception {
     5 
     6         String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appKey;
     7         URL url = new URL(requestUrl);
     8         // 打开和URL之间的连接
     9         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    10         connection.setRequestMethod("POST");
    11         // 设置通用的请求属性
    12         connection.setRequestProperty("Content-Type", "application/json");
    13         connection.setRequestProperty("Connection", "Keep-Alive");
    14         connection.setUseCaches(false);
    15         connection.setDoOutput(true);
    16         connection.setDoInput(true);
    17 
    18         // 得到请求的输出流对象
    19         DataOutputStream out = new DataOutputStream(connection.getOutputStream());
    20         out.writeBytes("");
    21         out.flush();
    22         out.close();
    23 
    24         // 建立实际的连接
    25         connection.connect();
    26         // 定义 BufferedReader输入流来读取URL的响应
    27         BufferedReader in;
    28         if (requestUrl.contains("nlp"))
    29             in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
    30         else
    31             in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
    32         StringBuilder result = new StringBuilder();
    33         String getLine;
    34         while ((getLine = in.readLine()) != null) {
    35             result.append(getLine);
    36         }
    37         in.close();
    38         JSONObject jsonObject = JSONObject.parseObject(result.toString());
    39         return jsonObject.getString("access_token");
    40     }

    调用微信接口生成微信小程序二维码

     1     /**
     2      * 生成微信小程序二维码
     3      *
     4      * @param filePath
     5      *         本地生成二维码路径
     6      * @param page
     7      *         当前小程序相对页面 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
     8      * @param scene
     9      *         最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
    10      * @param accessToken
    11      *         接口调用凭证
    12      */
    13     public static void generateQrCode(String filePath, String page, String scene, String accessToken) {
    14 
    15         try {
    16 
    17             //调用微信接口生成二维码
    18             URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
    19             HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    20             httpURLConnection.setRequestMethod("POST");// 提交模式
    21             // conn.setConnectTimeout(10000);//连接超时 单位毫秒
    22             // conn.setReadTimeout(2000);//读取超时 单位毫秒
    23             // 发送POST请求必须设置如下两行
    24             httpURLConnection.setDoOutput(true);
    25             httpURLConnection.setDoInput(true);
    26             // 获取URLConnection对象对应的输出流
    27             PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
    28             // 发送请求参数
    29             JSONObject paramJson = new JSONObject();
    30             //这就是你二维码里携带的参数 String型  名称不可变
    31             paramJson.put("scene", scene);
    32             //注意该接口传入的是page而不是path
    33             paramJson.put("page", page);
    34             //这是设置扫描二维码后跳转的页面
    35             paramJson.put("width", 200);
    36             paramJson.put("is_hyaline", true);
    37             paramJson.put("auto_color", true);
    38             printWriter.write(paramJson.toString());
    39             // flush输出流的缓冲
    40             printWriter.flush();
    41 
    42             //开始获取数据
    43             BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
    44             OutputStream os = new FileOutputStream(new File(filePath));
    45             int len;
    46             byte[] arr = new byte[1024];
    47             while ((len = bis.read(arr)) != -1) {
    48                 os.write(arr, 0, len);
    49                 os.flush();
    50             }
    51             os.close();
    52         } catch (Exception e) {
    53             e.printStackTrace();
    54         }
    55 
    56         System.out.println("打开地址查看生成的二维码:" + filePath);
    57 
    58     }

    测试类

     1     public static void main(String[] args) throws Exception {
     2 
     3         //获取接口调用凭证access_token
     4         String appId = "小程序id";//小程序id
     5         String appKey = "小程序密钥";//小程序密钥
     6         String token = postToken(appId, appKey);
     7 
     8         //生成二维码
     9         generateQrCode("E:\tools\qrCode\test.png", "pages/index/index", "aa=108&bb=2&cc=3", token);
    10 
    11     }

    注意

    1      1.获取小程序appId 与appKey
    2      2.生成小程序二维码页面参数传入的是page而不是path,其他的接口是path。
    3      page后面不允许加参数,参数需要通过scene传入。而小程序也需要通过scene获取参数。
    4      3.生成小程序二维码可将二维码写入本地,也可上传至服务器。自行选择
    5      


    参考地址:
    https://www.cnblogs.com/daipianpian/p/9239452.html
    http://www.what21.com/u/10004/6756200547748968305.htm

    生成小程序二维码官方文档
    https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html

  • 相关阅读:
    我用微笑剪辑我的微电影 ---六月实习总结
    【Espruino】NO.17 使用平板电脑调试Espruino(OTG方式)
    级联下拉列表
    GG中obey命令的使用
    Android Studio 怎样打开两个项目?
    解决在sdk manager中更新文件后出现This Android SDK requires Android Developer Toolkit version 23.1的错误
    UVA1492
    Codeforces Round #256 (Div. 2)A-D
    C++ bool和string转换
    云计算设计模式(十六)——优先级队列模式
  • 原文地址:https://www.cnblogs.com/IT-study/p/14010826.html
Copyright © 2011-2022 走看看