Parcourir la source

获取openId接口

jk-GitHub-coder il y a 4 ans
Parent
commit
382d762da8

+ 27 - 0
YijiaRestful/pom.xml

@@ -20,6 +20,33 @@
     </properties>
 
     <dependencies>
+
+        <!-- BouncyCastle是一个开源的加解密解决方案,主页在http://www.bouncycastle.org/-->
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>1.56</version>
+        </dependency>
+        <!--lombok-->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!--json依赖支持-->
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>fastjson</artifactId>-->
+<!--            <version>1.2.28</version>-->
+<!--        </dependency>-->
+        <!--net sf包 json 依赖-->
+        <dependency>
+            <groupId>net.sf.json-lib</groupId>
+            <artifactId>json-lib</artifactId>
+            <version>2.4</version>
+            <classifier>jdk15</classifier>
+        </dependency>
+
         <!-- 极光推送依赖 -->
         <dependency>
             <groupId>cn.jpush.api</groupId>

+ 16 - 0
YijiaRestful/src/main/java/com/platform/yijia/controller/AppUserInfoController.java

@@ -6,6 +6,7 @@ import com.platform.yijia.pojo.AppUserInfo;
 import com.platform.yijia.service.AppUserInfoService;
 import com.platform.yijia.utils.CodeMsg;
 import com.platform.yijia.utils.ResultData;
+import com.platform.yijia.utils.weixinapp.WeiXinUserUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,6 +29,21 @@ public class AppUserInfoController {
     private static Logger logger =(Logger) LoggerFactory.getLogger(AppUserInfoController.class);
     @Autowired
     private AppUserInfoService appUserInfoService;
+    String appId = "wxe1135cd390b38a54";        //微信小程序appID
+    String appSecret = "0532c7d9ae876c4ad636df0b1e3b9ddb";      //微信小程序密钥
+
+    /*
+     * 获取小程序用户openId和sessionKey 并解密用户信息插入数据库
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/getSessionKeyAndOpenID")
+    public Map<String, Object> getSessionKeyAndOpenID(@RequestParam("code") String code){
+        Map<String, Object> resultMap;
+        //获取session_key 和 openid
+        resultMap = WeiXinUserUtil.getUserSessionKeyAndOpenID(appId, appSecret, code);
+        return resultMap;
+    }
 
     /*
      * 添加用户信息

+ 81 - 0
YijiaRestful/src/main/java/com/platform/yijia/utils/weixinapp/AesDecryptUtil.java

@@ -0,0 +1,81 @@
+package com.platform.yijia.utils.weixinapp;
+
+import net.sf.json.JSON;
+import net.sf.json.JSONObject;
+import org.apache.commons.codec.binary.Base64;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.*;
+import java.security.spec.InvalidParameterSpecException;
+
+/***
+ * <Title> AesDecryptUtil </Title>
+ * <Description> Aes解码工具类 </Description>
+ * @author JK
+ * @date 2019-11-12
+ */
+public class AesDecryptUtil {
+
+    //BouncyCastle: 开源的加解密解决方案 网址:http://www.bouncycastle.org/
+    static {
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    /****
+     *  使用AES解码 encryptedData 数据
+     * @param encryptedData 解码数据
+     * @param session_key   密钥
+     * @param iv    偏移量
+     * @param encodingFormat 解码后编码方式 像UTF-8等
+     * @return 返回String类型字符串: new String(resultBytes, encodingFormat)
+     */
+    public static JSONObject decryptEncryptedData(String encryptedData, String session_key, String iv, String encodingFormat){
+
+        //被加密的数据
+        byte[] edBytes = Base64.decodeBase64(encryptedData.getBytes());
+        //加密的秘钥
+        byte[] keyBytes = Base64.decodeBase64(session_key.getBytes());
+        //偏移量
+        byte[] ivBytes = Base64.decodeBase64(iv.getBytes());
+        //解码后结果值
+        JSONObject resultStr =null;
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
+            SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
+            //java.security 管理特定算法的
+            AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance("AES");
+            algorithmParameters.init(new IvParameterSpec(ivBytes));
+            //开始初始化解码
+            cipher.init(Cipher.DECRYPT_MODE, keySpec, algorithmParameters);
+            byte[] resultBytes = cipher.doFinal(edBytes);
+            if (resultBytes !=null && resultBytes.length >0){
+//                resultStr = JSON.parseObject(str);
+                resultStr = JSONObject.fromObject(new String(resultBytes, encodingFormat));
+            }
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            e.printStackTrace();
+        } catch (InvalidParameterSpecException e) {
+            e.printStackTrace();
+        } catch (InvalidAlgorithmParameterException e) {
+            e.printStackTrace();
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (BadPaddingException e) {
+            e.printStackTrace();
+        } catch (IllegalBlockSizeException e) {
+            e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return resultStr;
+    }
+}

+ 107 - 0
YijiaRestful/src/main/java/com/platform/yijia/utils/weixinapp/HttpRequestUtil.java

@@ -0,0 +1,107 @@
+package com.platform.yijia.utils.weixinapp;
+
+import net.sf.json.JSONObject;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import java.io.*;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+
+/****
+ * <Title> HttpRequestUtil </Title>
+ * <Description> 发送https请求获取数据工具类 </Description>
+ * @author JK
+ * @date 2019年11月14日
+ */
+public class HttpRequestUtil {
+    /***
+     * 发送https请求
+     * @param requestUrl    // 请求地址
+     * @param requestMethod     //  请求方式(POST, GET)
+     * @param outPutStr         //提交的数据
+     * @return  jsonObject (通过JSONObject.get(key)的方式获取json的对象)
+     */
+    public static JSONObject getHttpsRequestData(String requestUrl, String requestMethod, String outPutStr){
+        JSONObject jsonObject = null;
+        try {
+            //创建SSLContext对象
+            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
+            //指定信任管理器
+            TrustManager[] trustManagers = { new MyX509TrustManager()};
+            sslContext.init(null, trustManagers, new SecureRandom());
+            //从SSLContext获取SSLSocketFactory对象
+            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
+
+            URL url = new URL(requestUrl);
+            HttpsURLConnection httpsURLConnection = (HttpsURLConnection)url.openConnection();
+
+            httpsURLConnection.setSSLSocketFactory(sslSocketFactory);
+            httpsURLConnection.setDoOutput(true);
+            httpsURLConnection.setDoInput(true);
+            httpsURLConnection.setUseCaches(false);
+            //设置请求方式
+            httpsURLConnection.setRequestMethod(requestMethod);
+
+            //不为null时想输出流写数据
+            if(null != outPutStr){
+                OutputStream outputStream = httpsURLConnection.getOutputStream();
+                outputStream.write(outPutStr.getBytes("UTF-8"));
+                outputStream.close();
+            }
+            //从输入流读取返回结果
+            InputStream inputStream = httpsURLConnection.getInputStream();
+            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
+            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
+            String str = null;
+            StringBuffer stringBuffer = new StringBuffer();
+            while ((str = bufferedReader.readLine()) != null){
+                stringBuffer.append(str);
+            }
+            //关闭流
+            bufferedReader.close();
+            inputStreamReader.close();
+            //inputStream = null;
+            inputStream.close();
+            httpsURLConnection.disconnect();
+            jsonObject = JSONObject.fromObject(stringBuffer.toString());
+            //System.out.println(jsonObject);
+        } catch (NoSuchAlgorithmException | NoSuchProviderException | KeyManagementException | IOException e) {
+            e.printStackTrace();
+        }
+        return jsonObject;
+    }
+
+    /***
+     * 获取请求路径返回结果
+     * @param urlStr 路径
+     * @return JSONObject
+     */
+//    private static JSONObject getUrlData(String urlStr){
+//        JSONObject jsonObject = null;
+//        BufferedReader bufferedReader = null;
+//        try {
+//            URL url = new URL(urlStr);
+//            //创建连接
+//            HttpsURLConnection httpsURLConnection  = (HttpsURLConnection)url.openConnection();
+//            StringBuilder result  = new StringBuilder();
+//            httpsURLConnection.connect();
+//            bufferedReader = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream(), "UTF-8"));
+//            String line;
+//            while (null != (line = bufferedReader.readLine())){
+//                result.append(line);
+//            }
+//            jsonObject = JSONObject.fromObject(result.toString());
+//        } catch (MalformedURLException e) {
+//            e.printStackTrace();
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//        return jsonObject;
+//    }
+}

+ 31 - 0
YijiaRestful/src/main/java/com/platform/yijia/utils/weixinapp/MyX509TrustManager.java

@@ -0,0 +1,31 @@
+package com.platform.yijia.utils.weixinapp;
+
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/****
+ * https请求信任管理器检查方法
+ * @author JK
+ * @date 2019年11月10日
+ */
+public class MyX509TrustManager implements X509TrustManager {
+
+    //检查客户端证书
+    @Override
+    public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+    }
+
+    //检查服务器端证书
+    @Override
+    public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+
+    }
+
+    //返回受信任的X509证书数组
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        return null;
+    }
+}

+ 14 - 0
YijiaRestful/src/main/java/com/platform/yijia/utils/weixinapp/Token.java

@@ -0,0 +1,14 @@
+package com.platform.yijia.utils.weixinapp;
+
+import lombok.Data;
+
+/****
+ * 微信接口访问凭证
+ * @author JK
+ * @date 2019年11月10日
+ */
+@Data
+public class Token {
+    private String accessToken; //接口凭证
+    private int expiresIn;      //凭证有效期 单位:秒
+}

+ 75 - 0
YijiaRestful/src/main/java/com/platform/yijia/utils/weixinapp/WeiXinUserUtil.java

@@ -0,0 +1,75 @@
+package com.platform.yijia.utils.weixinapp;
+
+
+import net.sf.json.JSONException;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/*****
+ * <Title>工具类: WeiXinUtil</Title>
+ * <description> 获取微信用户信息和凭证 </description>
+ * @author JK
+ * @date 2019年11月10日
+ */
+public class WeiXinUserUtil {
+
+    //微信小程序获取用户信息 https://api.weixin.qq.com/sns/userinfo
+    //public final static String weiXinUserInfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
+    //凭证获取路径
+    public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
+    //微信小程序路径获取openID "https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=APPSECRET&js_code=CODE&grant_type=authorization_code";
+    public final static String openID_url  ="https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=APPSECRET&js_code=CODE&grant_type=authorization_code";
+    //根据 appID secret code
+    //public final static String request_Url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+    //日志
+    private static final Logger logger = LoggerFactory.getLogger(WeiXinUserUtil.class);
+
+    /****
+     * 获取用户的openid和session_key 格式例子:{"session_key":"rlxKT/xhq2bxAuvrMeEq8Q==","openid":"o9RM50ppeCgx065T2PvJjtzB_Gmo"}
+     * @param appId     //凭证
+     * @param appSecret     //密钥
+     * @param code
+     * @return
+     */
+    public static Map<String, Object> getUserSessionKeyAndOpenID(String appId, String appSecret, String code){
+        String requestUrl = openID_url.replace("APPID", appId).replace("APPSECRET", appSecret).replace("CODE", code);
+        Map<String, Object> resultMap = new HashMap<>();
+        //发起GET请求
+        JSONObject jsonObject = HttpRequestUtil.getHttpsRequestData(requestUrl, "GET", null);
+        //System.out.println("用户openid和session_key:  "+jsonObject);
+        if(jsonObject != null && jsonObject.containsKey("openid")){
+            resultMap.put("openid", jsonObject.getString("openid"));
+            resultMap.put("session_key", jsonObject.getString("session_key"));
+        }
+        return resultMap;
+    }
+
+
+    /*****
+     * 获取接口访问凭证
+     * @param appId         //凭证
+     * @param appSecret     //密钥
+     * @return
+     */
+    public static Token getToken(String appId, String appSecret){
+        Token token = null;
+        String requestUrl = token_url.replace("APPID", appId).replace("APPSECRET", appSecret);
+        //发起GET请求获取凭证
+        JSONObject jsonObject = HttpRequestUtil.getHttpsRequestData(requestUrl, "GET", null);
+        System.out.println("getToken: "+jsonObject);
+        if(jsonObject != null){
+            try {
+                token = new Token();
+                token.setAccessToken(jsonObject.getString("access_token"));
+                token.setExpiresIn(jsonObject.getInt("expires_in"));
+            }catch (JSONException e){
+                e.printStackTrace();
+            }
+        }
+        return token;
+    }
+}