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

目录
  • 背景
  • 实现方案
  • 生成有限制太阳码
    • 实现步骤
      • 获取小程序的access_token
      • 调用微信api生成小程序太阳码
      • 说明
      • 参数说明
      • 注意事项
      • 获取小程序的access_token
      • 调用微信api生成小程序太阳码
      • 说明
      • 参数说明
      • 参数过长问题
      • 解决方案
  • 生成无限制太阳码
  • 扩展功能
  • 总结

背景

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

实现方案

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

生成有限制太阳码

实现步骤

  • 获取小程序的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中生成微信小程序太阳码的实现方案的文章就介绍到这了,更多相关小程序太阳码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 微信小程序动态生成二维码的实现代码

    效果图如下: 实现 wxml <!-- 存放二维码的图片--> <view class='container'> <image bindtap="previewImg" mode="scaleToFill" src="{{imagePath}}"></image> </view> <!-- 画布,用来画二维码,只用来站位,不用来显示--> <view class=&qu

  • 微信小程序分享海报生成的实现方法

    为了吸引更多的用户,设计好一个分享海报还是很有必要的.而小程序要生成一个海报还是有点坑的,下面分享下我们打卡小程序的一些经验. 分享海报的效果图如下: 制作要求: 海报以弹窗形式展现,各种手机型号都可以正常显示 海报的内容由背景图.日期.随机的名言警句.活动的二维码及用户的参加活动的信息 海报保存的图片大小为 iphone 6 的两倍图(750 * 1334) 由于看到的弹窗图片与保存的图片是两种大小,所以一开始看了些网上的其他教程,建议是搞两个 canvas 一个大的一个小的.实际过程中,采用

  • 微信小程序生成海报分享朋友圈的实现方法

    项目需求写完有一段时间了,但是还是想回过来总结一下,一是对项目的回顾优化等,二是对坑的地方做个记录,避免以后遇到类似的问题. 需求 利用微信强大的社交能力通过小程序达到裂变的目的,拉取新用户. 生成的海报如下 需求分析 1.利用小程序官方提供的api可以直接分享转发到微信群打开小程序 2.利用小程序生成海报保存图片到相册分享到朋友圈,用户长按识别二维码关注公众号或者打开小程序来达到裂变的目的 实现方案 一.分析如何实现 相信大家应该都会有类似的迷惑,就是如何按照产品设计的那样绘制成海报,其实当时

  • 微信小程序生成二维码的示例代码

    好久没有写文章了,最近公司要做海报分享的活动,需要在小程序中生成扫了之后可以跳转普通网页的二维码,就在github上面找了一下,确实找到了一个兼容兼容性比较不错的,给打加分享一下. 中间尝试了不少,有些在Android上上城会出现问题,亲测这个有效,兼容比较好,已经应用到我们项目中了. 由于在使用便利性方面考虑,我对这个进行了一定的改动,新增了二维码白边功能和支持回调函数直接获取临时文件的功能,希望能够帮助到大家. github地址 weapp-qrcode 点击查看(欢迎star),其中附有源

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

    目录 背景 实现方案 生成有限制太阳码 实现步骤 获取小程序的access_token 调用微信api生成小程序太阳码 说明 参数说明 注意事项 获取小程序的access_token 调用微信api生成小程序太阳码 说明 参数说明 参数过长问题 解决方案 生成无限制太阳码 扩展功能 总结 背景 当前小程序盛行的时代,无论走在那里都会看到各种各样的小程序太阳码,小程序项目中经常也会用到小程序的太阳码,那么我们如何生成小程序的太阳码呢? 实现方案 我们可以通过如下的方法实现小程序太阳码生成. 生成有

  • 利用uni-app生成微信小程序的踩坑记录

    目录 前言 1.不允许id选择器 2.默认竖排 3.图片加载不出来 4.eval函数不可用 5.getStorage异步 6.props的中的值不可修改 7.wx.uploadFile携带字符串参数 8.picker的multiSelector mode中选择框出现undefined 总结 前言 毕设要求写一个浏览器端,一个APP端,一个微信端,刚开始以为要学三个技术然后写三个客户端,后来知道了uni-app这个神器,一次编写就可以编译生成APP.H5以及各种小程序版本的客户端.然而我比较熟悉的

  • Java后台与微信小程序的数据交互实现

    想把自己写的一个小项目转成微信小程序,主要是因为小程序比较火,而且自己想学一下小程序的东西,所以抱着初学者的心态开始了这个痛苦的旅程.看过小程序的一点视频,个人感觉和HTML,css,js差不多,甚至比前端更简单一些,可能是微信小程序做不出来那些炫酷的动态效果. 首先,要从Java后台查询出一组数据,然后转成json串返回.我总共总结了2种方法返回数据.一种非常简单,一种显得繁琐. 第一种通过springmvc的组件@ResponseBod返回数据 /* * 查询用户 * 通过springmvc

  • 使用AWK在shell中生成日历小程序

    最近在学习sed和awk时,发现了一本入门级别的好书:<Software Design 中文版 03>. 我们这里的日历程序也是从那里得来,这里强烈推荐希望了解sed和awk的同志们入手本书. 代码段: # 在shell中生成日历 # 使用方式 # awk -f thisFile +2017 # awk -f thisFile +2017.10 # awk -f thisFile +2017.10.10 # function whichWeek(y, m, d, s) { s = 0 if (

  • java实现微信小程序加密数据解密算法

    一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H5.还接入了小程序开发.但是,小程序中竟然没有提供Java版本的加密数据解密算法.这着实让广大的Java开发人员蛋疼. 微信小程序提供的加密数据解密算法链接 我们下载的算法示例如下: 木有Java!! 木有Java!! 木有Java!! 那么如何解决这个问题,我们一起来实现Java版本的微信小程序加密数据解密算法. 二.实现Java版本的微信小程序加密数据解密算法 1.创建项目 这里,我们创建一个Maven工程,具体创建步骤略.

  • java微信小程序步数encryptedData和开放数据解密的实现

    前提: 三个参数, 1.sessionKey(拿openId的时候可以得到) 2.encryptedData(前端提供) 3.iv(前端提供) 一个类,一个方法. 1.类: import java.nio.charset.Charset; import java.util.Arrays; /** * 微信小程序加解密 * @author liuyazhuang * */ public class WxPKCS7Encoder { private static final Charset CHAR

  • uniapp中微信小程序与H5相互跳转以及传参详解(webview)

    目录 技术栈: 前言: 一.小程序向H5传递 1.小程序端发送数据 2.pages.json进行设置 3.H5端进行数据接收 4.调试方式以及数据查看 二.H5向小程序传递 1.引入需要的模块 2.更改文件内容 3.H5端发送数据 4.小程序端进行数据接收 5.调试方式以及数据查看 三.参考链接地址 总结 技术栈: uniapp-H5+uniapp-微信小程序(vue3+vite2+ts) 前言: 在单位做项目的时候碰到一个需求,需要从微信小程序跳转到H5页面,这两个端都是使用uniapp编写的

  • 微信小程序反编译的实现

    首先声明:本文章仅供学习之用,不可它用. 一.前言 看到人家上线的小程序的效果,纯靠推测,部分效果在绞尽脑汁后能做出大致的实现,但是有些细节,费劲全力都没能做出来.很想一窥源码?查看究竟?看看大厂的前端大神们是如何规避了小程序的各种奇葩的坑?那么赶紧来试试吧 反编译,其实还是简单的,要想拿到微信小程序源码,找到源文件在手机存放的位置就行,源文件拿到,用反编译脚本跑一下,微信小程序代码包里的所有文件.所有资源就出来了(除了project.config.json小程序配置文件).拿到源码后,跑起来是

  • 微信小程序获取当前位置和城市名

    1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting: 2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数): 3,微信没有将经纬度直接转换为地理位置,借用腾讯位置服务中关于微信小程序的地理转换JS SDK 的API(返回信息中包括国家,省,市,区,经纬度等地理位置) 步骤描述清楚以后,下面就开始按步骤操作了:(本文仅仅讲述如何获取用户地理位置的授权) 图示为获取用户地理位置授权弹窗 在用户首次进入某页面(需要地理位置授权)时候,在页

  • uni-app使用微信小程序云函数的步骤示例

    创建云函数目录 首先,我们需要在uni-app项目文件夹下,创建一个云函数目录,路径随意,我这里是functions.然后先随便在里面放一些文件,这里以new_file.css为例.(放文件的原因是:确保编译成小程序后cloudfunctions文件夹存在.如果该文件夹下没有文件,默认是不会在微信小程序开发平台中显示该文件夹的.) 修改manifest.json 在uni-app根目录下,修改manifest.json中的微信小程序项,结构如下 "mp-weixin" : { /* 小

随机推荐