优化获取用户信息函数

This commit is contained in:
v7lin
2019-03-26 16:16:03 +08:00
parent 8404a13bba
commit c7a5566e18
7 changed files with 119 additions and 50 deletions

View File

@ -5,3 +5,7 @@
## 0.1.0 - 2019.3.19
* fake_tencent
## 0.2.0 - 2019.3.26
* AccessToken

View File

@ -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<String, Object> 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,8 +219,19 @@ 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() {
info.getUserInfo(userInfoListener);
}
result.success(null);
}
private IUiListener userInfoListener = new IUiListener() {
@Override
public void onComplete(Object o) {
Map<String, Object> map = new HashMap<>();
@ -257,10 +271,7 @@ public class FakeTencentPlugin implements MethodCallHandler, PluginRegistry.Acti
public void onCancel() {
// do nothing
}
});
}
result.success(null);
}
};
private void shareMood(MethodCall call, Result result) {
if (tencent != null) {

View File

@ -53,6 +53,9 @@ class _HomeState extends State<Home> {
StreamSubscription<TencentUserInfoResp> _userInfo;
StreamSubscription<TencentShareResp> _share;
TencentLoginResp _loginResp;
DateTime _loginDate;
@override
void initState() {
super.initState();
@ -62,6 +65,8 @@ class _HomeState extends State<Home> {
}
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<Home> {
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(

View File

@ -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];

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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<void> getUserInfo() {
return _channel.invokeMethod(_METHOD_GETUSERINFO);
Future<void> 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,
<String, dynamic>{
_ARGUMENT_KEY_OPENID: openId,
_ARGUMENT_KEY_ACCESSTOKEN: accessToken,
_ARGUMENT_KEY_EXPIRESIN: expiresIn,
_ARGUMENT_KEY_CREATEAT: createAt,
},
);
}
Future<void> shareMood({