您當前位置>首頁 » 新聞資(zī)訊 » 小程序相關(guān) >
java 工具類---實現獲取小程序碼并返回圖片地址
發表時間:2020-9-25
發布人:葵宇科技
浏覽次數:74
java調用微信小程序服務器(qì)API獲取小程序碼
一、實現思路(lù)
1.登錄微信https://mp.weixin.qq.com獲取小程序AppID和(hé)AppSecret;
2.根據小程序AppID和(hé)AppSecret獲取accesstoken
3.調用小程序碼API接口:
接口地址:https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
并添加post請求參數
4.請求成功,會直接返回圖片二進制内容
5.對返回的數據進行處理,把返回的圖片 Buffer轉換成圖片并存入服務器(qì),然後返回服務器(qì)圖片地址信息
二、java 獲取小程序碼工具類代碼實現
package com.njpp.wxxcx.util;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import com.alibaba.fastjson.JSONObject;
import com.njpp.wxxcx.core.common.App;
import com.njpp.wxxcx.core.common.ErrCode;
import com.njpp.wxxcx.core.common.Tool;
import com.njpp.wxxcx.util.redis.RedisManager;
/**
* 微信小程序 工具類
* @author Administrator
*
*/
public class WxUtil {
/**
* 獲取小程序全局唯一後台接口調用憑據(access_token)
* @return
*/
public static String getWxAccessToken(){
//從redis緩存中(zhōng)獲取AccessToken,有且未過期,直接返回;否則重新獲取
String accessToken =RedisManager.get("accessToken");
if(Tool.notEmpty(accessToken)){
return accessToken;
}
//重新獲取accessToken,并存入redis
String newToken = getAccessToken();
//存入redis
RedisManager.set("accessToken", newToken, 7000);
return newToken;
}
/**
* 調用微信開放接口 獲取小程序全局唯一後台接口調用憑據(access_token)
* @return
*/
public static String getAccessToken(){
String APPID="wxc0fdede12b648f9a";
String APPSECRET="83a90fa477b6929d316ec47cc166ff0d";
String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+APPID+"&secret="+APPSECRET;
HttpRequestUtil hru = new HttpRequestUtil();
JSONObject json = hru.sendUrlGet(accessTokenUrl);
String access_token = json.getString("access_token");
if(Tool.isEmpty(access_token)){
access_token="";
}
System.out.println("json:"+json.toString());
return access_token;
}
/**
* 調用微信開放接口wxacode.getUnlimited獲取小程序碼
* 通(tōng)過該接口生成的小程序碼,永久有效,數量暫無限制
* @param sceneStr 參數
* @param pageUrl 小程序頁面鍊接---不能攜帶參數(參數請放在scene字段裡)
* @param accessToken 小程序全局唯一後台接口調用憑據
* @return true:含敏感信息 false:正常
*/
public static Map<String,Object> getWXAcode2(String sceneStr,String pageUrl) {
Map<String, Object> returnData= new HashMap<String, Object>();
try {
//獲取token 小程序全局唯一後台接口調用憑據
String accessToken = getWxAccessToken();
URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="+accessToken);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
// conn.setConnectTimeout(10000);//連接超時 單位毫秒
// conn.setReadTimeout(2000);//讀取超時 單位毫秒
// 發送POST請求必須設置如(rú)下(xià)兩行
httpURLConnection.setDoOutput(true); // 打開寫入屬性
httpURLConnection.setDoInput(true); // 打開讀取屬性
httpURLConnection.setRequestMethod("POST");// 提交方式
// 不得不說一下(xià)這個(gè)提交方式轉換!!真的坑。。改了好長時間!!一定要記得加響應頭
httpURLConnection.setRequestProperty("Content-Type", "application/x-javascript; charset=UTF-8");// 設置響應頭
// 獲取URLConnection對象對應的輸出流
PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
// 發送請求參數
JSONObject paramJson = new JSONObject();
paramJson.put("scene", sceneStr); // 你(nǐ)要放的内容
paramJson.put("path", pageUrl);
paramJson.put("width", 280); //二維碼的寬度,單位 px,默認430px,最小 280px,最大 1280px
paramJson.put("auto_color", false);//自動(dòng)配置線條顔色,如(rú)果顔色依然是黑色,則說明不建議配置主色調,默認 false
Map<String,Object> line_color = new HashMap<>();
line_color.put("r", 0);
line_color.put("g", 0);
line_color.put("b", 0);
paramJson.put("line_color", line_color);//auto_color 為 false 時生效,使用 rgb 設置顔色
paramJson.put("is_hyaline", false);//是否需要透明底色,為 true 時,生成透明底色的小程序
printWriter.write(paramJson.toString());
// flush輸出流的緩沖
printWriter.flush();
BufferedInputStream inputStream = new BufferedInputStream(httpURLConnection.getInputStream());
//小程序碼圖片文(wén)件夾位置
//設置文(wén)件存儲路(lù)徑,可(kě)以存放在你(nǐ)想要指定的路(lù)徑裡面
String rootPath = "D:/mimi/upload/images/";
Long res = new Date().getTime();
String newFileName =res + ".png";
// 新文(wén)件
File newFile = new File(rootPath +File.separator+ newFileName);
// 判斷目标文(wén)件所在目錄是否存在
if( !newFile.getParentFile().exists()) {
// 如(rú)果目标文(wén)件所在的目錄不存在,則創建父目錄
newFile.getParentFile().mkdirs();
}
//-------把圖片文(wén)件寫入磁盤 start ----------------
FileOutputStream fos = new FileOutputStream(newFile);
//寫入目标文(wén)件
byte[] buffer=new byte[1024*1024];
int byteRead=0;
//stream.read(buffer) 每次讀到的數據存放在 buffer 數組中(zhōng)
while((byteRead=inputStream.read(buffer))!=-1){
//在 buffer 數組中(zhōng) 取出數據 寫到 (輸出流)磁盤上
fos.write(buffer, 0, byteRead);
fos.flush();
}
fos.close();
inputStream.close();
//-------把圖片文(wén)件寫入磁盤 end ----------------
// 完整的url(圖片映射地址)
String fileUrl = "http://localhost:80/mimi/upload/images/" + newFileName;//小程序碼保存路(lù)徑
returnData.put("codeURL", fileUrl);
returnData.put(ErrCode.STATE, ErrCode.SUCCESS);
return returnData;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
returnData.put(ErrCode.MSG, "生成失敗");
returnData.put(ErrCode.STATE, ErrCode.FAIL);
return returnData;
}
public static void main(String[] args) {
}
}
三、工具類調用
/**
* 獲取小程序碼
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping(value = "/getWxQRCode", method = { RequestMethod.POST })
public Map<String, Object> getWxQRCode(HttpServletRequest request,HttpServletResponse response) throws Exception {
String sceneStr=String.valueOf(paramMap.get("scene"));
String pageUrl=String.valueOf(paramMap.get("page"));
//調用微信開放接口wxacode.getUnlimited獲取小程序碼
return WxUtil.getWXAcode2(sceneStr, pageUrl);
}