Java中生成微信小程序太阳码的实现方案


Posted in Java/Android onJune 01, 2022

背景

当前小程序盛行的时代,无论走在那里都会看到各种各样的小程序太阳码,小程序项目中经常也会用到小程序的太阳码,那么我们如何生成小程序的太阳码呢?

实现方案

我们可以通过如下的方法实现小程序太阳码生成。

Java中生成微信小程序太阳码的实现方案

生成有限制太阳码

实现步骤

  • 获取小程序的access_token
  • 设置path、with相关参数
  • 调用getwxacodeunlimit接口,并将返回图片存储到本地

获取小程序的access_token

public static String getAccessToken(String appid, String appsecret)
    {
        String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appsecret+"";
        String accessToken = null;
        try
        {
            String response = HttpClientUtil.getInstance().sendHttpsGet(
                    requestUrl, null);
            JSONObject json = JSONObject.parseObject(response);
            accessToken = String.valueOf(json.get("access_token"));
        }
        catch (Exception e)
        {
            logger.error("getAccessToken error", e);
        }

        return accessToken;
    }

说明:调用微信API接口传入小程序的appid和appsecret参数即可。

调用微信api生成小程序太阳码

public static String generatLimitSunCode(WxScanCodeParam param) throws Exception 
    {
       String token =param.getAccessToken();
       Map<String, String> params = new HashMap<>();
       params.put("path", param.getPath());
       params.put("width", "430");
       CloseableHttpClient httpClient = HttpClientBuilder.create().build();
       HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/wxa/getwxacode?access_token="+token);
       httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
       String body = JSON.toJSONString(params);
       StringEntity entity = new StringEntity(body);
       entity.setContentType("image/jpg");
       httpPost.setEntity(entity);
       HttpResponse response = httpClient.execute(httpPost);
       int statusCode = response.getStatusLine().getStatusCode();
       if (statusCode == HttpStatus.SC_OK) 
       {
           HttpEntity entity2 = response.getEntity();
           if(!entity2.getContentType().getValue().equals("image/jpeg"))
           {
               String result = EntityUtils.toString(entity2, "UTF-8");
               logger.error("generate sun code error,http execute result:" + result);
               return null;
           }
       }
       else
       {
           logger.error("generate sun code error,http execute result:" + statusCode);
       }
       
       InputStream inputStream = response.getEntity().getContent();
        // 保存图片到本地     
       int flag = saveImg(inputStream, param.getFilePath(), name);
       if (flag == 0)
       {
           throw new SysException("保存图片[" + name + "]失败");
       }
       else
       {
           logger.info("太阳码[{}]生成成功", name);
       }
       return param.getFilePath() + File.separatorChar + name;
   }

说明

参数说明

  • path:扫码进入的小程序页面路径,最大长度 128 字节,不能为空;例如:pages/index/index
  • access_token:小程序授权token

注意事项

需要特殊注意,本方案生成的小程序太阳码与二维码的总数不能超过10万个,微信没有提供对应的Api接口查询的使用的数量,一旦超过了数量,将会导致小程序失效,且微信目前无法重置查询次数,适合于生成数量少的场景。

生成无限制太阳码

获取小程序的access_token

如同第一种的方案

调用微信api生成小程序太阳码

/**
     * 生成无限制的小程序码
     * @param param
     * @return
     * @throws Exception
     */
    public static String generatUnlimitSunCode(WxScanCodeParam param) throws Exception 
    {
       String token =param.getAccessToken();
       Map<String, String> params = new HashMap<>();
       params.put("scene", param.getScene());
       params.put("page", param.getPath());
       params.put("width", "430");
       CloseableHttpClient httpClient = HttpClientBuilder.create().build();
       HttpPost httpPost = new HttpPost("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+token);
       httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
       String body = JSON.toJSONString(params);
       StringEntity entity = new StringEntity(body);
       entity.setContentType("image/jpg");
       httpPost.setEntity(entity);
       HttpResponse response = httpClient.execute(httpPost);
       int statusCode = response.getStatusLine().getStatusCode();
       if (statusCode == HttpStatus.SC_OK) 
       {
           HttpEntity entity2 = response.getEntity();
           if(!entity2.getContentType().getValue().equals("image/jpeg"))
           {
               String result = EntityUtils.toString(entity2, "UTF-8");
               logger.error("generate sun code error,http execute result:" + result);
               return null;
           }
       }
       else
       {
           logger.error("generate sun code error,http execute result:" + statusCode);
       }
       
       InputStream inputStream = response.getEntity().getContent();
       
       //太阳码写标题
       String content=param.getWriteContent();
       if(StringUtil.isNotEmpty(content) && param.isWrite())
       {
          inputStream = ImageUtil.addImageTitle(param.getWriteContent(), inputStream, 450, 450);
       }
      
       String name = param.getFileName()+".jpg";//文件名加后缀,跟上面对应
       

       int flag = saveImg(inputStream, param.getFilePath(), name);// 保存图片
       if (flag == 0)
       {
           throw new SysException("保存图片[" + name + "]失败");
       }
       else
       {
           logger.info("太阳码[{}]生成成功", name);
       }
       return param.getFilePath() + File.separatorChar + name;
   }

说明

参数说明

  • scene:最大32个可见字符,参数格式可以自行定义a&b或者a=1&b=2都行
  • access_token:小程序授权token

参数过长问题

由于scene参数的长度只支持32位字符,如果参数超过了32位,我们将如何合处理?

解决方案

改问题的解决方案为:设计一张小程序参数表,将生成的参数存储到表中,生成小程序是scene参数设置此表表的主键,小程序扫码后,先请求后台通过scene参数获取小程序的具体参数。

如下示例:

Java中生成微信小程序太阳码的实现方案

扩展功能

  • 如何给生成的小程序添加标题或者水印等
  • 如何生成待小程序码的海报

关于这些功能的实现,如果有需要的可以随时与我联系。

总结

本文讲解了如何生成微信小程序太阳码,通过微信提供的两种方案都可以实现,在实际的项目中建议采用第二种方案。

到此这篇关于Java中生成微信小程序太阳码的实现方案的文章就介绍到这了,更多相关小程序太阳码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
手把手教你用SpringBoot将文件打包成zip存放或导出
Jun 11 Java/Android
详解Spring事件发布与监听机制
Jun 30 Java/Android
如何给HttpServletRequest增加消息头
Jun 30 Java/Android
Java移除无效括号的方法实现
Aug 07 Java/Android
Spring依赖注入多种类型数据的示例代码
Mar 31 Java/Android
Android基于Fresco实现圆角和圆形图片
Apr 01 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
解决Springboot PostMapping无法获取数据的问题
May 06 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
Spring Boot项目如何优雅实现Excel导入与导出功能
Jun 10 Java/Android
Springboot中如何自动转JSON输出
Jun 16 Java/Android
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
Aug 05 Java/Android
Java处理延时任务的常用几种解决方案
Java实现添加条码或二维码到Word文档
Jun 01 #Java/Android
Spring IOC容器Bean的作用域及生命周期实例
May 30 #Java/Android
spring IOC容器的Bean管理XML自动装配过程
May 30 #Java/Android
利用正则表达式匹配浮点型数据
May 30 #Java/Android
JavaScript正则表达式实现注册信息校验功能
May 30 #Java/Android
Java时间工具类Date的常用处理方法
May 25 #Java/Android
You might like
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
解析:使用php mongodb扩展时 需要注意的事项
2013/06/18 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
2014/07/29 PHP
php快速查找数据库中恶意代码的方法
2015/04/01 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
php源码的使用方法讲解
2019/09/26 PHP
菜单效果
2006/10/14 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
解析Python编程中的包结构
2015/10/25 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
为数据库创建索引都需要注意些什么
2012/07/17 面试题
文职个人求职信范文
2013/09/23 职场文书
初三学生评语大全
2014/04/24 职场文书
广告学专业毕业生自荐信
2014/05/28 职场文书
2014年团工作总结
2014/11/27 职场文书
团委工作总结2015
2015/04/02 职场文书
单位综合评价意见
2015/06/05 职场文书
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
Vue h函数的使用详解
2022/02/18 Vue.js
如何利用python创作字符画
2022/06/25 Python
MySQL 原理与优化之原数据锁的应用
2022/08/14 MySQL