| 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; | 
|     } | 
| } |