Java后台獲取微信小程序用戶信息、openid


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
  * 獲取微信小程序 session_key 和 openid
  *
  * @param code 調用微信登陸返回的Code
  * @return
  */
public  static  JSONObject getSessionKeyOropenid(String code) {
     //微信端登錄code值
     String wxCode = code;
     Locale locale =  new  Locale( "en" "US" );
     ResourceBundle resource = ResourceBundle.getBundle( "config/wx-config" ,locale);    //讀取屬性文件
     String requestUrl = resource.getString( "url" );   //請求地址 https://api.weixin.qq.com/sns/jscode2session
     Map<String, String> requestUrlParam =  new  HashMap<String, String>();
     requestUrlParam.put( "appid" , resource.getString( "appId" ));   //開發者設置中的appId
     requestUrlParam.put( "secret" , resource.getString( "appSecret" ));  //開發者設置中的appSecret
     requestUrlParam.put( "js_code" , wxCode);  //小程序調用wx.login返回的code
     requestUrlParam.put( "grant_type" , resource.getString( "grantType" ));     //默認參數 authorization_code
 
     //發送post請求讀取調用微信 https://api.weixin.qq.com/sns/jscode2session 接口獲取openid用戶唯一標識
     JSONObject jsonObject = JSON.parseObject(sendPost(requestUrl, requestUrlParam));
     return  jsonObject;
}
 
/**
  * 向指定 URL 發送POST方法的請求
  *
  * @param url 發送請求的 URL
  * @return 所代表遠程資源的響應結果
  */
public  static  String sendPost(String url, Map<String, ?> paramMap) {
     PrintWriter out =  null ;
     BufferedReader in =  null ;
     String result =  "" ;
 
     String param =  "" ;
     Iterator<String> it = paramMap.keySet().iterator();
 
     while  (it.hasNext()) {
         String key = it.next();
         param += key +  "="  + paramMap.get(key) +  "&" ;
     }
 
     try  {
         URL realUrl =  new  URL(url);
         // 打開和URL之間的連接
         URLConnection conn = realUrl.openConnection();
         // 設置通用的請求屬性
         conn.setRequestProperty( "accept" "*/*" );
         conn.setRequestProperty( "connection" "Keep-Alive" );
         conn.setRequestProperty( "Accept-Charset" "utf-8" );
         conn.setRequestProperty( "user-agent" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)" );
         // 發送POST請求必須設置如下兩行
         conn.setDoOutput( true );
         conn.setDoInput( true );
         // 獲取URLConnection對象對應的輸出流
         out =  new  PrintWriter(conn.getOutputStream());
         // 發送請求參數
         out.print(param);
         // flush輸出流的緩沖
         out.flush();
         // 定義BufferedReader輸入流來讀取URL的響應
         in =  new  BufferedReader( new  InputStreamReader(conn.getInputStream(),  "UTF-8" ));
         String line;
         while  ((line = in.readLine()) !=  null ) {
             result += line;
         }
     catch  (Exception e) {
         log.error(e.getMessage(), e);
     }
     //使用finally塊來關閉輸出流、輸入流
     finally  {
         try  {
             if  (out !=  null ) {
                 out.close();
             }
             if  (in !=  null ) {
                 in.close();
             }
         catch  (IOException ex) {
             ex.printStackTrace();
         }
     }
     return  result;
}
 
  /**
      * 解密用戶敏感數據獲取用戶信息
      *
      * @param sessionKey    數據進行加密簽名的密鑰
      * @param encryptedData 包括敏感數據在內的完整用戶信息的加密數據
      * @param iv            加密算法的初始向量
      * @return
      * */
     public  static  JSONObject getUserInfo(String encryptedData, String sessionKey, String iv) {
         // 被加密的數據
         byte [] dataByte = Base64Util.decodeByte(encryptedData);
         // 加密秘鑰
         byte [] keyByte = Base64Util.decodeByte(sessionKey);
         // 偏移量
         byte [] ivByte = Base64Util.decodeByte(iv);
         try  {
 
             // 如果密鑰不足16位,那么就補足.  這個if 中的內容很重要
             int  base =  16 ;
             if  (keyByte.length % base !=  0 ) {
                 int  groups = keyByte.length / base + (keyByte.length % base !=  0  1  0 );
                 byte [] temp =  new  byte [groups * base];
                 Arrays.fill(temp, ( byte 0 );
                 System.arraycopy(keyByte,  0 , temp,  0 , keyByte.length);
                 keyByte = temp;
             }
             // 初始化
             Security.addProvider( new  BouncyCastleProvider());
             Cipher cipher = Cipher.getInstance( "AES/CBC/PKCS7Padding" "BC" );
             SecretKeySpec spec =  new  SecretKeySpec(keyByte,  "AES" );
             AlgorithmParameters parameters = AlgorithmParameters.getInstance( "AES" );
             parameters.init( new  IvParameterSpec(ivByte));
             cipher.init(Cipher.DECRYPT_MODE, spec, parameters); // 初始化
             byte [] resultByte = cipher.doFinal(dataByte);
             if  ( null  != resultByte && resultByte.length >  0 ) {
                 String result =  new  String(resultByte,  "UTF-8" );
                 return  JSON.parseObject(result);
             }
         catch  (NoSuchAlgorithmException e) {
             log.error(e.getMessage(), e);
         catch  (NoSuchPaddingException e) {
             log.error(e.getMessage(), e);
         catch  (InvalidParameterSpecException e) {
             log.error(e.getMessage(), e);
         catch  (IllegalBlockSizeException e) {
             log.error(e.getMessage(), e);
         catch  (BadPaddingException e) {
             log.error(e.getMessage(), e);
         catch  (UnsupportedEncodingException e) {
             log.error(e.getMessage(), e);
         catch  (InvalidKeyException e) {
             log.error(e.getMessage(), e);
         catch  (InvalidAlgorithmParameterException e) {
             log.error(e.getMessage(), e);
         catch  (NoSuchProviderException e) {
             log.error(e.getMessage(), e);
         }
         return  null ;
     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM