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         小程序码

 

初次玩博客,请多多指教,我是一只菜鸟,在工作中遇到的问题,解决方法贴出来,以上是全部源码。

上述是有带白色底片的图片,如果想去掉白色底片请跳转:去掉带有白色底片的图片

 

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