JAVA 開發微信小程序太陽碼使用OSS上傳,覆蓋中間的LOGO(帶參)(邀請碼,掃碼成爲用戶下級)

.需要已上線的小程序!^_^(先寫好,測試只能是在線上側)

也可不用oss上傳,只做參考也行,目前以下代碼都可親測運行。

如果需要把頭像 從長方形或者正方形什麼的切成圓形請跳轉點擊打開鏈接

1.pom.xml

<!-- https://mvnrepository.com/artifact/com.aliyun.oss/aliyun-sdk-oss -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.1.0</version>
         </dependency>

<!-- httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.1</version>
      </dependency>

 

.相應官方文檔.

 

2.util

public class GetSunCode {
    private static Logger LOGGER = LoggerFactory.getLogger(GetSunCode.class);
    //字段headimage用戶頭像,得到的accessToken,sceneStr參數,其他的都是連接OSS所需的賬號祕鑰什麼的。
    public static String getminiqrQr(String headimage,String sceneStr, String accessToken, String ENDPOINT, String ACCESS_KEY_ID, String ACCESS_KEY_SECRET, String BUCKET_NAME) {
        RestTemplate rest = new RestTemplate();
        InputStream inputStream = null;
        OutputStream outputStream = null;
        String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="
                + accessToken;
        Map<String, Object> param = new HashMap<>();
        param.put("scene", sceneStr);//傳入的參數
//注意注意!!!!!!! 這裏在小程序未發佈前需要註釋,否則找不到對應的頁面,會生成圖片,但是報錯無法展示。
param.put("page", "pages/index/index");//已上線的小程序頁面路徑
        param.put("width", 430);//圖片的寬度
        param.put("auto_color", false);
        Map<String, Object> line_color = new HashMap<>();
        line_color.put("r", 0);
        line_color.put("g", 0);
        line_color.put("b", 0);
        param.put("line_color", line_color);
        LOGGER.info("調用生成微信URL接口傳參:" + param);
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
        HttpEntity requestEntity = new HttpEntity(param, headers);
        ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST,
                requestEntity, byte[].class, new Object[0]);
        LOGGER.info("調用小程序生成微信永久小程序碼URL接口返回結果:" + entity.getBody());
        byte[] result = entity.getBody();
        LOGGER.info(Base64.encodeBase64String(result));
        inputStream = new ByteArrayInputStream(result);
        String filename = IdUtils.genImageName() + ".png";


        // 創建OSSClient實例
        OSSClient ossClient = new OSSClient(ENDPOINT,
                ACCESS_KEY_ID, ACCESS_KEY_SECRET);
        try {
        //隨機生成圖片名
            String filePath = new DateTime().toString("yyyy/MM/dd/");
            String fileName = IdUtils.genImageName() + ".png";
            //把小程序原始太陽碼存入OSS中
            ossClient.putObject(BUCKET_NAME, filePath + fileName,
                    inputStream);
            //獲取oss原始太陽碼
            BufferedImage b1 = ImageIO.read(new URL("https://" + BUCKET_NAME + "."+ENDPOINT+"/" + filePath + fileName));
            //可以用來獲取   用戶頭像  ,之後覆蓋小程序太陽碼中間的logo.
            BufferedImage b2 = ImageIO.read(new URL(headimage));
           if (b1!=null) {
          //創建Graphics2D繪圖
          Graphics2D g = b1.createGraphics();
          //115:左邊距、117:上邊距、200:寬度、195:高度.覆蓋原始圖片中間的logo
          g.drawImage(b2, 115,117,200,195,null);
         //關閉
         g.dispose(); 
          /*//本地測試用的
         File file=new File("C://head");
         if(!file.exists()){//如果文件夾不存在
            file.mkdir();//創建文件夾
           }*/
       //把繪製完成的圖片存到當前服務器的Tomcat、webapps中。永遠只是一張圖片,但每當新用戶註冊需要專屬太陽碼時內容會改變。
       ImageIO.write(b1,"png",new File("C://head/zhiboUserImage.png"));//不需要文件夾,這只是測試,上傳到服務器,直接填圖片名new File("zhiboUserImage.jpg")
       //獲取繪製好的圖片(兩張覆蓋完成的圖片)路徑之後上傳到OSS中
        ossClient.putObject(BUCKET_NAME, filePath + fileName, new File("C://head/zhiboUserImage.png"));//測試本地
}
       //返回上傳到OSS的圖片地址鏈接
return "https://" + BUCKET_NAME + "."+ENDPOINT+"/" + filePath + fileName;
        } catch (Exception e) {
            LOGGER.error("調用小程序生成微信永久小程序碼URL接口異常", e);
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

}

 

}

 

3.獲取accessToken

  // 網頁授權接口
//  public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
    public final static String GetPageAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";                                                                                 
    public static Map<String, String> getAccessToken(String appid, String appsecret) {
        String requestUrl = GetPageAccessTokenUrl.replace("APPID", appid).replace("APPSECRET", appsecret);
        HttpClient client = null;
        Map<String, String> result = new HashMap<String, String>();
        String accessToken = null;
        try {
            client = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(requestUrl);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String response = client.execute(httpget, responseHandler);
            JSONObject OpenidJSONO = JSONObject.fromObject(response);
            accessToken = String.valueOf(OpenidJSONO.get("access_token"));
            result.put("accessToken", accessToken);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.getConnectionManager().shutdown();
        }
        return result;
    }

 

4.serviceImpl(CopeImageUtil工具類,上方跳轉切成圓形)

public class SunCodeServiceImpl implements SunCodeService {

    private String APPID="";//小程序APPID
    private String APPSECRET="";//小程序祕鑰

    //以杭州爲例
    private String ENDPOINT="";//OSS服務器外網訪問地址如:oss-cn-hangzhou.aliyuncs.com

    private String ACCESS_KEY_ID=""; //怎麼查看oss的accesskeyid 創建OSS後,點擊進入OSS控制檯, 點擊左邊的“AccessKey管理”就能看到

    private String ACCESS_KEY_SECRET="";//ACCESS_KEY_ID生成的
   
    private String BUCKET_NAME="";//鏡像名稱如:“dahuilang”
  
     /**
     * 生成專屬太陽碼
     *
     * @param scene
     * @return
     */
    @Override
    public String getSunCode(String scene,String headimage) {
    	
	    	//獲取當前用戶
	   // 	Userinfo userinfo= userinfomapper.selectByUnionid(unionid);
	    	
	        String sunCode;
	        // 獲取自己專屬二維碼,先獲取accessToken
	        Map<String, String> map = GetAccessTokenUtil.getAccessToken(APPID, APPSECRET);
            // 取出map中的accessToken
            String value = map.get("accessToken");
            //把頭像處理爲圓形頭像
            
			try {
				headimage=CopeImageUtil.headImages(headimage,ENDPOINT,ACCESS_KEY_ID,ACCESS_KEY_SECRET,BUCKET_NAME);
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
            // 得到二維碼
            sunCode = GetSunCode.getminiqrQr(headimage,scene, value,ENDPOINT,ACCESS_KEY_ID,ACCESS_KEY_SECRET,BUCKET_NAME);// 返回的是二維碼的地址
             
            return sunCode;
    }

 

5.用戶註冊時存入相應字段

 

  @Override
public int insertUserInfo(Userinfo userinfo) {
userinfo.setIstate(2);
        String invitation = GetinvitationCode();//獲取隨機數,形成邀請碼
        userinfo.setAgreement(invitation);
        //生成太陽碼鏈接地址存入到數據庫
        String code=suncodeService.getSunCode(invitation,userinfo.getHeadimage());
        userinfo.setCode(code);
        return mapper.insertSelective(userinfo);
}

示例:

小程序碼1         小程序碼

 

初次玩博客,請多多指教,我是一隻菜鳥,在工作中遇到的問題,解決方法貼出來,以上是全部源碼。

上述是有帶白色底片的圖片,如果想去掉白色底片請跳轉:去掉帶有白色底片的圖片

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章