微信小程序二维码生成工具,后端二维码生成工具类。

article/2025/9/20 6:11:40

微信小程序开发二维码生成工具类

    • 前言
    • 业务背景
    • 设计思路
    • 具体实现
    • 接下来我们进行工具的改造

前言

或许这是你搜寻的第n篇文章来解决你项目中的问题,虽然我不能去替你完全适配你的业务需求,但是我可以给你一个解决问题的思路!或许 这是你第一次认识我这个 码农 但是欢迎你关注我,后续我会持续更新本博客,并耐心为各位进行回复,你们的支持就是我写下去的动力!话不多说让我们来讲一下今天的业务背景以及我的思路,如有不对欢迎批评指正。

业务背景

在当下轻应用盛行的时代,微信小程序开发已然在软件开发中占据了举足轻重的地位,不知从何时起,我们去面试的时候虽然投递的简历是后端开发工程师或Java开发工程师,但我们总会碰到面试官问的一句会前端开发么?了解小程序开发么?
这篇博客是我在实际项目做后端开发技术支持时,小程序开发人员抛给我的一个问题,现在市面上的二维码生成技术无非前端使用QRcode来实现,CSDN中的前端二维码生成博客或者小程序二维码生成博客十篇有八篇时使用的这项技术,实际在微信小程序开发中,微信小程序的服务端api给出了一个生成小程序二维码的api。双方生成的区别之处,使用QRcode生成的二维码第一点我不太能接受的就是像业务经常说的为什么别的开发可以做出的效果你做不出来?为什么别人的小程序分享出来的二维码是一个圆形的中间带有log且扫描后直接可以到小程序内的,而你的是一个方方正正的样子呢虽然看的过去但是体验不怎么棒的呢?

设计思路

1、刚开始,我们使用前端即小程序端来生成相应的宣传海报,附带二维码,开始时前端选用QRcode进行实现,虽然可以生成但是效果并不怎么样,且前端需要使用到小程序的appid以及secret或者额外做一次交互,由后端使用http请求携带appid及secret获取token然后返回给前端,前端再进行二维码的获取,但坏处是无法将二维码落地存储,因使用的是微信的api且微信的api表示该二维码无时间限制。最终我们将换取token以及拿到二维码两次调用全部交由后端来实现,方便二维码进行保存。
2、使用到的api
获取Token:auth.getAccessToken点击api可以直达微信官方的文档。
获取二维码:wxacode.getUnlimited点击api可以直达微信官方文档。

具体实现

1、我们知道在我们的项目中经常会用到http请求get或者post居多,很多时候我们会在项目中创建相应的http的get或者post工具类本次我们实现此工具同样会用到我们写http请求的东西。

首先我们看下我们常见的http的工具类

package com.example.test.ExampleProject.util;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;/*** http获取文件并下载*/
public class HttpRequestUtils {/*** 向指定URL发送GET方法的请求** @param url*            发送请求的URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return result  所代表远程资源的响应结果*/public static String sendGet(String url, String param) {//接受返回值String result = "";//读取相应的BufferedReaderBufferedReader in = null;try {//拼接get请求的地址及参数如下//localhost:8080/项目名/拦截地址.json?name=1&file=2String urlNameString = url + "?" + param;//将拼接的链接数据放入URL里用于后面打开链接及发送数据URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; MAC OS 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段若需要则进行处理不需要可删除Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}/*** 向指定 URL 发送POST方法的请求** @param url*            发送请求的 URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return 所代表远程资源的响应结果*/public static String sendPost(String url, Map param) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}return result;}
}

上面可以看到我们使用的基本的一个httpget和post主要使用的是Java的IO包中的输入输出流和Java的net包中的URL和URLConnection并不复杂的一个东西,如果你看过了我上面的api链接可以看到微信的生成二维码的部分wxacode.getUnlimited是返回的Buffer我们暂且可以认为他是一个流。那我们后续处理就简单了起来首先我们需要从微信获取token也就是调用get请求一个地址拿到其返回值,这一步我不需要过多解释若您不懂可以现使用postMan工具请求一下看下返回值,方便你后续进行理解。

接下来我们进行工具的改造

1、首先:我们需要了解自己的需求,两种选择,第一我们将生成的二维码落地,第二我们直接返回二维码并不在服务端进行保存。
2、在这我们先讲第二种的情况也就是直接返回二维码并不在服务端保存,在这呢微信给我们埋了一个坑,我们在调用微信的wxacode.getUnlimited时要注意链接地址并不单纯,我们需要将第一步get获取的access_token放在URL上,然后将scene、page、width等这些参数放入Map中在postMan中将width这些参数放入body中(postMan如下图)
postMan请求微信生成二维码
好我们这里的一个小坑已经讲完了那我们是不是直接放入上面工具类中直接请求返回就ok了?答案是并不行的,原因是我们上面的工具类返回的是一个String类型,而微信给我们的文档是返回一个Buffer。那我们怎么去改呢?这时候第二个坑就来了。注意:若我们直接返回图片不带任何东西只返回图片流的话我们需要知道一个东西就是HttpServletResponse类
我们既然要直接返回图片的话那我们一定是直接通过HttpServletResponse的流输出去的,你的Controller返回直接为void即可。
那我们此时进行改造即可首先进行Controller改造代码如下仅供参考。

package com.webappdemo.controller;import com.haishi.webappdemo.utils.HttpRequestUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;@RestController
public class TestController {@RequestMapping(value = "/getQRcode.json", method = RequestMethod.GET)public void getQRcode(@RequestParam("url") String url, HttpServletResponse response){Map<String, String> param = new HashMap<>();HttpRequestUtils.sendPost(url, param, response);}}

我们这直接看可能会有点懵是因为刚刚上面的工具类是接收的两个参数怎么你在Controller内就三个了?这个是因为刚刚我说过了直接通过HttpServletResponse进行图片的流的输出所以我这边工具类进行了更改。注意我这边通过Controller直接调用的工具类实际应用中我们应是调用应用层然后到服务层由服务层去直接交互工具类具体使用方法按照各位项目来!
下面我们开始写工具类改造的思路:

  1. 首先:通过注释我们可以看到我们将传入的url放入了Url类中然后使用URLConnection打开链接,get与post方式不同之处是post使用了new PrintWriter(conn.getOutputStream());获取了输出流,然后通过print方法发送参数,刷新输出流的缓存最终发送过去数据。
  2. 其次:我们如何解决图片的问题?我们可以看到现在代码中使用BufferedReader接了一下链接上的输入流也就是URL的响应。那我们就来改造这部分话不多说先上代码
/*** 向指定 URL 发送POST方法的请求** @param url*            发送请求的 URL* @param param*            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return 所代表远程资源的响应结果*/public static void sendPost(String url, Map param, HttpServletResponse response) {PrintWriter out = null;InputStream in = null;try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = conn.getInputStream();OutputStream outputStream = response.getOutputStream();int len = 0;byte[] bytes = new byte[1024];while ((len = in.read(bytes)) != -1) {outputStream.write(bytes, 0, len);}outputStream.flush();outputStream.close();} catch (Exception e) {System.out.println("发送 POST 请求出现异常!"+e);e.printStackTrace();}//使用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}}

从上方代码中可以看到我们好像并没有返回任何东西,那么图片怎么能回去呢?实际是通过了HttpServletResponse获取了OutputStream然后使用OutputStream内的write方法直接返回的。若不太理解可联想上方中out = new PrintWriter(conn.getOutputStream());这行代码结合理解,若不太理解可暂时认为他俩原理相同,即在开启的http请求中可以通过获取链接中的输出流将数据或值放入,然后刷新流进行输出这样对方就会接收到然后我们关闭流即本次连接结束。
上方我们主要改造了两处:
第一处就是我们没有使用之前的BufferReader了改为了Input Stream 第二呢肯定就是我们的Output Stream的改造,实际上我们可选择的方式很多,这仅仅是demo欢迎各位指正错误之处,也欢迎各位提出更好的方案!感谢!


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

相关文章

生成普通的微信小程序二维码

1.登录微信小程序后台传送门 开发管理->开发设置->扫普通链接二维码打开小程序 在这里开通此功能,然后按微信定义的规则配置具体的地址,等正式上线的时候再发布该规则 2.然后按照配置的二维码规则(上图第三项)去直接生成普通的二维码(可自行携带参数),然后微信扫一扫就…

JAVA微信小程序二维码生成,Base64格式输出。

调用接口必要条件&#xff0c;微信公众号的APPID&#xff0c;APPSECRET 微信公众平台小程序二维码文档 // 先获取AccessToken,不然无法请求调取小程序二维码/*** 获取微信小程序接口access_token凭证*/ public Map<String,String> getAccessToken() {String url "h…

微信小程序二维码生成器

微信小程序二维码生成器 项目介绍 项目是一个简单实用的二维码生成器。可以输入相关的网址&#xff0c;生成二维码图片&#xff0c;可保存分享。 项目展示 项目代码 index.wxml <!--pages/main/index.wxml--> <view class"container-box"><view …

微信小程序二维码生成

首先需要引入二维码生成工具weapp-qrcode.js或者直接安装npm install weapp-qrcode --save import QRCode from ../../utils/weapp-qrcode.js 页面使用cavas <canvas style"width:160rpx;height:160rpx" canvas-id"myQrcode"></canvas> 生…

微信小程序任意指定页面生成二维码

在日常微信小程序运营中&#xff0c;文章&#xff0c;和朋友圈海报内总会用到微信小程序特定页面二维码 第一步&#xff1a;登录微信公众平台https://mp.weixin.qq.com/ 第二步&#xff1a;点击右上角工具-》生成小程序码 第三步&#xff1a;将鼠标放置“获取更多页面路径”&a…

微信小程序实现输入内容生成二维码(canvas)

1.封装好的QRcode的js文件 !function() {function r(r, o) {var f;r > o && (f r, r o, o f), f o, f * o, f o, f >> 1, p[f r] 1;}function o(o, f) {var e;for (F[o l * f] 1, e -2; e < 2; e) F[o e l * (f - 2)] 1, F[o - 2 l * (f e…

二、业务数据采集平台

第1章 电商业务简介 1.1 电商业务流程 电商的业务流程可以以一个普通用户的浏览足迹为例进行说明&#xff0c;用户点开电商首页开始浏览&#xff0c;可能会通过分类查询也可能通过全文搜索寻找自己中意的商品&#xff0c;这些商品无疑都是存储在后台的管理系统中的。 当用户寻找…

从0到1搭建大数据平台之数据采集系统

关于从0到1搭建大数据平台&#xff0c;之前的一篇博文《如何从0到1搭建大数据平台》已经给大家介绍过了&#xff0c;接下来我们会分步讲解搭建大数据平台的具体注意事项。 一、“大”数据 海量的数据 当你需要搭建大数据平台的时候一定是传统的关系型数据库无法满足业务的存储计…

大数据之数据采集

本篇主要介绍目前网站数据采集的主流方式&#xff0c;之后篇章会介绍客户端数据采集目前主流的实现方式。 目前有很多数据采集云平台&#xff0c;如Google anylytics&#xff0c;百度统计&#xff0c;腾讯统计等等&#xff0c;还有一些平台也非常不错&#xff1a; 一.友盟&…

3. 业务数据采集平台概述

3. 业务数据采集平台概述 电商业务简介电商业务流程电商常识SKU和SPU平台属性和销售属性 电商业务数据电商系统表结构活动信息表&#xff08;activity_info&#xff09;活动规则表&#xff08;activity_rule&#xff09;活动商品关联表&#xff08;activity_sku&#xff09;平台…

测量数据采集分析平台

青创智通科技测量数据采集分析平台&#xff0c;改变传统纸张方式&#xff0c;快速实现生产质量管理的数字化、智能化、平台化。 产品优势&#xff1a; 1、检测智联与精益生产&#xff1a;实现产品制造过程各部位的尺寸测量、测量信息采集、实时传输及数据分析。 2、与各种智…

数据运营平台-数据采集

目录 行为数据采集 业务数据采集与转换 第三方系统API对接 用户数据关联 人工数据采集 数据输出 行为数据采集 1.埋点采集 ①跨平台打通 确定性方法识别 利用用户帐号体系中&#xff0c;可以是系统生成的 UserID&#xff0c;可以是手机号&#xff0c;也可以是邮箱&am…

大数据采集概述

文章目录 大数据采集概述1.互联网大数据与采集1.1互联网大数据来源1.社交媒体2.社交网络3.百科知识库4.新闻网站5.评论信息6.位置型信息 1.2 互联网大数据的特征1.大数据类型和语义更加丰富2.数据的规范化程度弱3.数据的流动性更大4.数据的开放性更好5.数据的来源更加丰富6.互联…

大数据项目离线数仓(全 )一(数据采集平台)

搭建用户行为数据采集平台、搭建业务数据采集平台、搭建数据仓库系统、制作可视化报表 本篇博客包括搭建用户行为数据采集平台、搭建业务数据采集平台 搭建数据仓库系统在大数据项目离线数仓&#xff08;全 &#xff09;二 制作可视化报表在大数据项目离线数仓&#xff08;全…

采集平台-大数据平台数据采集系统

随着社会的发展。人们也是越来越离不开互联网&#xff0c;今天小编就给大家盘点一下免费的采集平台&#xff0c;只需要点几下鼠标就能轻松爬取数据&#xff0c;不管是导出excel还是自动发布到网站都支持。详细参考图片一、二、三、四&#xff01; 企业人员 通过爬取动态网页数…

4. 业务数据采集平台搭建

4. 业务数据采集平台搭建 业务数据采集模块Hive安装部署业务数据同步概述数据同步策略概述数据同步策略选择数据同步工具概述 DataX 数据同步工具Maxwell 数据同步工具全量表数据同步数据通道DataX 配置文件DataX 配置文件生成脚本生成文件生成全部配置文件脚本测试生成的 Data…

奇点云数据中台技术汇(二)| DataSimba系列之数据采集平台

继上期数据中台技术汇栏目发布DataSimba——企业级一站式大数据智能服务平台&#xff0c;本期介绍DataSimba的数据采集平台。 DataSimba采集平台属于DataSimba的数据计算及服务平台的一部分&#xff0c; 负责数据的导入&#xff0c; 从而支持上层的数据处理。 DataSimba的定…

六大主流大数据采集平台架构分析

日志收集的场景 DT时代&#xff0c;数以亿万计的服务器、移动终端、网络设备每天产生海量的日志。 中心化的日志处理方案有效地解决了在完整生命周期内对日志的消费需求&#xff0c;而日志从设备采集上云是始于足下的第一步。 随着大数据越来越被重视&#xff0c;数据采集的挑战…

简单谈谈Redis中的几种java客户端以及优缺点!

一、摘要 相对于其他的分布式中间件&#xff0c;Redis 支持的客户端种类非常繁多&#xff0c;涵盖更加全面&#xff0c;除了支持比较流行的 c、c、java、C#、php、Python 等语言以外&#xff0c;还支持 Objective-C、Swift、Node.js 等等&#xff0c;以下是来自于 Redis 支持的…

Redis介绍、安装、客户端

1. Redis介绍 1.1 什么是NoSql 为了解决高并发、高可用、高可扩展&#xff0c;大数据存储等一系列问题而产生的数据库解决方案&#xff0c;就是NoSql。NoSql&#xff0c;叫非关系型数据库&#xff0c;它的全名Not only sql。它不能替代关系型数据库&#xff0c;只能作为关…