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 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 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 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 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 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 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 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 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 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 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 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 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 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> requestEntity = new HttpEntity<>(param, httpHeaders); ResponseEntity exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class, new Object[0]); String body1 = exchange.getBody(); // System.err.println(body1); ResponseEntity 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; } }