瀏覽代碼

优化微信授权处理

sunxbiao 7 月之前
父節點
當前提交
fcf98cd4ee

+ 89 - 27
userCenter_service/src/main/java/com/bjtdba/userCenter/service/impl/WechatLogOnServiceImpl.java

@@ -32,35 +32,97 @@ public class WechatLogOnServiceImpl implements WechatLogOnService {
32 32
     @Override
33 33
     public Object wechatBindPhone(String code) {
34 34
         Map<String, Object> data = new HashMap<>();
35
-        String url1 = SystemConfig.WECHAT_URL.replace("APPID",SystemConfig.WECHAT_APPID).replace("SECRET",SystemConfig.WECHAT_SECRET).replace("CODE",code);
36
-        String a = HttpURLConnectionUtils.doGet(url1);
37
-        System.out.println("微信返回数据"+a);
38
-        String openid =(String)JSONObject.parseObject(a).get("openid");
39
-        String unionid =(String)JSONObject.parseObject(a).get("unionid");
40
-        String access_token =(String)JSONObject.parseObject(a).get("access_token");
41
-        String url2 = SystemConfig.WECHAT_USER_INFO_URL.replace("ACCESS_TOKEN", access_token).replace("OPENID", openid);
42
-        String b = HttpURLConnectionUtils.doGet(url2);
43
-        System.out.println("微信返回数据"+b);
44
-        String nickname =(String)JSONObject.parseObject(b).get("nickname");
45
-        String headimgurl =(String)JSONObject.parseObject(b).get("headimgurl");
46
-        /**
47
-         * 拿openid 查询数据库   判断用户是否绑定    绑定成功直接登录进入系统,绑定不成功返回标示 提示用户进行绑定
48
-         */
49
-//        User user = userDao.selectUserByOpenid(openid);
50
-        User user = userDao.selectUserByOpenid(unionid);
51
-        data.put("nickname",nickname);
52
-        data.put("headimgurl",headimgurl);
53
-        data.put("openid",openid);
54
-        data.put("unionid",unionid);
55
-        if(user==null){
56
-            data.put("code",SystemConfig.WECHAT_CODE);
57
-            data.put("msg",SystemConfig.WECHAT_MSG);
58 35
 
59
-        }else{
60
-            data.put("user",user);
61
-            data.put("code",SystemConfig.WECHAT_SUCCESS_CODE);
36
+        try {
37
+            // 1. 获取微信access_token和openid
38
+            String url1 = SystemConfig.WECHAT_URL
39
+                    .replace("APPID", SystemConfig.WECHAT_APPID)
40
+                    .replace("SECRET", SystemConfig.WECHAT_SECRET)
41
+                    .replace("CODE", code);
42
+
43
+            System.out.println("请求微信API URL1: " + url1);
44
+            String response1 = HttpURLConnectionUtils.doGet(url1);
45
+            System.out.println("微信返回access_token数据: " + response1);
46
+
47
+            JSONObject tokenJson = JSONObject.parseObject(response1);
48
+
49
+            // 检查微信返回的错误信息
50
+            if (tokenJson.containsKey("errcode")) {
51
+                Integer errcode = tokenJson.getInteger("errcode");
52
+                String errmsg = tokenJson.getString("errmsg");
53
+                System.out.println("微信接口调用失败,errcode: " + errcode + ", errmsg: " + errmsg);
54
+                return ResponseUtil.fail("微信授权失败: " + errmsg + "(" + errcode + ")");
55
+            }
56
+
57
+            String openid = tokenJson.getString("openid");
58
+            String unionid = tokenJson.getString("unionid");
59
+            String accessToken = tokenJson.getString("access_token");
60
+
61
+            // 验证必要字段是否存在
62
+            if (openid == null || openid.isEmpty()) {
63
+                System.out.println("微信返回数据缺少openid字段,response: " + response1);
64
+                return ResponseUtil.fail("微信授权失败:无法获取用户标识");
65
+            }
66
+
67
+            if (accessToken == null || accessToken.isEmpty()) {
68
+                System.out.println("微信返回数据缺少access_token字段,response: " + response1);
69
+                return ResponseUtil.fail("微信授权失败:无法获取访问令牌");
70
+            }
71
+
72
+            // 2. 获取用户信息
73
+            String url2 = SystemConfig.WECHAT_USER_INFO_URL
74
+                    .replace("ACCESS_TOKEN", accessToken)
75
+                    .replace("OPENID", openid);
76
+
77
+            System.out.println("请求微信API URL2: " + url2);
78
+            String response2 = HttpURLConnectionUtils.doGet(url2);
79
+            System.out.println("微信返回用户信息数据: " + response2);
80
+
81
+            JSONObject userJson = JSONObject.parseObject(response2);
82
+
83
+            // 检查错误
84
+            if (userJson.containsKey("errcode")) {
85
+                Integer errcode = userJson.getInteger("errcode");
86
+                String errmsg = userJson.getString("errmsg");
87
+                System.out.println("获取微信用户信息失败,errcode: " + errcode + ", errmsg: " + errmsg);
88
+                return ResponseUtil.fail("获取用户信息失败: " + errmsg + "(" + errcode + ")");
89
+            }
90
+
91
+            String nickname = userJson.getString("nickname");
92
+            String headimgurl = userJson.getString("headimgurl");
93
+
94
+            // 3. 查询数据库
95
+            // 这里使用unionid查询,如果unionid为空则使用openid
96
+            User user = null;
97
+            if (unionid != null && !unionid.isEmpty()) {
98
+                user = userDao.selectUserByOpenid(unionid);
99
+            } else {
100
+                user = userDao.selectUserByOpenid(openid);
101
+            }
102
+
103
+            // 4. 构建返回数据
104
+            data.put("nickname", nickname);
105
+            data.put("headimgurl", headimgurl);
106
+            data.put("openid", openid);
107
+            data.put("unionid", unionid);
108
+
109
+            if (user == null) {
110
+                data.put("code", SystemConfig.WECHAT_CODE);
111
+                data.put("msg", SystemConfig.WECHAT_MSG);
112
+                System.out.println("用户未绑定,需要绑定手机号,openid: " + openid);
113
+            } else {
114
+                data.put("user", user);
115
+                data.put("code", SystemConfig.WECHAT_SUCCESS_CODE);
116
+                System.out.println("用户已绑定,直接登录,用户ID: " + user.getUid());
117
+            }
118
+
119
+            return ResponseUtil.ok(data);
120
+
121
+        } catch (Exception e) {
122
+            System.err.println("微信绑定手机号处理失败,code: " + code + ", 异常: " + e.getMessage());
123
+            e.printStackTrace();
124
+            return ResponseUtil.fail("系统处理异常: " + e.getMessage());
62 125
         }
63
-        return ResponseUtil.ok(data);
64 126
     }
65 127
 
66 128
     @Override