wx login

chengzhenyu 8 lat temu
rodzic
commit
f9b9c2efb4

+ 8 - 0
app/src/main/java/ai/pai/lensman/db/Preferences.java

@@ -48,6 +48,14 @@ public class Preferences {
48 48
         return mPrefs.getString("lensManId",NullStr);
49 49
     }
50 50
 
51
+    public String getWXCode(){
52
+        return mPrefs.getString("wxcode", NullStr);
53
+    }
54
+
55
+    public void setWXCode(String wxCode){
56
+        mPrefs.edit().putString("wxcode",wxCode).commit();
57
+    }
58
+
51 59
     public void clearPrefs(){
52 60
         mPrefs.edit().clear().commit();
53 61
     }

+ 7 - 1
app/src/main/java/ai/pai/lensman/login/LoginActivity.java

@@ -30,9 +30,15 @@ public class LoginActivity extends FragmentActivity implements LoginContract.Vie
30 30
     }
31 31
 
32 32
 
33
+    @Override
34
+    protected void onResume() {
35
+        super.onResume();
36
+        presenter.start();
37
+    }
38
+
33 39
     @OnClick(R.id.btn_login)
34 40
     public void login(){
35
-        presenter.start();
41
+        presenter.login();
36 42
     }
37 43
 
38 44
     @Override

+ 153 - 20
app/src/main/java/ai/pai/lensman/login/LoginInteractor.java

@@ -15,39 +15,143 @@ import ai.pai.lensman.utils.UrlContainer;
15 15
 /**
16 16
  * Created by chengzhenyu on 2016/8/12.
17 17
  */
18
-public class LoginInteractor implements BaseInteractor{
18
+public class LoginInteractor implements BaseInteractor {
19 19
 
20 20
     private HttpPostTask loginTask;
21
+    private HttpPostTask fetchTokenTask;
22
+    private HttpPostTask fetchUserInfoTask;
21 23
     private InteractorListener<String> listener;
24
+    private static final String APP_ID = "";
25
+    private static final String APP_SECRET = "";
26
+    private String wxCode;
22 27
 
23
-    public LoginInteractor(InteractorListener<String> listener){
28
+    public LoginInteractor(String wxCode, InteractorListener<String> listener) {
29
+        this.wxCode = wxCode;
24 30
         this.listener = listener;
25 31
     }
26 32
 
27 33
     @Override
28 34
     public void startJob() {
29
-        cancelJob();
30
-        HashMap<String,String> params = new HashMap<>();
31
-        params.put("username","chengzhenyu");
32
-        params.put("password","paiai");
35
+        fetchToken();
36
+    }
37
+
38
+    @Override
39
+    public void cancelJob() {
40
+        cancelJob(loginTask);
41
+        cancelJob(fetchTokenTask);
42
+        cancelJob(fetchUserInfoTask);
43
+    }
44
+
45
+    private void cancelJob(HttpPostTask task) {
46
+        if (task == null) {
47
+            return;
48
+        }
49
+        if (task.getStatus() == AsyncTask.Status.RUNNING) {
50
+            task.cancel(true);
51
+        }
52
+    }
53
+
54
+    private void fetchToken() {
55
+
56
+        final String tokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID
57
+                + "&secret=" + APP_SECRET + "&code=" + wxCode + "&grant_type=authorization_code";
58
+
59
+        fetchTokenTask = new HttpPostTask(null) {
60
+
61
+            String token;
62
+            String openId;
63
+
64
+            @Override
65
+            protected boolean parseResponse(String response) {
66
+                try {
67
+                    JSONObject json = new JSONObject(response);
68
+                    token = json.getString("access_token");
69
+                    openId = json.getString("openid");
70
+                    return true;
71
+                } catch (Exception e) {
72
+                    e.printStackTrace();
73
+                }
74
+                return false;
75
+            }
76
+
77
+            @Override
78
+            protected void onPostSuccess() {
79
+                super.onPostSuccess();
80
+                fetchUserInfo(token, openId);
81
+            }
82
+
83
+            @Override
84
+            protected void onPostFail() {
85
+                super.onPostFail();
86
+            }
87
+        };
88
+        loginTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), tokenUrl);
89
+    }
90
+
91
+    private void fetchUserInfo(String token, String openId) {
92
+
93
+        String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + token + "&openid=" + openId;
33 94
 
34
-        loginTask = new HttpPostTask(params){
95
+        fetchUserInfoTask = new HttpPostTask(null) {
96
+            HashMap<String, String> params;
97
+
98
+            @Override
99
+            protected boolean parseResponse(String response) {
100
+                try {
101
+                    JSONObject json = new JSONObject(response);
102
+                    params = new HashMap<>();
103
+                    params.put("unionid", json.getString("unionid"));
104
+                    params.put("openid", json.getString("openid"));
105
+                    params.put("sex", json.getString("sex"));
106
+                    params.put("nickname", json.getString("nickname"));
107
+                    params.put("headimgurl", json.getString("headimgurl"));
108
+                    params.put("country", json.getString("country"));
109
+                    params.put("province", json.getString("province"));
110
+                    params.put("city", json.getString("city"));
111
+                    return true;
112
+                } catch (Exception e) {
113
+                    e.printStackTrace();
114
+                }
115
+                return false;
116
+            }
117
+
118
+            @Override
119
+            protected void onPostSuccess() {
120
+                super.onPostSuccess();
121
+                wxLogin(params);
122
+            }
123
+
124
+            @Override
125
+            protected void onPostFail() {
126
+                super.onPostFail();
127
+            }
128
+        };
129
+        fetchUserInfoTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), userInfoUrl);
130
+    }
131
+
132
+    private void login() {
133
+        HashMap<String, String> params = new HashMap<>();
134
+        params.put("username", "chengzhenyu");
135
+        params.put("password", "paiai");
136
+
137
+        loginTask = new HttpPostTask(params) {
35 138
 
36 139
             String lensmanId;
37 140
             String message;
141
+
38 142
             @Override
39 143
             protected boolean parseResponse(String response) {
40
-                try{
144
+                try {
41 145
                     JSONObject json = new JSONObject(response);
42 146
                     int status = json.getInt("status");
43
-                    if(status == 200){
147
+                    if (status == 200) {
44 148
                         JSONObject info = json.getJSONObject("data");
45 149
                         lensmanId = info.getString("user_id");
46 150
                         return true;
47
-                    }else{
151
+                    } else {
48 152
                         message = json.getString("message");
49 153
                     }
50
-                }catch (Exception e){
154
+                } catch (Exception e) {
51 155
                     e.printStackTrace();
52 156
                 }
53 157
                 return false;
@@ -68,15 +172,44 @@ public class LoginInteractor implements BaseInteractor{
68 172
         loginTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.LOGIN_URL);
69 173
     }
70 174
 
71
-    @Override
72
-    public void cancelJob() {
73
-        if(loginTask == null){
74
-            return;
75
-        }
76
-        if(loginTask.getStatus()== AsyncTask.Status.RUNNING){
77
-            loginTask.cancel(true);
78
-        }
79
-        loginTask = null;
175
+    private void wxLogin(HashMap<String, String> params) {
176
+
177
+        loginTask = new HttpPostTask(params) {
178
+
179
+            String lensmanId;
180
+            String message;
181
+
182
+            @Override
183
+            protected boolean parseResponse(String response) {
184
+                try {
185
+                    JSONObject json = new JSONObject(response);
186
+                    int status = json.getInt("status");
187
+                    if (status == 200) {
188
+                        JSONObject info = json.getJSONObject("data");
189
+                        lensmanId = info.getString("user_id");
190
+                        return true;
191
+                    } else {
192
+                        message = json.getString("message");
193
+                    }
194
+                } catch (Exception e) {
195
+                    e.printStackTrace();
196
+                }
197
+                return false;
198
+            }
199
+
200
+            @Override
201
+            protected void onPostFail() {
202
+                super.onPostFail();
203
+                listener.onInteractFail(message);
204
+            }
205
+
206
+            @Override
207
+            protected void onPostSuccess() {
208
+                super.onPostSuccess();
209
+                listener.onInteractSuccess(lensmanId);
210
+            }
211
+        };
212
+        loginTask.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.WX_LOGIN_URL);
80 213
     }
81 214
 
82 215
 }

+ 11 - 7
app/src/main/java/ai/pai/lensman/login/LoginPresenter.java

@@ -1,6 +1,7 @@
1 1
 package ai.pai.lensman.login;
2 2
 
3 3
 import android.content.Context;
4
+import android.text.TextUtils;
4 5
 
5 6
 import com.tencent.mm.sdk.modelmsg.SendAuth;
6 7
 import com.tencent.mm.sdk.openapi.IWXAPI;
@@ -26,13 +27,6 @@ public class LoginPresenter implements LoginContract.Presenter,BaseInteractor.In
26 27
 
27 28
     @Override
28 29
     public void login() {
29
-        view.showProgressView();
30
-        interactor = new LoginInteractor(this);
31
-        interactor.startJob();
32
-    }
33
-
34
-    @Override
35
-    public void start() {
36 30
         IWXAPI api = WXAPIFactory.createWXAPI(context, APP_ID, true);
37 31
         api.registerApp(APP_ID);
38 32
         SendAuth.Req req = new SendAuth.Req();
@@ -42,6 +36,16 @@ public class LoginPresenter implements LoginContract.Presenter,BaseInteractor.In
42 36
     }
43 37
 
44 38
     @Override
39
+    public void start() {
40
+        String wxCode = Preferences.getInstance(context).getWXCode();
41
+        if(!TextUtils.isEmpty(wxCode)){
42
+            view.showProgressView();
43
+            interactor = new LoginInteractor(wxCode,this);
44
+            interactor.startJob();
45
+        }
46
+    }
47
+
48
+    @Override
45 49
     public void stop() {
46 50
         if(interactor!=null){
47 51
             interactor.cancelJob();

+ 21 - 1
app/src/main/java/ai/pai/lensman/utils/UrlContainer.java

@@ -13,7 +13,27 @@ public class UrlContainer {
13 13
 
14 14
     public static final String SESSION_IDS_CREATE = HOST_URL+"uuid";
15 15
 
16
-    public static final String PHOTO_UPLOAD_URL = HOST_URL+"photos/upload";
16
+    /**
17
+     * user_id  # 用户唯一标识
18
+     * nickname  # 用户昵称
19
+     * session_id  # SESSION唯一标识
20
+     * photo_id  # 照片唯一标识
21
+     * photo  # @File 需要上传的照片
22
+     * current_id  # 当前以获取照片最大id,不传默认为-1
23
+     */
24
+    public static final String PHOTO_UPLOAD_URL = HOST_URL+"l/upload";
25
+
26
+    /**
27
+     * unionid  # 摄影师微信授权 Unionid
28
+     * openid  # 摄影师微信授权 Openid
29
+     * sex  # 性别
30
+     * nickname or screen_name  # 昵称,Android 和 iOS 貌似不同
31
+     * headimgurl or profile_image_url  # 头像,Android 和 iOS 貌似不同
32
+     * country  # 国家
33
+     * province  # 省份
34
+     * city  # 城市
35
+     */
36
+    public static final String WX_LOGIN_URL = HOST_URL+"l/wx/authorize";
17 37
 
18 38
 
19 39
 

+ 3 - 0
app/src/main/java/ai/pai/lensman/wxapi/WXEntryActivity.java

@@ -11,6 +11,8 @@ import com.tencent.mm.sdk.openapi.IWXAPI;
11 11
 import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
12 12
 import com.tencent.mm.sdk.openapi.WXAPIFactory;
13 13
 
14
+import ai.pai.lensman.db.Preferences;
15
+
14 16
 public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
15 17
 
16 18
     private IWXAPI api;
@@ -42,6 +44,7 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
42 44
         if(resp instanceof SendAuth.Resp){
43 45
             SendAuth.Resp newResp = (SendAuth.Resp) resp;
44 46
             String code = newResp.code;
47
+            Preferences.getInstance(this).setWXCode(code);
45 48
         }
46 49
     }
47 50