首頁 > 軟體

Java中生成微信小程式太陽碼的實現方案

2022-05-31 22:00:33

背景

當前小程式盛行的時代,無論走在那裡都會看到各種各樣的小程式太陽碼,小程式專案中經常也會用到小程式的太陽碼,那麼我們如何生成小程式的太陽碼呢?

實現方案

我們可以通過如下的方法實現小程式太陽碼生成。

生成有限制太陽碼

實現步驟

  • 獲取小程式的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中生成微信小程式太陽碼的實現方案的文章就介紹到這了,更多相關小程式太陽碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com