温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java中如何生成微信小程序太阳码

发布时间:2022-06-01 09:07:37 来源:亿速云 阅读:1376 作者:zzz 栏目:开发技术

这篇文章主要介绍“Java中如何生成微信小程序太阳码”,在日常操作中,相信很多人在Java中如何生成微信小程序太阳码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中如何生成微信小程序太阳码”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    实现方案

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

    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中如何生成微信小程序太阳码”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI