diff --git a/CHANGELOG.md b/CHANGELOG.md index d23c720..34245cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,3 +5,7 @@ ## 0.1.0 - 2019.3.19 * 规范 fake_tencent 代码 + +## 0.2.0 - 2019.3.26 + +* 不再自动设置 AccessToken diff --git a/android/src/main/java/io/github/v7lin/faketencent/FakeTencentPlugin.java b/android/src/main/java/io/github/v7lin/faketencent/FakeTencentPlugin.java index 8c4299b..5f7744e 100644 --- a/android/src/main/java/io/github/v7lin/faketencent/FakeTencentPlugin.java +++ b/android/src/main/java/io/github/v7lin/faketencent/FakeTencentPlugin.java @@ -78,6 +78,10 @@ public class FakeTencentPlugin implements MethodCallHandler, PluginRegistry.Acti private static final String ARGUMENT_KEY_APPID = "appId"; private static final String ARGUMENT_KEY_SCOPE = "scope"; + private static final String ARGUMENT_KEY_OPENID = "openId"; + private static final String ARGUMENT_KEY_ACCESSTOKEN = "accessToken"; + private static final String ARGUMENT_KEY_EXPIRESIN = "expiresIn"; + private static final String ARGUMENT_KEY_CREATEAT = "createAt"; private static final String ARGUMENT_KEY_SCENE = "scene"; private static final String ARGUMENT_KEY_TITLE = "title"; private static final String ARGUMENT_KEY_SUMMARY = "summary"; @@ -94,6 +98,7 @@ public class FakeTencentPlugin implements MethodCallHandler, PluginRegistry.Acti private static final String ARGUMENT_KEY_RESULT_OPENID = "openid"; private static final String ARGUMENT_KEY_RESULT_ACCESS_TOKEN = "access_token"; private static final String ARGUMENT_KEY_RESULT_EXPIRES_IN = "expires_in"; + private static final String ARGUMENT_KEY_RESULT_CREATE_AT = "create_at"; private static final String SCHEME_FILE = "file"; @@ -152,8 +157,6 @@ public class FakeTencentPlugin implements MethodCallHandler, PluginRegistry.Acti } private IUiListener loginListener = new IUiListener() { - - @Override public void onComplete(Object o) { Map map = new HashMap<>(); @@ -165,14 +168,14 @@ public class FakeTencentPlugin implements MethodCallHandler, PluginRegistry.Acti if (ret == TencentRetCode.RET_SUCCESS) { String openId = !object.isNull(ARGUMENT_KEY_RESULT_OPENID) ? object.getString(ARGUMENT_KEY_RESULT_OPENID) : null; String accessToken = !object.isNull(ARGUMENT_KEY_RESULT_ACCESS_TOKEN) ? object.getString(ARGUMENT_KEY_RESULT_ACCESS_TOKEN) : null; - long expiresIn = !object.isNull(ARGUMENT_KEY_RESULT_EXPIRES_IN) ? object.getLong(ARGUMENT_KEY_RESULT_EXPIRES_IN) : 0; + int expiresIn = !object.isNull(ARGUMENT_KEY_RESULT_EXPIRES_IN) ? object.getInt(ARGUMENT_KEY_RESULT_EXPIRES_IN) : 0; + long createAt = System.currentTimeMillis(); if (!TextUtils.isEmpty(openId) && !TextUtils.isEmpty(accessToken)) { - tencent.setOpenId(openId); - tencent.setAccessToken(accessToken, String.valueOf(expiresIn)); map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_SUCCESS); map.put(ARGUMENT_KEY_RESULT_OPENID, openId); map.put(ARGUMENT_KEY_RESULT_ACCESS_TOKEN, accessToken); map.put(ARGUMENT_KEY_RESULT_EXPIRES_IN, expiresIn); + map.put(ARGUMENT_KEY_RESULT_CREATE_AT, createAt); } else { map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_COMMON); map.put(ARGUMENT_KEY_RESULT_MSG, "openId or accessToken is null."); @@ -216,52 +219,60 @@ public class FakeTencentPlugin implements MethodCallHandler, PluginRegistry.Acti private void getUserInfo(MethodCall call, Result result) { if (tencent != null) { + String openId = call.argument(ARGUMENT_KEY_OPENID); + tencent.setOpenId(openId); + String accessToken = call.argument(ARGUMENT_KEY_ACCESSTOKEN); + int expiresIn = call.argument(ARGUMENT_KEY_EXPIRESIN); + long createAt = call.argument(ARGUMENT_KEY_CREATEAT); + tencent.setAccessToken(accessToken, String.valueOf(expiresIn - (System.currentTimeMillis() - createAt) / 1000)); UserInfo info = new UserInfo(registrar.context().getApplicationContext(), tencent.getQQToken()); - info.getUserInfo(new IUiListener() { - @Override - public void onComplete(Object o) { - Map map = new HashMap<>(); - try { - if (o != null && o instanceof JSONObject) { - JSONObject object = (JSONObject) o; - int ret = !object.isNull(ARGUMENT_KEY_RESULT_RET) ? object.getInt(ARGUMENT_KEY_RESULT_RET) : TencentRetCode.RET_FAILED; - String msg = !object.isNull(ARGUMENT_KEY_RESULT_MSG) ? object.getString(ARGUMENT_KEY_RESULT_MSG) : null; - if (ret == TencentRetCode.RET_SUCCESS) { - map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_SUCCESS); - Iterator keys = object.keys(); - while (keys.hasNext()) { - String key = keys.next(); - map.put(key, object.get(key)); - } - } else { - map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_COMMON); - map.put(ARGUMENT_KEY_RESULT_MSG, msg); - } - } - } catch (JSONException e) { - map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_COMMON); - map.put(ARGUMENT_KEY_RESULT_MSG, e.getMessage()); - } - channel.invokeMethod(METHOD_ONGETUSERINFORESP, map); - } - - @Override - public void onError(UiError error) { - Map map = new HashMap<>(); - map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_COMMON); - map.put(ARGUMENT_KEY_RESULT_MSG, error.errorMessage); - channel.invokeMethod(METHOD_ONGETUSERINFORESP, map); - } - - @Override - public void onCancel() { - // do nothing - } - }); + info.getUserInfo(userInfoListener); } result.success(null); } + private IUiListener userInfoListener = new IUiListener() { + @Override + public void onComplete(Object o) { + Map map = new HashMap<>(); + try { + if (o != null && o instanceof JSONObject) { + JSONObject object = (JSONObject) o; + int ret = !object.isNull(ARGUMENT_KEY_RESULT_RET) ? object.getInt(ARGUMENT_KEY_RESULT_RET) : TencentRetCode.RET_FAILED; + String msg = !object.isNull(ARGUMENT_KEY_RESULT_MSG) ? object.getString(ARGUMENT_KEY_RESULT_MSG) : null; + if (ret == TencentRetCode.RET_SUCCESS) { + map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_SUCCESS); + Iterator keys = object.keys(); + while (keys.hasNext()) { + String key = keys.next(); + map.put(key, object.get(key)); + } + } else { + map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_COMMON); + map.put(ARGUMENT_KEY_RESULT_MSG, msg); + } + } + } catch (JSONException e) { + map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_COMMON); + map.put(ARGUMENT_KEY_RESULT_MSG, e.getMessage()); + } + channel.invokeMethod(METHOD_ONGETUSERINFORESP, map); + } + + @Override + public void onError(UiError error) { + Map map = new HashMap<>(); + map.put(ARGUMENT_KEY_RESULT_RET, TencentRetCode.RET_COMMON); + map.put(ARGUMENT_KEY_RESULT_MSG, error.errorMessage); + channel.invokeMethod(METHOD_ONGETUSERINFORESP, map); + } + + @Override + public void onCancel() { + // do nothing + } + }; + private void shareMood(MethodCall call, Result result) { if (tencent != null) { int scene = call.argument(ARGUMENT_KEY_SCENE); diff --git a/example/lib/main.dart b/example/lib/main.dart index 4c1c13b..3a64ee8 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -53,6 +53,9 @@ class _HomeState extends State { StreamSubscription _userInfo; StreamSubscription _share; + TencentLoginResp _loginResp; + DateTime _loginDate; + @override void initState() { super.initState(); @@ -62,6 +65,8 @@ class _HomeState extends State { } void _listenLogin(TencentLoginResp resp) { + _loginDate = DateTime.now(); + _loginResp = resp; String content = 'login: ${resp.openid} - ${resp.accessToken}'; _showTips('登录', content); } @@ -117,7 +122,17 @@ class _HomeState extends State { ListTile( title: const Text('获取用户信息'), onTap: () { - widget.tencent.getUserInfo(); + if (_loginDate != null && _loginResp != null && + _loginResp.ret == TencentResp.RET_SUCCESS) { + if (DateTime.now().millisecondsSinceEpoch - _loginResp.createAt < _loginResp.expiresIn * 1000) { + widget.tencent.getUserInfo( + openId: _loginResp.openid, + accessToken: _loginResp.accessToken, + expiresIn: _loginResp.expiresIn, + createAt: _loginResp.createAt, + ); + } + } }, ), ListTile( diff --git a/ios/Classes/FakeTencentPlugin.m b/ios/Classes/FakeTencentPlugin.m index 9438f44..8994846 100644 --- a/ios/Classes/FakeTencentPlugin.m +++ b/ios/Classes/FakeTencentPlugin.m @@ -52,6 +52,10 @@ static NSString * const METHOD_ONSHARERESP = @"onShareResp"; static NSString * const ARGUMENT_KEY_APPID = @"appId"; static NSString * const ARGUMENT_KEY_SCOPE = @"scope"; +static NSString * const ARGUMENT_KEY_OPENID = @"openId"; +static NSString * const ARGUMENT_KEY_ACCESSTOKEN = @"accessToken"; +static NSString * const ARGUMENT_KEY_EXPIRESIN = @"expiresIn"; +static NSString * const ARGUMENT_KEY_CREATEAT = @"createAt"; static NSString * const ARGUMENT_KEY_SCENE = @"scene"; static NSString * const ARGUMENT_KEY_TITLE = @"title"; static NSString * const ARGUMENT_KEY_SUMMARY = @"summary"; @@ -68,6 +72,7 @@ static NSString * const ARGUMENT_KEY_RESULT_MSG = @"msg"; static NSString * const ARGUMENT_KEY_RESULT_OPENID = @"openid"; static NSString * const ARGUMENT_KEY_RESULT_ACCESS_TOKEN = @"access_token"; static NSString * const ARGUMENT_KEY_RESULT_EXPIRES_IN = @"expires_in"; +static NSString * const ARGUMENT_KEY_RESULT_CREATE_AT = @"create_at"; static NSString * const SCHEME_FILE = @"file"; @@ -120,6 +125,14 @@ static NSString * const SCHEME_FILE = @"file"; } -(void)getUserInfo:(FlutterMethodCall*)call result:(FlutterResult)result { + NSString * openId = call.arguments[ARGUMENT_KEY_OPENID]; + NSString * accessToken = call.arguments[ARGUMENT_KEY_ACCESSTOKEN]; + NSNumber * expiresIn = call.arguments[ARGUMENT_KEY_EXPIRESIN]; + NSNumber * createAt = call.arguments[ARGUMENT_KEY_CREATEAT]; + NSTimeInterval secs = createAt.longLongValue / 1000.0 + expiresIn.longLongValue; + [_oauth setOpenId:openId]; + [_oauth setAccessToken:accessToken]; + [_oauth setExpirationDate:[NSDate dateWithTimeIntervalSince1970:secs]]; [_oauth getUserInfo]; result(nil); } @@ -258,10 +271,12 @@ static NSString * const SCHEME_FILE = @"file"; NSString * openId = _oauth.openId; NSString * accessToken = _oauth.accessToken; long long expiresIn = ceil(_oauth.expirationDate.timeIntervalSinceNow);// 向上取整 + long long createAt = [[NSDate date] timeIntervalSince1970] * 1000.0; [dictionary setValue:[NSNumber numberWithInt:RET_SUCCESS] forKey:ARGUMENT_KEY_RESULT_RET]; [dictionary setValue:openId forKey:ARGUMENT_KEY_RESULT_OPENID]; [dictionary setValue:accessToken forKey:ARGUMENT_KEY_RESULT_ACCESS_TOKEN]; [dictionary setValue:[NSNumber numberWithLongLong:expiresIn] forKey:ARGUMENT_KEY_RESULT_EXPIRES_IN]; + [dictionary setValue:[NSNumber numberWithLongLong:createAt] forKey:ARGUMENT_KEY_RESULT_CREATE_AT]; } else { // 登录失败 [dictionary setValue:[NSNumber numberWithInt:RET_COMMON] forKey:ARGUMENT_KEY_RESULT_RET]; diff --git a/lib/src/domain/tencent_login_resp.dart b/lib/src/domain/tencent_login_resp.dart index ebbdd73..4c01c91 100644 --- a/lib/src/domain/tencent_login_resp.dart +++ b/lib/src/domain/tencent_login_resp.dart @@ -14,9 +14,11 @@ class TencentLoginResp extends TencentResp { this.openid, this.accessToken, this.expiresIn, + this.createAt, }) : super(ret: ret, msg: msg); final String openid; final String accessToken; final int expiresIn; + final int createAt; } diff --git a/lib/src/domain/tencent_login_resp.jser.dart b/lib/src/domain/tencent_login_resp.jser.dart index 05402fb..249c5f5 100644 --- a/lib/src/domain/tencent_login_resp.jser.dart +++ b/lib/src/domain/tencent_login_resp.jser.dart @@ -15,6 +15,7 @@ abstract class _$TencentLoginRespSerializer setMapValue(ret, 'openid', model.openid); setMapValue(ret, 'access_token', model.accessToken); setMapValue(ret, 'expires_in', model.expiresIn); + setMapValue(ret, 'create_at', model.createAt); setMapValue(ret, 'ret', model.ret); setMapValue(ret, 'msg', model.msg); return ret; @@ -29,7 +30,8 @@ abstract class _$TencentLoginRespSerializer openid: map['openid'] as String ?? getJserDefault('openid'), accessToken: map['access_token'] as String ?? getJserDefault('accessToken'), - expiresIn: map['expires_in'] as int ?? getJserDefault('expiresIn')); + expiresIn: map['expires_in'] as int ?? getJserDefault('expiresIn'), + createAt: map['create_at'] as int ?? getJserDefault('createAt')); return obj; } } diff --git a/lib/src/tencent.dart b/lib/src/tencent.dart index 6872902..5d7f184 100644 --- a/lib/src/tencent.dart +++ b/lib/src/tencent.dart @@ -26,6 +26,10 @@ class Tencent { static const String _ARGUMENT_KEY_APPID = 'appId'; static const String _ARGUMENT_KEY_SCOPE = 'scope'; + static const String _ARGUMENT_KEY_OPENID = 'openId'; + static const String _ARGUMENT_KEY_ACCESSTOKEN = 'accessToken'; + static const String _ARGUMENT_KEY_EXPIRESIN = 'expiresIn'; + static const String _ARGUMENT_KEY_CREATEAT = 'createAt'; static const String _ARGUMENT_KEY_SCENE = 'scene'; static const String _ARGUMENT_KEY_TITLE = 'title'; static const String _ARGUMENT_KEY_SUMMARY = 'summary'; @@ -117,8 +121,24 @@ class Tencent { return _channel.invokeMethod(_METHOD_LOGOUT); } - Future getUserInfo() { - return _channel.invokeMethod(_METHOD_GETUSERINFO); + Future getUserInfo({ + @required String openId, + @required String accessToken, + @required int expiresIn, + @required int createAt, + }) { + assert(openId != null && openId.isNotEmpty); + assert(accessToken != null && accessToken.isNotEmpty); + assert(expiresIn != null && expiresIn > 0); + return _channel.invokeMethod( + _METHOD_GETUSERINFO, + { + _ARGUMENT_KEY_OPENID: openId, + _ARGUMENT_KEY_ACCESSTOKEN: accessToken, + _ARGUMENT_KEY_EXPIRESIN: expiresIn, + _ARGUMENT_KEY_CREATEAT: createAt, + }, + ); } Future shareMood({