java实现【 生成小程序二维码:图片+二维码备注】

   1.逻辑:进行获取小程序的token进行-获取不限制的小程序码。
   2.参考的地址:
    微信官方文档:

官网-获取不限制的小程序码

  需要注意的点:
         1. 如果传入page这个参数的话必须定义check_path参数,不然无法识别-page指定的目录
         2. 如果设置字体上传服务器必须要有这个字体否则会乱码-
         		例如:微软雅黑
         在本机可在    C:\Windows   查看这个字体是否存在。

在这里插入图片描述

这个存在就可以使用,不会乱码

在这里插入图片描述

代码如下:

package com.kingsha.controller.pc;

import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.stereotype.Service;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class TestNew {


    /**
     * 获取微信accesstoken
     *
     * @param wxappid
     * @param wxappkey
     * @return
     */
    public static String getWxAcesstoken(String wxappid, String wxappkey) throws CustomizeException {
        String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxappid + "&secret=" + wxappkey;

        try {
            String jsonstr = HttpUtil.get(tokenUrl);
            JSONObject jsonObject = JSON.parseObject(jsonstr);
            if (jsonObject.containsKey("access_token")) {
                String accesstoken = jsonObject.getString("access_token");
                return accesstoken;
            } else {
                log.error("未获取到token");
                throw new CustomizeException("未获取到token");
            }

        } catch (Exception e) {
            log.error("未获取到token");
            throw new CustomizeException(e.getMessage());
        }
    }

    /*
     * 获取 二维码图片
   *
     */
    public static String getminiqrQr(HttpServletRequest request) {
        String p="E://a//新建文件夹"; //二维码生产的地址  本地F盘code文件夹
        String codeUrl=p+"/twoCode.png";
        String twoCodeUrl="twoCode.png";
        String appId ="";   //自己小程序的appid
        String secret ="";   //自己小程序的密钥
        try
        {
            //这里调用的是上面的获取access_token方法
            String access_token = getWxAcesstoken(appId, secret);
            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+access_token);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
            // conn.setReadTimeout(2000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
//            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            // 发送请求参数
            JSONObject paramJson = new JSONObject();
//            id=2的数据
//                id 字段  status字段 0-未使用 1-已使用 time过期时间 create_time创建时间
            //第一次创建
            //1    0     2024-6-29     2024-6-28
            //1    1     2024-6-29     2024-6-28
            //过期时间进行对比
            paramJson.put("scene","2");//这就是你二维码里携带的参数 String型  名称不可变
            paramJson.put("page", "pages/product-list/index"); //这是设置扫描二维码后跳转的页面pages/home/home
            paramJson.put("width", 1280);//默认430,二维码的宽度,单位 px,最小 280px,最大 1280 px
            paramJson.put("is_hyaline", true);
            paramJson.put("check_path", false);
//            paramJson.put("auto_color", true);
            paramJson.put("env_version", "trial");//正式版为 "release",体验版为 "trial",开发版为 "develop"。默认是正式版。

            /**
             * TODO 新增部分开始 ---- 二维码中增加说明字段
             */
            // 发送请求
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            printWriter.write(paramJson.toString());
            printWriter.flush();
            // 获取二维码图片流并保存
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            OutputStream os = new FileOutputStream(new File(codeUrl));
            int len;
            byte[] arr = new byte[1024];
            while ((len = bis.read(arr)) != -1) {
                os.write(arr, 0, len);
                os.flush();
            }
            os.close();
            // 在生成的二维码图片下方添加文字
            BufferedImage qrCodeImage = ImageIO.read(new File(codeUrl)); // 读取已生成的二维码图片
            //设置名称
            String text = "机构1";
            //字体的大小
            int fontSize = 150;
            //二维码的大小 - 值越大图片越小
            int extraSpaceBelowText = 200;
            BufferedImage imageWithText = new BufferedImage(qrCodeImage.getWidth(), 		qrCodeImage.getHeight() + fontSize + extraSpaceBelowText, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = imageWithText.createGraphics();
            g2d.drawImage(qrCodeImage, 0, 0, null);

            Font font = new Font("微软雅黑", Font.PLAIN, fontSize);
            FontMetrics fontMetrics = g2d.getFontMetrics(font);
            int textWidth = fontMetrics.stringWidth(text);
            int x = (qrCodeImage.getWidth() - textWidth) / 2;
            int y = qrCodeImage.getHeight() + fontSize;

            g2d.setColor(Color.BLACK);
            g2d.setFont(font);
            g2d.drawString(text, x, y);

            g2d.dispose();

            // 保存带有文字的二维码图片
            File outputfile = new File(p + "/twoCode_with_text.png");
            ImageIO.write(imageWithText, "png", outputfile);

            return outputfile.getName(); // 返回生成的带文字的二维码图片文件名



        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return twoCodeUrl;
    }


    public static void main(String[] args) {
        JSONObject data=new JSONObject();
        data.put("twoCodeUrl", getminiqrQr(null));

        System.out.println(data);
    }

}

实现的效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/770810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024微信小程序期末大作业-点奶茶微信小程序(后端nodejs-server)(附下载链接)_微信小程序期末大作业百度网盘下载

菜单展示 购物车展示&#xff1a; 提交订单&#xff1a; 支付详情页展示&#xff1a; 订单查看&#xff1a; 查看历史消费&#xff1a; 部分代码展示&#xff1a; <!--pages/home/home.wxml--> <block wx:for"{{listData}}" wx:key"itemlist&qu…

国标GB28181视频汇聚平台LntonCVS视频监控安防平台与国标协议对接解决方案

应急管理部门以“以信息化推动应急管理能力现代化”为总体目标&#xff0c;加快现代信息技术与应急管理业务深度融合&#xff0c;全面支持现代应急管理体系建设&#xff0c;这不仅是国家加强和改进应急管理工作的关键举措&#xff0c;也是应对日益严峻的应急管理形势和满足公众…

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…

PKUMOD同学又双叒获奖啦~

近期王选所数据管理研究室的同学们 凭借在各自领域的卓越表现 获得了多项荣誉和奖励 让我们共赏风采~ 期待他们在未来的科研道路上 取得更加辉煌的成就 庞悦 前沿交叉学科研究院2020级博士生 荣获2024年北京大学校长奖学金 庞悦&#xff0c;北京大学元培学院2016级本科生&…

zabbix小白入门:从SNMP配置到图形展示——以IBM服务器为例

作者 乐维社区&#xff08;forum.lwops.cn&#xff09;许远 在运维实践中&#xff0c;Zabbix作为一款强大的开源监控工具&#xff0c;被广泛应用于服务器、网络设备和应用程序的监控&#xff0c;成为保障业务连续性和高效运行的关键。然而&#xff0c;对于Zabbix的初学者来说&a…

2024年前端面试题及答案

7、 nginx代理跨域 8、 nodejs中间件代理跨域 9、 WebSocket协议跨域 前端数据加密问题 1 一般如何处理用户敏感信息&#xff1f; 前端一般使用md5、base64加密、sha1加密&#xff0c;想要了解详情请自行百度。 前端http相关问题 1 HTTP常用状态码及其含义&#xff1f; …

vue-element-admin集成方案如何运行以及代码解读

文章目录 1.vue-admin-admin介绍2.运行方法3.代码解读3.1基础外层文件解读&#xff0c;以及eslint关闭&#xff08;如下图&#xff09;3.2内层src文件分析3.2.1 login流程解析 1.vue-admin-admin介绍 1.1 是一个后台前端解决方案(vueelementui)&#xff0c;内置i18国际化解决方…

行业洞察 | 2024应用程序安全领域现状报告

在信息爆炸的时代&#xff0c;我们每天都在使用各种应用&#xff0c;从社交娱乐到工作学习&#xff0c;应用已经成为我们生活中不可或缺的一部分。然而&#xff0c;你是否知道&#xff0c;在这些便捷的背后&#xff0c;隐藏着巨大的安全风险&#xff1f; 近年来&#xff0c;应用…

Build a Large Language Model (From Scratch)附录D(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

Windows系统安装SSH服务结合内网穿透配置公网地址远程ssh连接

前言 在当今的数字化转型时代&#xff0c;远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于 Windows 用户而言&#xff0c;SSH&#xff08;Secure Shell&#xff09;协议提供了一种安全、高效的远程访问和命令执行方式。SSH 不仅提供了加密的通信通道&#xff0c;…

单片机IO

一、简单GPIO口 保护二极管&#xff1a;IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。 当引脚电压高于VDD时&#xff0c;上方的二极管导通&#xff0c;电压被钳位在VDD0.7V&#xff1b; 当引脚电压低于VSS时&#xff0c;下方的二极管导通&#xff0c;防止不…

设计模型 - 学习笔记

学习参考&#xff1a; https://blog.csdn.net/m0_65346405/article/details/136994128 《系统分析师教程》 《设计模式之禅》 一. 设计模式的5大原则 1. 单一职责原则 一个类应该只有一个变化因子。 就是说&#xff0c;一个类要变化&#xff0c;比如增加功能&#xff0c;那么引…

Elasticsearch 8.x 存储有无压缩?能压缩到多少?

1、认知前提 Elasticsearch 支持压缩&#xff0c;压缩方式默认为&#xff1a;LZ4 压缩算法。 具体参见&#xff1a; The default value compresses stored data with LZ4 compression, but this can be set to best_compression which uses DEFLATE for a higher compression r…

mybatis mapper.xml 比较运算符(大于|小于|等于)的写法: 转义和<![CDATA[]]>

文章目录 引言I 使用xml 原生转义的方式进行转义II 使用 <![CDATA[ 内容 ]]>引言 应用场景:查询时间范围 背景:在 *.xml 中使用常规的 < > = <= >= 会与xml的语法存在冲突 <![CDATA[]]> 比 转义符 来的繁琐 <![CDATA[]]> 表示xml解析器忽略…

Linux内网端口转公网端口映射

由于服务商做安全演练&#xff0c;把原先服务器内网的端口映射到外网端口全都关闭了&#xff0c;每次维护服务器特别麻烦&#xff0c;像数据库查询如果用原生的mysql 去连接&#xff0c;查询返回的结果乱了&#xff0c;非常不方便。 查了服务还是可以正常访问部分外网的&#x…

mongodb在windows环境安装部署

一、mongodb 1.释义 MongoDB 是一种开源的文档型 NoSQL 数据库管理系统&#xff0c;使用 C 编写&#xff0c;旨在实现高性能、高可靠性和易扩展性。MongoDB 采用了面向文档的数据模型&#xff0c;数据以 JSON 风格的 BSON&#xff08;Binary JSON&#xff09;文档存储&#x…

Unity射击游戏开发教程:(29)躲避敌人的子弹射击

在这篇文章中,我将介绍如何创建一个可以使玩家火力无效的敌人。创建的行为如下...... 当玩家向敌人开火时,敌人会向左或向右移动。向左或向右的移动是随机选择的,并在一段时间后停止敌人的移动。如果敌人移出屏幕,它就会绕到另一边。将一个精灵拖到画布上,将其缩小以匹配游…

mdb转gdb实现过程介绍(2)三种方式实现GDB数据库的读、写,并将实现方式与ArcGIS环境共存配置

一、内容提示 通过解析mdb地理数据库&#xff0c;获取了图层之间的组织结构、空间参考、表字段属性等信息。 下一步&#xff0c;就是将数据输出到GDB中。 下面详细介绍python3.9版本&#xff0c;读写GDB数据的方法&#xff1a; &#xff08;1&#xff09;使用ArcPy创建GDB、读写…

【MySQL基础篇】函数及约束

1、函数 函数是指一段可以直接被另一段程序程序调用的程序或代码。 函数 - 字符串函数 MySQL中内置了很多字符串函数&#xff0c;常用的几个如下&#xff1a; 函数功能CONCAT(S1,S2,...,Sn)字符串拼接&#xff0c;将S1,S2,...,Sn拼接成一个字符串LOWER(str)将字符串str全部…

STM32第十二课:ADC检测烟雾浓度(MQ2)

文章目录 需求一、MQ-2 气体传感器特点应用电路及引脚 二、实现流程1.开时钟&#xff0c;分频&#xff0c;配IO2.配置ADC的工作模式3.配置通道4.复位&#xff0c;AD校准5.数值的获取 需求实现总结 需求 使用ADC将MQ2模块检测到的烟雾浓度模拟量转化为数字量。 最后&#xff0c…