package com.dsh.account.util.weChat;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.dsh.account.util.ToolUtil;
|
import com.dsh.account.util.UUIDUtil;
|
import com.dsh.account.util.httpClinet.HttpClientUtil;
|
import com.dsh.account.util.httpClinet.HttpResult;
|
import org.apache.commons.codec.digest.DigestUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.http.*;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.client.RestTemplate;
|
|
import java.io.ByteArrayInputStream;
|
import java.io.InputStream;
|
import java.io.UnsupportedEncodingException;
|
import java.net.URLDecoder;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
/**
|
* 微信工具类
|
*/
|
@Component
|
public class WeChatUtil {
|
|
@Value("${wx.appletsAppid}")
|
private String wxAppletsAppid;
|
|
@Value("${wx.appletsAppSecret}")
|
private String wxAppletsAppSecret;
|
|
// @Value("${wx.officialAccountAppid}")
|
private String officialAccountAppid;
|
|
@Value("{wx.officialAccountAppSecret}")
|
private String officialAccountAppSecret;
|
|
@Value("${wx.appid}")
|
private String webAppId;
|
|
@Value("${wx.appSecret}")
|
private String webAppSecret;
|
|
@Autowired
|
private RestTemplate restTemplate;
|
|
|
/**
|
* 小程序使用jscode获取openid
|
*
|
* @param jscode
|
* @return
|
*/
|
public Map<String, Object> code2Session(String jscode) throws Exception {
|
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret
|
+ "&js_code=" + jscode + "&grant_type=authorization_code";
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form");
|
if (null == httpResult || httpResult.getCode() != 200) {
|
return null;
|
}
|
JSONObject jsonObject = JSON.parseObject(httpResult.getData());
|
int errcode = jsonObject.getIntValue("errcode");
|
Map<String, Object> map = new HashMap<>();
|
map.put("errcode", errcode);
|
if (errcode == 0) {//成功
|
map.put("openid", jsonObject.getString("openid"));
|
map.put("sessionKey", jsonObject.getString("session_key"));
|
map.put("unionid", jsonObject.getString("unionid"));
|
return map;
|
}
|
if (errcode == -1) {//系统繁忙,此时请开发者稍候再试
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
if (errcode == 40029) {//code 无效
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
if (errcode == 45011) {//频率限制,每个用户每分钟100次
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
return null;
|
}
|
|
|
/**
|
* 获取微信小程序token
|
*
|
* @return
|
*/
|
public String getWxAppletsAccessToken() throws Exception {
|
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret;
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form");
|
if (httpResult.getCode() != 200) {
|
return "";
|
}
|
JSONObject jsonObject = JSON.parseObject(httpResult.getData());
|
return jsonObject.getString("access_token");
|
}
|
|
|
/**
|
* 网站应用登录
|
*
|
* @param code
|
* @return
|
*/
|
public Map<String, String> webAccessToken(String code) throws Exception {
|
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + webAppId + "&secret=" + webAppSecret + "&code=" + code + "&grant_type=authorization_code";
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form");
|
if (httpResult.getCode() != 200) {
|
return null;
|
}
|
JSONObject jsonObject = JSON.parseObject(httpResult.getData());
|
int errcode = jsonObject.getIntValue("errcode");
|
Map<String, String> map = new HashMap<>();
|
if (errcode == 0) {//成功
|
map.put("access_token", jsonObject.getString("access_token"));
|
map.put("openid", jsonObject.getString("openid"));
|
map.put("refresh_token", jsonObject.getString("refresh_token"));
|
map.put("unionid", jsonObject.getString("unionid"));
|
return map;
|
}
|
if (errcode == -1) {//系统繁忙,此时请开发者稍候再试
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
if (errcode == 40029) {//code 无效
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
if (errcode == 45011) {//频率限制,每个用户每分钟100次
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
return map;
|
}
|
|
|
/**
|
* 获取微信个人信息
|
*
|
* @param access_token
|
* @param openid
|
* @return
|
*/
|
public Map<String, Object> getUserInfo(String access_token, String openid) throws Exception {
|
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid;
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form");
|
if (httpResult.getCode() != 200) {
|
return null;
|
}
|
JSONObject jsonObject = JSON.parseObject(httpResult.getData());
|
int errcode = jsonObject.getIntValue("errcode");
|
Map<String, Object> map = new HashMap<>();
|
if (errcode == 0) {//成功
|
map.put("nickname", jsonObject.getString("nickname"));
|
map.put("openid", jsonObject.getString("openid"));
|
map.put("sex", jsonObject.getString("sex"));
|
map.put("headimgurl", jsonObject.getString("headimgurl"));
|
return map;
|
}
|
if (errcode == -1) {//系统繁忙,此时请开发者稍候再试
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
if (errcode == 40029) {//code 无效
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
if (errcode == 45011) {//频率限制,每个用户每分钟100次
|
map.put("msg", jsonObject.getString("errmsg"));
|
return map;
|
}
|
return map;
|
}
|
|
|
/**
|
* 公众号获取openid
|
*
|
* @param code
|
* @return
|
*/
|
public Map<String, Object> getOpenId(String code) throws Exception {
|
if (code == null || code.length() == 0) {
|
return null;
|
}
|
String grantType = "authorization_code";
|
String params = "appid=" + officialAccountAppid + "&secret=" + officialAccountAppSecret + "&code=" + code + "&grant_type=" + grantType;
|
System.out.println("sssss" + params);
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", "https://api.weixin.qq.com/sns/oauth2/access_token?" + params, null, null, "form");
|
if (httpResult.getCode() != 200) {
|
return null;
|
}
|
JSONObject json = JSON.parseObject(httpResult.getData());
|
System.out.println(json);
|
String openId = json.get("openid").toString();
|
String accessToken = json.get("access_token").toString();
|
Integer expiresIn = json.getInteger("expires_in");
|
String refresh_token = json.getString("refresh_token");
|
String unionid = json.getString("unionid");
|
Map<String, Object> map = new HashMap<>();
|
map.put("openId", openId);
|
map.put("accessToken", accessToken);
|
map.put("expiresIn", expiresIn);
|
map.put("refreshToken", refresh_token);
|
map.put("unionid", unionid);
|
return map;
|
}
|
|
|
/***
|
* 获取acess_token (公众号)
|
* 来源www.vxzsk.com
|
* @return
|
*/
|
public String getAccessToken() throws Exception {
|
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + officialAccountAppid
|
+ "&secret=" + officialAccountAppSecret;
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form");
|
if (httpResult.getCode() != 200) {
|
return null;
|
}
|
String accessToken = JSONObject.parseObject(httpResult.getData()).getString("access_token");
|
return accessToken;
|
}
|
|
/***
|
* 获取jsapiTicket(公众号)
|
* 来源 www.vxzsk.com
|
* @return
|
*/
|
public String getJSApiTicket() throws Exception {
|
//获取token
|
String acess_token = this.getAccessToken();
|
String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + acess_token + "&type=jsapi";
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", urlStr, null, null, "form");
|
if (httpResult.getCode() != 200) {
|
return null;
|
}
|
System.out.println(httpResult.getData());
|
String ticket = JSONObject.parseObject(httpResult.getData()).getString("ticket");
|
return ticket;
|
}
|
|
/**
|
* 通过config接口注入权限验证配置(公众号)
|
* 附录1-JS-SDK使用权限签名算法,
|
*
|
* @return
|
*/
|
public Map<String, Object> getSignatureConfig(String url) throws Exception {
|
//获取token
|
try {
|
url = URLDecoder.decode(url, "UTF-8");
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
String ticket = getJSApiTicket();
|
String noncestr = UUIDUtil.getRandomCode();
|
Long timestamp = System.currentTimeMillis();
|
String content = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url;
|
String signature = DigestUtils.sha1Hex(content);
|
Map<String, Object> map = new HashMap<>();
|
map.put("appId", officialAccountAppid);
|
map.put("timestamp", timestamp);
|
map.put("nonceStr", noncestr);
|
map.put("signature", signature);
|
return map;
|
}
|
|
|
/**
|
* 公众号获取用户个人信息
|
*
|
* @param access_token
|
* @param openid
|
* @return
|
*/
|
public Map<String, Object> queryUserInfo(String access_token, String openid) throws Exception {
|
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN";
|
HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", url, null, null, "form");
|
if (httpResult.getCode() != 200) {
|
return null;
|
}
|
System.err.println(httpResult.getData());
|
JSONObject j = JSON.parseObject(httpResult.getData());
|
Map<String, Object> map = new HashMap<>();
|
map.put("nickname", j.getString("nickname"));
|
map.put("sex", j.getInteger("sex"));
|
map.put("headimgurl", j.getString("headimgurl"));
|
map.put("unionid", j.getString("unionid"));
|
return map;
|
}
|
|
|
/**
|
* 获取小程序二维码
|
*
|
* @param page 跳转页 例如 pages/index/index
|
* @param scene 参数 a=1&b=2
|
*/
|
public InputStream getwxacodeunlimit(String page, String scene) {
|
try {
|
String token = getWxAppletsAccessToken();
|
if (ToolUtil.isEmpty(token)) {
|
System.err.println("获取接口调用凭证失败");
|
}
|
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token;
|
Map<String, Object> param = new HashMap<>();
|
param.put("scene", scene);
|
param.put("page", page);
|
HttpHeaders httpHeaders = new HttpHeaders();
|
MediaType type = MediaType.parseMediaType("application/json;charset=UTF-8");
|
httpHeaders.setContentType(type);
|
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders);
|
ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class, new Object[0]);
|
String body1 = exchange.getBody();
|
// System.err.println(body1);
|
ResponseEntity<byte[]> entity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
|
byte[] body = entity.getBody();
|
// System.err.println(Base64.encodeBase64String(body));
|
return new ByteArrayInputStream(body);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
}
|