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

 更新时间:2022年05月31日 16:21:28   作者:剑圣无痕  
这篇文章主要介绍了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中生成微信小程序太阳码的实现方案的文章就介绍到这了,更多相关小程序太阳码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈springcloud常用依赖和配置

    浅谈springcloud常用依赖和配置

    鉴于很多小伙伴常问spring cloud常用依赖和配置,今天特地整理了本篇文章,文中有非常详细的代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • MyBatis中的limit分页设置

    MyBatis中的limit分页设置

    这篇文章主要介绍了MyBatis中的limit分页设置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java线程中的用户态和内核态解读

    Java线程中的用户态和内核态解读

    这篇文章主要介绍了Java线程中的用户态和内核态解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • MyBatisPlus+SpringBoot实现乐观锁功能详细流程

    MyBatisPlus+SpringBoot实现乐观锁功能详细流程

    乐观锁是针对一些特定问题的解决方案,主要解决丢失更新问题,下面这篇文章主要给大家介绍了关于MyBatisPlus+SpringBoot实现乐观锁功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Java选择排序法以及实例详解

    Java选择排序法以及实例详解

    在本篇文章里小编给大家整理了一篇关于Java选择排序法以及实例内容,并做了详细分析,有兴趣的朋友们可以跟着学习下。
    2022-11-11
  • 详谈java 堆区、方法区和栈区

    详谈java 堆区、方法区和栈区

    下面小编就为大家带来一篇详谈java 堆区、方法区和栈区。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 详解Maven环境的搭建与idea配置

    详解Maven环境的搭建与idea配置

    本篇文章主要介绍了详解Maven环境的搭建与idea配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java关键字this(动力节点Java学院整理)

    Java关键字this(动力节点Java学院整理)

    java中的this随处可见,用法也多。通常情况下理解this关键字还是很容易的,但是在我初学的时候,有一个疑问却一直不能很清晰的理解,现在慢慢的理解了,下面通过本文给大家记录下,有需要的朋友参考下
    2017-03-03
  • 深入Java7的一些新特性以及对脚本语言支持API的介绍

    深入Java7的一些新特性以及对脚本语言支持API的介绍

    本篇文章是对Java7的一些新特性以及对脚本语言支持API的概述,需要的朋友参考下
    2013-05-05
  • Java项目如何引入日志生成器及其日志分级

    Java项目如何引入日志生成器及其日志分级

    这篇文章主要介绍了Java项目引入日志生成器及其日志分级,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12

最新评论