From aa241a47c90ed776062adf0b8daccf288a21836f Mon Sep 17 00:00:00 2001
From: liujie <liujie>
Date: 星期四, 10 八月 2023 09:55:54 +0800
Subject: [PATCH] 合并代码

---
 driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java |  415 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 415 insertions(+), 0 deletions(-)

diff --git a/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java
new file mode 100644
index 0000000..6a9780c
--- /dev/null
+++ b/driver/guns-admin/src/main/java/com/supersavedriving/driver/modular/system/util/weChat/WeChatUtil.java
@@ -0,0 +1,415 @@
+package com.supersavedriving.driver.modular.system.util.weChat;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.supersavedriving.driver.core.util.ToolUtil;
+import com.supersavedriving.driver.modular.system.util.RedisUtil;
+import com.supersavedriving.driver.modular.system.util.UUIDUtil;
+import com.supersavedriving.driver.modular.system.util.httpClinet.HttpClientUtil;
+import com.supersavedriving.driver.modular.system.util.httpClinet.HttpResult;
+import com.supersavedriving.driver.modular.system.util.weChat.model.Code2Session;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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;
+import java.util.Timer;
+import java.util.TimerTask;
+
+/**
+ * 微信工具类
+ */
+@Component
+public class WeChatUtil {
+
+    private static Logger logger = LoggerFactory.getLogger(WeChatUtil.class);
+
+    @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;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+
+
+    {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+//                    Thread.sleep(30000);
+//                    new Timer().schedule(new TimerTask() {
+//                        @Override
+//                        public void run() {
+//                            try {
+//                                String wxAppletsAccessToken = getWxAppletsAccessToken();
+//                                if(ToolUtil.isEmpty(wxAppletsAccessToken)){
+//                                    System.err.println("获取微信小程序access_token失败");
+//                                    return;
+//                                }
+//                                redisUtil.setStrValue("wxAppletsAccessToken", wxAppletsAccessToken, 7000);
+//                            }catch (Exception e){
+//                                e.printStackTrace();
+//                            }
+//                        }
+//                    }, 0, 7000000);
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }).start();
+
+    }
+
+
+    /**
+     * 小程序使用jscode获取openid
+     * @param jscode
+     * @return
+     */
+    public Code2Session 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;
+        }
+        Code2Session code2Session = JSON.parseObject(httpResult.getData(), Code2Session.class);
+        return code2Session;
+    }
+
+
+    /**
+     * 获取微信小程序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");
+    }
+
+
+    /***
+     * 获取jsapiTicket(小程序)
+     * 来源 www.vxzsk.com
+     * @return
+     */
+    public String getWxAppletsJSApiTicket() throws Exception{
+        String wxAppletsAccessToken = redisUtil.getValue("wxAppletsAccessToken");
+        String urlStr = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + wxAppletsAccessToken + "&type=jsapi";
+        HttpResult httpResult = HttpClientUtil.pushHttpRequset("GET", urlStr, null, null, "form");
+        if(httpResult.getCode() != 200){
+            return null;
+        }
+        logger.debug(httpResult.getData());
+        String ticket = JSONObject.parseObject(httpResult.getData()).getString("ticket");
+        return  ticket;
+    }
+
+    /**
+     * 通过config接口注入权限验证配置(小程序)
+     * 附录1-JS-SDK使用权限签名算法,
+     * @return
+     */
+    public Map<String,Object> getWxAppletsSignatureConfig(String url) throws Exception{
+        //获取token
+        try {
+            url = URLDecoder.decode(url, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        String ticket = getWxAppletsJSApiTicket();
+        String noncestr = UUIDUtil.getRandomCode();
+        Long timestamp = System.currentTimeMillis();
+        String content = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
+        String signature = DigestUtils.sha1Hex(content);
+        Map<String,Object> map=new HashMap<>();
+        map.put("appId", wxAppletsAppid);
+        map.put("timestamp", timestamp);
+        map.put("nonceStr", noncestr);
+        map.put("signature", signature);
+        return  map;
+    }
+
+
+
+    /**
+     * 网站应用登录
+     * @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;
+        logger.debug("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());
+        logger.debug(json.toJSONString());
+        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 = redisUtil.getValue("acess_token");
+        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;
+        }
+        logger.debug(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 + "&timestamp=" + 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;
+        }
+        logger.debug(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, String envVersion) throws Exception{
+        try {
+            String wxAppletsAccessToken = redisUtil.getValue("wxAppletsAccessToken");
+            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + wxAppletsAccessToken;
+            Map<String, Object> param = new HashMap<>();
+            param.put("scene", scene);
+            param.put("page", page);
+            param.put("env_version", envVersion);
+            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;
+    }
+
+
+    /**
+     * 获取小程序urlscheme码
+     * @return
+     */
+    public String getUrlscheme(String path) throws Exception{
+        String wxAppletsAccessToken = redisUtil.getValue("wxAppletsAccessToken");
+        String url = "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + wxAppletsAccessToken;
+        Map<String, Object> param = new HashMap<>();
+        param.put("is_expire", true);
+        param.put("expire_type", 1);
+        param.put("expire_interval", 180);
+        Map<String, Object> map1 = new HashMap<>();
+        map1.put("path", path);
+        map1.put("query", "");
+        map1.put("env_version", "release");
+        param.put("jump_wxa", map1);
+        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);
+        String body1 = exchange.getBody();
+        return body1;
+    }
+}

--
Gitblit v1.7.1