.需要已上线的小程序!^_^(先写好,测试只能是在线上侧)
也可不用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);
}
示例:
初次玩博客,请多多指教,我是一只菜鸟,在工作中遇到的问题,解决方法贴出来,以上是全部源码。
上述是有带白色底片的图片,如果想去掉白色底片请跳转:去掉带有白色底片的图片。