微信小程序实现获取小程序码和二维码java接口开发


Posted in Javascript onMarch 29, 2019

前言:目前小程序推出了自己的识别码,小程序码,这个圆形的码看起来比二维码好看。本文总结微信小程序的获取小程序码和二维码并生成二维码图片的接口开发。主要内容摘抄自微信小程序的API文档,java接口开发是自己总结开发。

微信小程序API文档:获取二维码

一、简介

通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面。目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所示:

微信小程序实现获取小程序码和二维码java接口开发

二、获取小程序码

目前有两个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口。

1 不带参数有限个数小程序码接口

适用于需要的码数量较少的业务场景

接口地址:https://api.weixin.qq.com/wxa/getwxacode?access_token=ACCESS_TOKEN

注:获取accesstoken的方法跟微信公众获取accesstoken方法一致,不过小程序获取accesstoken需要小程序的appid和appsercet。登录 https://mp.weixin.qq.com ,就可以在网站的“设置”-“开发者设置”中,查看到微信小程序的 AppID 了,注意不可直接使用服务号或订阅号的 AppID 。

微信小程序实现获取小程序码和二维码java接口开发 

获取微信小程序的 AppID文章地址:小程序简易教程

(1)POST 参数说明

参数 类型 默认值 说明
path String 不能为空,最大长度 128 字节
width Int 430 二维码的宽度
auto_color Bool false 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调
line_color Object {“r”:”0”,”g”:”0”,”b”:”0”} auth_color 为 false 时生效,使用 rgb 设置颜色 例如 {“r”:”xxx”,”g”:”xxx”,”b”:”xxx”}

注意:通过该接口生成的小程序码,永久有效,但数量有效,请谨慎使用。用户扫描该码进入小程序后,将直接进入 path 对应的页面。

(2)请求接口测试

使用http请求插件postman或者RESTClient请求测试。

微信小程序实现获取小程序码和二维码java接口开发
请求测试结果返回一个小程序码图片,与微信公众平台生成二维码不同,小程序码直接返回文件流,不是微信公众平台的url和ticket。

(3)java接口开发

注:此接口是基于Spring RestTemplate进行http请求,进行http请求有很多方法和工具类,可自行百度或参考下面的参考文章。接口只是提供一个解决方法的思路。

public Map getminiqrQr(String accessToken) {
  RestTemplate rest = new RestTemplate();
  InputStream inputStream = null;
  OutputStream outputStream = null;
  try {
   String url = "https://api.weixin.qq.com/wxa/getwxacode?access_token="+accessToken;
   Map<String,Object> param = new HashMap<>();
   param.put("page", "pages/index/index");
   param.put("width", 430);
   param.put("auto_color", false);
   Map<String,Object> line_color = new HashMap<>();
   line_color.put("r", 0);
   line_color.put("g", 0);
   line_color.put("b", 0);
   param.put("line_color", line_color);
   LOG.info("调用生成微信URL接口传参:" + param);
   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]);
   LOG.info("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
   byte[] result = entity.getBody();
   LOG.info(Base64.encodeBase64String(result));
   inputStream = new ByteArrayInputStream(result);

   File file = new File("C:/Users/wangqiulin/Desktop/1.png");
   if (!file.exists()){
    file.createNewFile();
   }
   outputStream = new FileOutputStream(file);
   int len = 0;
   byte[] buf = new byte[1024];
   while ((len = inputStream.read(buf, 0, 1024)) != -1) {
    outputStream.write(buf, 0, len);
   }
   outputStream.flush();
  } catch (Exception e) {
   LOG.error("调用小程序生成微信永久小程序码URL接口异常",e);
  } finally {
   if(inputStream != null){
    try {
     inputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if(outputStream != null){
    try {
     outputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return null; 
 }

说明:accessToken的获取方法就不多说,因为小程序二维码很坑爹的返回文件流,导致我们必须对流进行处理转换成图片保存到本地,这样还有一个严重的后果就是无法将二维码保存到数据库中,每次想获取二维码必须请求接口,此接口最多生成不超过100000个,请大家谨慎使用。

2 带参数无限个数小程序码接口

适用于需要的码数量极多,或仅临时使用的业务场景

接口地址:https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

获取accessToken的方法跟接口1一致。

(1)POST 参数说明

参数 类型 默认值 说明
scene String 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
page String 必须是已经发布的小程序页面,例如 “pages/index/index” ,如果不填写这个字段,默认跳主页面
width Int 430 二维码的宽度
auto_color Bool false 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调
line_color Object {“r”:”0”,”g”:”0”,”b”:”0”} auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {“r”:”xxx”,”g”:”xxx”,”b”:”xxx”}

注意:通过该接口生成的小程序码,永久有效,数量暂无限制。用户扫描该码进入小程序后,开发者需在对应页面获取的码中 scene 字段的值,再做处理逻辑。使用如下代码可以获取到二维码中的 scene 字段的值。调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode。同时需要注意,此接口的page参数中不能带任何参数,参数都在scene 参数中处理,切记!!!

// 这是首页的 js
Page({
 onLoad: function(options) {
 // options 中的 scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
 var scene = decodeURIComponent(options.scene)
 }
})

(2)请求接口测试

微信小程序实现获取小程序码和二维码java接口开发

(3)java接口开发

public Map 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);
   Map<String,Object> line_color = new HashMap<>();
   line_color.put("r", 0);
   line_color.put("g", 0);
   line_color.put("b", 0);
   param.put("line_color", line_color);
   LOG.info("调用生成微信URL接口传参:" + param);
   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]);
   LOG.info("调用小程序生成微信永久小程序码URL接口返回结果:" + entity.getBody());
   byte[] result = entity.getBody();
   LOG.info(Base64.encodeBase64String(result));
   inputStream = new ByteArrayInputStream(result);

   File file = new File("C:/Users/wangqiulin/Desktop/1.png");
   if (!file.exists()){
    file.createNewFile();
   }
   outputStream = new FileOutputStream(file);
   int len = 0;
   byte[] buf = new byte[1024];
   while ((len = inputStream.read(buf, 0, 1024)) != -1) {
    outputStream.write(buf, 0, len);
   }
   outputStream.flush();
  } catch (Exception e) {
   LOG.error("调用小程序生成微信永久小程序码URL接口异常",e);
  } finally {
   if(inputStream != null){
    try {
     inputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if(outputStream != null){
    try {
     outputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return null; 
 }

3 获取小程序二维码

适用于需要的码数量较少的业务场景

接口地址:https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=ACCESS_TOKEN

(1)POST 参数说明

参数 类型 默认值 说明
path String 不能为空,最大长度 128 字节
width Int 430 二维码的宽度

注意:通过该接口生成的小程序二维码,永久有效,数量限制见文末说明,请谨慎使用。用户扫描该码进入小程序后,将直接进入 path 对应的页面。

示例:

{"path": "pages/index?query=1", "width": 430}

注:pages/index 需要在 app.json 的 pages 中定义

(2)请求接口测试

微信小程序实现获取小程序码和二维码java接口开发

(3)java接口开发

public Map getminiqrQr(String accessToken) {
  RestTemplate rest = new RestTemplate();
  InputStream inputStream = null;
  OutputStream outputStream = null;
  try {
   String url = "https://api.weixin.qq.com/wxaapp/createwxaqrcode?access_token="+accessToken;
   Map<String,Object> param = new HashMap<>();
   param.put("page", "pages/index/index");
   param.put("width", 430);
   LOG.info("调用生成微信URL接口传参:" + param);
   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]);
   LOG.info("调用小程序生成微信永久二维码URL接口返回结果:" + entity.getBody());
   byte[] result = entity.getBody();
   LOG.info(Base64.encodeBase64String(result));
   inputStream = new ByteArrayInputStream(result);

   File file = new File("C:/Users/wangqiulin/Desktop/1.png");
   if (!file.exists()){
    file.createNewFile();
   }
   outputStream = new FileOutputStream(file);
   int len = 0;
   byte[] buf = new byte[1024];
   while ((len = inputStream.read(buf, 0, 1024)) != -1) {
    outputStream.write(buf, 0, len);
   }
   outputStream.flush();
  } catch (Exception e) {
   LOG.error("调用小程序生成微信永久二维码URL接口异常",e);
  } finally {
   if(inputStream != null){
    try {
     inputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
   if(outputStream != null){
    try {
     outputStream.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
  return null; 
 }

三、说明

1:通过该接口,仅能生成已发布的小程序的二维码。
2:可以在开发者工具预览时生成开发版的带参二维码。
3:接口1加上接口2,总共生成的码数量限制为100,000,请谨慎调用。
4 : POST 参数需要转成 json 字符串,不支持 form 表单提交。
5 : auto_color line_color 参数仅对小程序码生效。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 面向对象编程  function是方法(函数)
Sep 17 Javascript
JavaScript 对象成员的可见性说明
Oct 16 Javascript
解析页面加载与js函数的执行 onload or ready
Dec 12 Javascript
每天一篇javascript学习小结(Date对象)
Nov 13 Javascript
js html css实现复选框全选与反选
Oct 09 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
vue axios 表单提交上传图片的实例
Mar 16 Javascript
解决Mac安装thrift因bison报错的问题
May 17 Javascript
express 项目分层实践详解
Dec 10 Javascript
如何制作一个Node命令行图像识别工具
Dec 12 Javascript
js字符串类型String常用操作实例总结
Jul 05 Javascript
vue2.0 解决抽取公用js的问题
Jul 31 Javascript
详解vue项目打包步骤
Mar 29 #Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 #jQuery
Vue项目history模式下微信分享爬坑总结
Mar 29 #Javascript
vue中使用微信公众号js-sdk踩坑记录
Mar 29 #Javascript
微信小程序学习笔记之本地数据缓存功能详解
Mar 29 #Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
Mar 29 #Javascript
详解vue配置后台接口方式
Mar 29 #Javascript
You might like
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
基于php实现随机合并数组并排序(原排序)
2015/11/26 PHP
php实现的http请求封装示例
2016/11/08 PHP
php中如何执行linux命令详解
2018/11/06 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
jquery tools之tabs 选项卡/页签
2009/07/25 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
javascript常用方法汇总
2014/12/02 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
javascript实现的右下角弹窗实例
2015/04/24 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
python实现SMTP邮件发送功能
2020/06/16 Python
python tensorflow学习之识别单张图片的实现的示例
2018/02/09 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
会计电算化专业毕业生推荐信
2013/12/24 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
营销团队口号
2014/06/06 职场文书
建筑管理专业求职信
2014/07/28 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
JavaScript 实现页面滚动动画
2021/04/24 Javascript
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS