涉及到了微信获取图片 在这记录一下:
首页H5 会调用jsdk 会用到下面这些参数 ,大部分由java后端提供.
一: H5 通过接口从后台获取这些数据首先获取access_token,通过access_token获取jsapi_ticket,通过jsapi_ticket获取上面要的数据
具体可以参考一下 :https://www.jianshu.com/p/67a9d703fd99 我也是根据这里面改吧改吧实现的
二: 上代码:
1.接口:
@PostMapping("/config")
@ResponseBody
public Map config(@RequestBody JSONObject json) throws UnsupportedEncodingException {
//获取H5页面地址 进行加密
String signUrl = json.getString("signUrl");
Map ret = new HashMap<>();
TokenSingleton tokenSingleton = TokenSingleton.getInstance();
Map map = tokenSingleton.getMap();
String jsapi_ticket = map.get("jsapi_ticket");
ret = WechatUtil.generateWxTicket(jsapi_ticket, signUrl);
return ret;
}
这里面写了一个单例,通过单例获取access_token;
2.获取jsapi_ticket
package com.web.wx.utils;
import com.alibaba.fastjson.JSONObject;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 使用单例模式access_token全局缓存
*/
public class TokenSingleton {
private Map map = new HashMap<>(); // 缓存accessToken的Map, map中包含一个accessToken和缓存的时间戳
private TokenSingleton() {
}
private static TokenSingleton single = new TokenSingleton();
public static TokenSingleton getInstance() {
if (single == null) {
single = new TokenSingleton();
}
return single;
}
public Map getMap() {
String time = map.get("time");
String accessToken = map.get("access_token");
long nowDate = System.currentTimeMillis();
if (accessToken != null && time != null && nowDate - Long.parseLong(time) < 1799 * 1000) {
System.out.println("access_token存在,尚未超时,返回单例!");
} else {
System.out.println("access_token超时或者不存在,重新获取!");
JSONObject jsonObject = WechatUtil.getAccessToken();
String newAccessToken = jsonObject.getString("access_token");
System.out.println("new access_token = " + newAccessToken);
String jsApiTicket = getJsApiTicket(newAccessToken);
map.put("time", System.currentTimeMillis() + "");
map.put("access_token", newAccessToken);
map.put("jsapi_ticket", jsApiTicket);
}
return map;
}
public String getJsApiTicket(String accessToken) {
String apiTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";
String requestUrl = apiTicketUrl.replace("ACCESS_TOKEN", accessToken);
JSONObject result = WebUtil.doGet(requestUrl);
String jsApiTicket = null;
if (null != result) {
jsApiTicket = result.getString("ticket");
}
return jsApiTicket;
}
}
package com.web.wx.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
/**
* Web相关工具类
*/
public class WebUtil {
/**
* 发起http get请求
*/
public static JSONObject doGet(String requestUrl) {
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String responseContent = null;
JSONObject result = null;
try {
HttpGet httpGet = new HttpGet(requestUrl);
response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
responseContent = EntityUtils.toString(entity, "UTF-8");
result = JSON.parseObject(responseContent);
} catch (IOException e) {
System.out.println("HTTP请求异常:" + e.getMessage());
}
System.out.println("result======="+result.toString());
return result;
}
}
WechatUtil:
package com.web.wx.utils;
import java.security.MessageDigest;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import com.alibaba.fastjson.JSONObject;
public class WechatUtil {
//测试
/*private static String appId = "wxabc670e3c404adf9";
private static String appSecret = "6ea4288771aee716f483a040e7f83fc0";*/
public static JSONObject getAccessToken() {
String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appId=APPID&secret=APPSECRET";
String requestUrl = accessTokenUrl.replace("APPID", appId).replace("APPSECRET", appSecret);
return WebUtil.doGet(requestUrl);
}
//url为H5传入地址
public static Map generateWxTicket(String jsApiTicket, String url) {
Map ret = new HashMap<>();
String nonceStr = createNonceStr();
String timestamp = createTimestamp();
String string1;
String signature = "";
string1 = "jsapi_ticket=" + jsApiTicket +
"&noncestr=" + nonceStr +
"×tamp=" + timestamp +
"&url=" + url;
System.out.println("string1 ====> " + string1);
try {
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
System.out.println("signature ====> " + signature);
} catch (Exception e) {
e.printStackTrace();
}
ret.put("url", url);
ret.put("jsapi_ticket", jsApiTicket);
ret.put("nonceStr", nonceStr);
ret.put("timestamp", timestamp);
ret.put("signature", signature);
ret.put("appid", appId);
return ret;
}
/**
* 字节数组转换为十六进制字符串
*
* @param hash 字节数组
* @return 十六进制字符串
*/
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
/**
* 生成随机字符串
*
* @return 随机字符串
*/
private static String createNonceStr() {
return UUID.randomUUID().toString();
}
/**
* 生成时间戳
*
* @return 时间戳
*/
private static String createTimestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
}
3.通过jsapi_ticket获取参数:
到这H5就能拿到这些参数了, 返回Base64位 解析图片保存到本地即可
注意的地方是:
access_token 在微信官方上有效时间是2个小时, 但是偶尔会失效, 通过百度找出最佳时间是30分钟,所以单例时间可以设置成29分钟获取一次access_token ,这样就能保证access_token 不会失效