Java生成微信小程序二维码,5种实现方式,一个比一个简单

article/2025/9/27 3:47:15

文章目录

  • 前言
  • 先看官网
  • 一、JDK自带的URLConnection方式
  • 二、Apache的HttpClient方式
  • 三、okhttp3方式
  • 四、Unirest方式
  • 五、RestTemplate方式
  • 其它细节
    • getAccessToken
    • 构建参数map
    • byte[]数组
  • 源码下载


前言

先介绍一下项目场景,主要是通过微信小程序二维码裂变分享,每个账号有专属邀请二维码,分享出去,有新人扫码入驻,就可以得到现金奖励或红包奖励。当然,产品设计会更丰富,不止有裂变模式,还有渠道推广模式,还有各种奖励规则,但核心实现都是生成二维码。对于如何生成微信小程序二维码,本文一共列举了5种实现方式,其中第1、2种是网上常见的方式,第3、4、5种封装的更为优雅,文末可打包下载开箱即用的全套源码,我更期待老铁的文末 投票 :哪种方式你更喜欢?
请添加图片描述


先看官网

项目主要用的是微信官方提供的服务端能力,考虑到涉及secrettoken等安全问题,所以从架构上设计的调用链路为前端->后端API->微信API。裂变的场景决定要选择获取不限制的小程序码接口,永久有效,数量暂无限制,接口英文名:getUnlimitedQRCode

官方地址:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html

在这里插入图片描述


一、JDK自带的URLConnection方式

在网上常见的方式,这是从 JDK1.1 开始就自带的Http请求方式,核心代码如下:

public byte[] getWechatQrcodeByHttpURL(String url, Map<String, Object> body) {HttpURLConnection httpURLConnection = null;try {httpURLConnection = (HttpURLConnection) new URL(url).openConnection();httpURLConnection.setRequestMethod("POST");// 发送POST请求必须设置如下两行httpURLConnection.setDoOutput(true);httpURLConnection.setDoInput(true);// 获取URLConnection对象对应的输出流PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());// 发送请求参数printWriter.write(JSONObject.toJSONString(body));// flush输出流的缓冲printWriter.flush();//开始获取数据try (InputStream inputStream = httpURLConnection.getInputStream();ByteArrayOutputStream out = new ByteArrayOutputStream()) {byte[] buffer = new byte[1024];int len = -1;while ((len = inputStream.read(buffer)) != -1) {out.write(buffer, 0, len);}return out.toByteArray();}} catch (Exception e) {e.printStackTrace();} finally {if (httpURLConnection != null) {httpURLConnection.disconnect();}}return null;
}

JDK自带的方式,功能虽然可以实现,但代码看上去确实跟不上时代发展了!


二、Apache的HttpClient方式

HttpClient 相比于 JDK 自带的 URLConnection方式,代码做了封装,可读性和简洁度都显著提升!核心代码如下:

public byte[] getWechatQrcodeByHttpClient(String url, Map<String, Object> body) {CloseableHttpClient httpClient = HttpClientBuilder.create().build();HttpPost httpPost = new HttpPost(url);try {StringEntity entity = new StringEntity(JSONObject.toJSONString(body));entity.setContentType("image/png");httpPost.setEntity(entity);HttpResponse response = httpClient.execute(httpPost);try (InputStream inputStream = response.getEntity().getContent();ByteArrayOutputStream out = new ByteArrayOutputStream()) {byte[] buffer = new byte[1024];int len = -1;while ((len = inputStream.read(buffer)) != -1) {out.write(buffer, 0, len);}return out.toByteArray();}} catch (Exception e) {e.printStackTrace();}return null;
}

Maven依赖:

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.12</version>
</dependency>

三、okhttp3方式

okhttp3是Square公司开发,用于替代 HttpUrlConnection和Apache HttpClient方式,优雅的 API 设计,且链式调用,让你顺滑到底!

核心代码如下:

public byte[] getWechatQrcodeByOkhttp3(String url, Map<String, Object> body) {OkHttpClient client = new OkHttpClient().newBuilder().build();okhttp3.MediaType mediaType = okhttp3.MediaType.parse("application/json");RequestBody requestBody = RequestBody.create(mediaType, JSONObject.toJSONString(body));Request request = new Request.Builder().url(url).method("POST", requestBody).build();try {Response response = client.newCall(request).execute();if (response.isSuccessful()) {return response.body().bytes();}} catch (IOException e) {e.printStackTrace();}return null;
}

Maven依赖:

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.2</version>
</dependency>

四、Unirest方式

okhttp3方式其实不管是性能还是代码的链式调用,都已经非常优秀。但作为底层基于Apache HttpClient方式unirest-java,提供了更为便捷、链式调用、功能强大的API用于http请求!核心代码如下(一行代码搞定,屌爆了!!!):

public byte[] getWechatQrcodeByUnirest(String url, Map<String, Object> body) {return Unirest.post(url).body(JSONObject.toJSONString(body)).asBytes().getBody();
}

Maven依赖:

<dependency><groupId>com.konghq</groupId><artifactId>unirest-java</artifactId><version>3.11.11</version>
</dependency>

五、RestTemplate方式

我之前写过一篇博文对RestTemplate.exchange结合案例进行了详细的介绍:RestTemplate.exchange各种用法(包括泛型等 --全),推荐阅读!

这也是我们项目实际使用的方式,使用Spring框架开发,还是强烈推荐使用Spring的RestTemplate,它是对于其它方式的高级封装,内部可以配置ClientHttpRequestFactory来指定底层请求方式:

  • 指定为SimpleClientHttpRequestFactory,则内部使用JDK自带的HttpURLConnection方式
  • 指定为HttpComponentsClientHttpRequestFactory,则内部使用Apache HttpClient方式
  • 指定为OkHttp3ClientHttpRequestFactory,则内部使用okhttp3方式

核心代码也是一行:

public byte[] getWechatQrcodeByRestTemplate(String url, Map<String, Object> body) {return restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(body, null), byte[].class).getBody();
}

另外,RestTemplate在构造函数中默认增加了ByteArrayHttpMessageConverter,可以读取和写入字节数组的HttpMessageConverter的实现,默认情况下,此转换器支持所有媒体类型(media types)。

在这里插入图片描述


其它细节

getAccessToken

这是接口调用凭证,用restTemplate调用也是非常简洁,核心代码如下:

private String wechatQrcodeUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";
private String appid = "替换成你的appid";
private String s = "替换成你的secret";public String getAccessToken() {String url = String.format(wechatAccessTokenUrl, appid, s);Map<String, String> responseBody = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<Map<String, String>>() {}).getBody();if (responseBody == null || responseBody.get("errcode") != null) {// 获取失败System.out.println("getAccessToken失败:" + (responseBody == null ? "null" : responseBody.toString()));return null;}return responseBody.get("access_token");
}

对于access_token,建议保存到redis,2小时过期后再获取

构建参数map

body 就是参数Map,需要根据实际情况自行设定:

Map<String,Object> body = new HashMap<>();
// 场景码,与前端约定,最终是需要前端解析
body.put("scene", scene);
// 正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
body.put("env_version", envVersion);
// 透明,根据你的场景自行设置body参数
body.put("is_hyaline", true);

在这里插入图片描述

byte[]数组

为什么要先得到byte[]数组?,因为我们需要先判断返回结果是否包含errcode,如果不包含,才是图片Buffer!

如果不包含errorCode,那么byte[]数组不管是保存本地,还是转成Base64,或者上传到OSS,都非常湿滑了!

  • 保存本地
private void saveQrCodeToLocal(byte[] bytes) {try {InputStream inputStream = new ByteArrayInputStream(bytes);FileOutputStream out = new FileOutputStream("d:\\test.png");byte[] buffer = new byte[8192];int bytesRead = 0;while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {out.write(buffer, 0, bytesRead);}out.flush();inputStream.close();out.close();} catch (IOException e) {e.printStackTrace();}
}
  • Base64
Base64.getEncoder().encodeToString(bytes);
  • 上传OSS
    这是我们项目使用的, 底层做了封装,直接传byte[]即可,非常方便!

源码下载

源码都是经过实测的,可以直接使用!

下载地址:https://download.csdn.net/download/scm_2008/87398320

❤️ 博客主页:https://blog.csdn.net/scm_2008
❤️ 欢迎点赞👍 收藏留言✏️ 如有错误敬请指正!
❤️ 本文由 天罡gg 原创,首发于 CSDN博客🙉
❤️ 停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活



http://chatgpt.dhexx.cn/article/YYx0kpQu.shtml

相关文章

微信小程序转二维码方法分享

微信小程序转二维码方法分享 需要转码的可以看看 这个东西是看个人需求的&#xff0c;618就要来了&#xff0c;各种活动也将来袭 有些小伙伴不知道怎么生成 为了方便小程序邀请活动没法外发&#xff0c;这里分享下将小程序转二维码的方法 首先&#xff0c;你需要在电脑上打…

微信小程序绘制二维码

一、前言 在日常的小程序项目中&#xff0c;会经常遇到需要动态绘制二维码的需求。使用场景很多&#xff0c;例如绘制在海报上&#xff0c;例如制作票务码、核销码等等。 这篇文章是应一位好友的需求而写的&#xff0c;也希望能够给有需要的同学一些帮助。 二、实现原理 使用…

微信小程序二维码识别

目前市场上二维码识别的软件或者网站越来越多&#xff0c;可是真正方便&#xff0c;无广告的却少之很少。 于是&#xff0c;自己突发奇想做了一个微信二维码识别的小程序。 包含功能&#xff1a; 1、识别二维码 ①普通二维码 ②条形码 ③只是复制解析出来的数据 2、生成二维码 …

微信小程序扫描普通二维码跳转到小程序指定页面

这个功能的逻辑是什么呢&#xff1f; 二维码就相当于是一个链接 相当于我们点击一个链接跳转到另一个页面 只不过这里是扫码的形式 如何操作 1、首先我们需要在微信公众平台的开发管理——>开发设置&#xff0c;找到&#xff08;扫普通链接二维码打开小程序&#xff09;&…

微信小程序中生成二维码

一般在微信小程序中&#xff0c;生成二维码是一个很常见的场景&#xff0c;但是查阅官方文档&#xff0c;却没有一个现成的可以使用的组件。 经过搜索&#xff0c;生成二维码组件一般是需要借助第三方库来实现。实现的步骤分为&#xff1a; 下载第三方库安装第三方库wxml中生…

微信小程序 — 生成二维码功能

微信小程序实现生成二维码功能。需要用到canvas组件&#xff0c;设置 type为2d. 需要使用js包weapp-qrcode-canvas-2dhttps://github.com/DoctorWei/weapp-qrcode-canvas-2dweapp-qrcode-canvas-2d 是使用新版canvas-2d接口在微信小程序中生成二维码&#xff08;外部二维码&am…

生成微信小程序发布上线后的二维码 、获取微信小程序二维码、微信小程序二维码如何生成?

情景&#xff1a; 1、在微信小程序审核完成&#xff0c;发布到线上后&#xff0c;想通过扫描小程序二维码进入小程序 2、可分享二维码出去&#xff0c;通过二维码扫码进入小程序 方法&#xff1a; 1、进入微信小程序的后台配置。链接&#xff1a;微信公众平台。&#xff08;…

如何生成微信小程序二维码,小程序内页二维码

你自己得有个微信公众号&#xff0c;只需要知道小程序的名字就可以了 生成小程序二维码 第一步编辑素材 第二步搜索小程序名字&#xff0c;然后回车&#xff0c;下一步 第三步选小程序码 小程序内页二维码 第一步编辑素材 第二步搜索小程序名字&#xff0c;然后回车&…

OpenShift 4 - 在单节点的 OpenShift 上用 NFS Operator 实现以 RWX 访问存储

《OpenShift / RHEL / DevSecOps 汇总目录》 文本已在 OpenShift Local 4.12 环境中进行验证。 文章目录 OpenShift 支持的存储访问模式用 NFS Provisioner Operator 实现 RWX 访问存储安装 NFS Operator解决安装 Operator 过程无法访问谷歌 gcr.io 上的容器镜像配置 NFSProvis…

Linux文件的rwx含义,文件(目录)rwx权限的意义

我们知道不同的角色针对同一个文件(目录)可能会有不同的权限&#xff0c;那么rwx权限的意义是什么呢&#xff1f; 对于文件 文件是包含实际数据的地方&#xff0c;包括一般文本文件、数据库内容文件、二进制可执行文件等。对于文件来说&#xff0c;rwx权限的意义为&#xff1a;…

Linux文件的rwx含义,Linux文件权限rwx简单了解

Ⅰ 了解Linux下的文件权限 如上图所示,ll命令详细展示当前目录下的文件或者子目录信息 红框标注的即为此文件或者目录的权限 【第一行文件10.c的权限以-开头,用来说明这是一个文件;第四行code目录的权限以字母d开头,用来标注code是目录】 关于文件权限,我们要先了解有那些…

chmod,rwx Linux文件属性笔记221107

Linux的文件属性包含文件类型和文件权限 文件类型 -表示文件d表示文件夹l表示软链接 文件权限 r 读权限w 写权限x 执行权限 文件所属 u代表所属用户g代表所属组o代表其它用户 chmod 命令可以修改用户权限 可以通过 r w x 字母修改也可以用 3位0到7 的数字修改 chmod 用 …

关于Linux文件权限rwx的通俗解释

在Linux中&#xff0c;每个文件都有它所对应的权限 我们可以通过在终端输入ls -ahl的方式来查看 这是一个文件列表&#xff0c;每一行都对应一个文件的详细信息 第一个字符&#xff0c;对应的是类型 &#xff08;1&#xff09;如果是d&#xff0c;那么对应的是directory&…

linux中文件权限为drwxr,linux drwxr-xr-x 什么意思 ?

第一位表示文件类型。d是目录文件&#xff0c;l是链接文件&#xff0c;-是普通文件&#xff0c;p是管道 第2-4位表示这个文件的属主拥有的权限&#xff0c;r是读&#xff0c;w是写&#xff0c;x是执行。 第5-7位表示和这个文件属主所在同一个组的用户所具有的权限。 第8-10位表…

Linux_rwx权限

L i n u x _ r w x 权限 \color{blue}{\huge{Linux\_rwx权限}} Linux_rwx权限 Ⅰ.概述 ①. 第 0 0 0代表文件类型( d 、 l 、 c 、 b 、 a 、 − d、l、c、b、a、- d、l、c、b、a、−) l l l&#xff1a;代表连接(快捷方式) d d d&#xff1a;代表目录 c c c&#xff1a;代…

Linux的文件权限说明(rwx)

一、权限说明 在Linux中r是可读权限&#xff0c;w是可写权限&#xff0c;x是可执行权限。4表示可读权限r&#xff0c;2表示可写权限w&#xff0c;1表示可执行权限x&#xff0c;然后将其相加。 注&#xff1a;R的值等于4 W的值等于2 X的值等于1 完全权限&#xff1a;4217 读写权…

drwxrwx--x代表什么

DDMS视图的File Explorer和Android文件管理器里面可以看到这一串字母. 代表的是文件访问权限. 第一位: -表示这是一个文件 d表示这是一个文件夹 l表示这是一个链接 后9位分成三组, 都是rwx, 也就是: r读 w写 x执行 三个组分别是: 所有者 用户组 其他 看下这张图就能明白…

linux中的文件权限类、rwx 作用文件和目录的不同解释

1.6 文件权限类 1.6.1 文件属性 Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做 了不同的规定。在Lin…