WxLogin.ts
6.05 KB
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
import WxApi from "./WxApi";
import DataService from "../service/DataService";
import { ErrorCode } from "../base/SDKConst";
import { SDKApi } from "../http/SDKApi";
import WxSystem from "./WxSystem";
import DateUtils from "../utils/DateUtils";
import LogService from "../service/LogService";
import { DOT_SHARE_TYPE } from "../base/SDKEnum";
import ShareVideoService from "../service/ShareVideoService";
import OnlineService from "../service/OnlineService";
export default class WxLogin {
/**
* 发起登录
* @param isAuthorize Boolean 是否重新登录
* tip1:如果是重新登录,需要把之前的token清空
* tip2:必须先调用wxLogin才能使用getUserInfo
*/
async login(isAuthorize: boolean): Promise<any> {
return new Promise(async (resolve, reject) => {
let code = await WxApi.I.login();
if (isAuthorize) {
WxApi.I.getUserinfo()
.then((ret: any) => this.authedlogin(ret, code, resolve, reject))
.catch((err: any) => this.weakLogin(err, code, resolve, reject));
} else {
this.weakLogin({ errCode: 1, msg: '默认未授权登录' }, code, resolve, reject)
}
});
}
private isFirst: boolean
/**
* 授权后登录登陆
* @param ret
* @param resolve
* @param reject
*/
private async authedlogin(ret: _GetUserInfoSuccessObject, code: string, resolve: any, reject: any) {//_GetUserInfoSuccessObject
let { rawData, iv, encryptedData, signature, userInfo } = ret;
let params = {
...this.buildParams(),
code,
signature,
iv: iv,//encodeURIComponent(),
// raw_data: encodeURIComponent(Base64.encode(rawData)),
encryptedData: encryptedData//encodeURIComponent(encryptedData)
};
// 设置性别
userInfo && DataService.I.setGender(userInfo.gender);
SDKApi.Login(params)
.then((data: any) => {
// console.log("登录", data)
this.handleLogin(data, resolve, true);
resolve(data);
})
.catch((err: any) => reject(err));
}
/**
* 弱登录
* @param err
* @param resolve
* @param reject
*/
private async weakLogin(err: any, code: string, resolve: any, reject: any) {
// console.log("弱登录")
// 重新登录不需要继续往下走
if (!err || err.errCode === ErrorCode.InvalidLogin.code)
return;
// 传递来源appid
let refererInfo = DataService.I.ReferrerInfo;
let params = {
...this.buildParams(),
// refAppId: refererInfo.appId || 0,
code
};
SDKApi.weakLogin(params)
.then((data: any) => {
this.handleLogin(data, resolve, false);
})
.catch((err: any) => reject(err));
}
/**
* 处理登录/弱登录请求结果
* @param data
* @param isAuthorize 是否授权:true=已授权 false=没有授权成功
*/
private handleLogin(data: any, resolve: any, isAuthorize: boolean) {
// console.log("登录请求结果data", data)
if (data) {
// 设置登录信息
if (data.data) {
let { channel, uid, firstlogin, token, reftoken, openid, expire, isnew, gameconfig,logindays,amount,pon } = data.data;
LogService.I.setLogind({
channel,
userId: uid,
regTime: firstlogin,
openId: openid,
isnew,
token,
refToken: reftoken,
expire,
logindays,
amount,
pon
});
OnlineService.I.setData(gameconfig)
LogService.I.active();
if (!this.isFirst && DataService.I.ShareKey && DataService.I.ShareId) {
this.isFirst = true;
LogService.I.share(DataService.I.ShareKey, DataService.I.ShareId, DOT_SHARE_TYPE.click);
}
this.handleExpire(expire)
ShareVideoService.I.forward()
}
}
resolve(data)
}
/**
* 构建登录/弱登录公用参数
*/
private buildParams() {
let channel = DataService.I.QueryChannelId + '';
let brand = WxSystem.I.brand;
let model = WxSystem.I.model;
let version = WxSystem.I.version;
let system = WxSystem.I.system;
let platform = WxSystem.I.platform;
let sdkversion = WxSystem.I.SDKVersion;
let shareuid = +DataService.I.QueryUserInviteUid;
let scene = DataService.I.Scene + '';
let sharekey = DataService.I.ShareKey;
let shareid = DataService.I.ShareId + '';
return {
channel,
brand,
model,
version,
system,
platform,
sdkversion,
shareuid,
scene,
sharekey,
shareid
};
}
/**
* 刷新token
* @param expire
*/
private countDown
private handleExpire(expire) {
let time = expire - DateUtils.now;
this.countDown && clearTimeout(this.countDown)
this.countDown = setTimeout(this.refreshToken, time * 1000);
}
private refreshToken() {
SDKApi.reftoken({
channel: DataService.I.ChannelId + '',
uid: DataService.I.UserId,
token: DataService.I.Token,
reftoken: DataService.I.refToken
}).then(res => {
let { token, reftoken, expire } = res.data;
DataService.I.setLoginData({
token,
refToken: reftoken,
expire,
});
this.handleExpire(expire)
})
}
private static _instance: WxLogin;
static get I(): WxLogin {
return this._instance || (this._instance = new WxLogin);
}
}