.需要已上線的小程序!^_^(先寫好,測試只能是在線上側)
也可不用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);
}
示例:
初次玩博客,請多多指教,我是一隻菜鳥,在工作中遇到的問題,解決方法貼出來,以上是全部源碼。
上述是有帶白色底片的圖片,如果想去掉白色底片請跳轉:去掉帶有白色底片的圖片。