com.taptap.sdk.login 4.3.0-aplha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/Mobile/Editor/NativeDependencies.xml +20 -0
  2. package/Mobile/Editor/NativeDependencies.xml.meta +7 -0
  3. package/Mobile/Editor/TapLoginIOSProcessor.cs +91 -0
  4. package/Mobile/Editor/TapLoginIOSProcessor.cs.meta +11 -0
  5. package/Mobile/Editor/TapLoginMobileProcessBuild.cs +20 -0
  6. package/Mobile/Editor/TapLoginMobileProcessBuild.cs.meta +11 -0
  7. package/Mobile/Editor/TapSDK.Login.Mobile.Editor.asmdef +17 -0
  8. package/Mobile/Editor/TapSDK.Login.Mobile.Editor.asmdef.meta +7 -0
  9. package/Mobile/Editor.meta +8 -0
  10. package/Mobile/Runtime/AccountWrapper.cs +32 -0
  11. package/Mobile/Runtime/AccountWrapper.cs.meta +3 -0
  12. package/Mobile/Runtime/TapSDK.Login.Mobile.Runtime.asmdef +20 -0
  13. package/Mobile/Runtime/TapSDK.Login.Mobile.Runtime.asmdef.meta +7 -0
  14. package/Mobile/Runtime/TapTapLoginImpl.cs +81 -0
  15. package/Mobile/Runtime/TapTapLoginImpl.cs.meta +3 -0
  16. package/Mobile/Runtime.meta +8 -0
  17. package/Mobile.meta +8 -0
  18. package/Plugins/iOS/TapTapSDKLoginAppDelegate.mm +40 -0
  19. package/Plugins/iOS/TapTapSDKLoginAppDelegate.mm.meta +37 -0
  20. package/Plugins/iOS.meta +8 -0
  21. package/Plugins/zxing.unity.dll +0 -0
  22. package/Plugins/zxing.unity.dll.meta +33 -0
  23. package/Plugins.meta +8 -0
  24. package/Runtime/Internal/ITapTapLoginPlatform.cs +15 -0
  25. package/Runtime/Internal/ITapTapLoginPlatform.cs.meta +3 -0
  26. package/Runtime/Internal/Init/LoginInitTask.cs +20 -0
  27. package/Runtime/Internal/Init/LoginInitTask.cs.meta +11 -0
  28. package/Runtime/Internal/Init.meta +8 -0
  29. package/Runtime/Internal/Region.cs +98 -0
  30. package/Runtime/Internal/Region.cs.meta +11 -0
  31. package/Runtime/Internal/TapTapLoginManager.cs +38 -0
  32. package/Runtime/Internal/TapTapLoginManager.cs.meta +3 -0
  33. package/Runtime/Internal.meta +8 -0
  34. package/Runtime/Public/AccessToken.cs +83 -0
  35. package/Runtime/Public/AccessToken.cs.meta +11 -0
  36. package/Runtime/Public/Profile.cs +51 -0
  37. package/Runtime/Public/Profile.cs.meta +11 -0
  38. package/Runtime/Public/TapTapAccount.cs +70 -0
  39. package/Runtime/Public/TapTapAccount.cs.meta +3 -0
  40. package/Runtime/Public/TapTapLogin.cs +39 -0
  41. package/Runtime/Public/TapTapLogin.cs.meta +3 -0
  42. package/Runtime/Public/TapTapSdk.cs +26 -0
  43. package/Runtime/Public/TapTapSdk.cs.meta +11 -0
  44. package/Runtime/Public.meta +8 -0
  45. package/Runtime/TapSDK.Login.Runtime.asmdef +15 -0
  46. package/Runtime/TapSDK.Login.Runtime.asmdef.meta +7 -0
  47. package/Runtime.meta +8 -0
  48. package/Standalone/Editor/TapLoginStandaloneProcessBuild.cs +22 -0
  49. package/Standalone/Editor/TapLoginStandaloneProcessBuild.cs.meta +11 -0
  50. package/Standalone/Editor/TapSDK.Login.Standalone.Editor.asmdef +17 -0
  51. package/Standalone/Editor/TapSDK.Login.Standalone.Editor.asmdef.meta +7 -0
  52. package/Standalone/Editor.meta +8 -0
  53. package/Standalone/Resources/Prefabs/TapLogin/LoginPanel.prefab +811 -0
  54. package/Standalone/Resources/Prefabs/TapLogin/LoginPanel.prefab.meta +8 -0
  55. package/Standalone/Resources/Prefabs/TapLogin/LoginWithPermissionPanel.prefab +820 -0
  56. package/Standalone/Resources/Prefabs/TapLogin/LoginWithPermissionPanel.prefab.meta +8 -0
  57. package/Standalone/Resources/Prefabs/TapLogin/PermissionItem.prefab +314 -0
  58. package/Standalone/Resources/Prefabs/TapLogin/PermissionItem.prefab.meta +7 -0
  59. package/Standalone/Resources/Prefabs/TapLogin/QRCodeContainer.prefab +1501 -0
  60. package/Standalone/Resources/Prefabs/TapLogin/QRCodeContainer.prefab.meta +7 -0
  61. package/Standalone/Resources/Prefabs/TapLogin/Tips.prefab +286 -0
  62. package/Standalone/Resources/Prefabs/TapLogin/Tips.prefab.meta +7 -0
  63. package/Standalone/Resources/Prefabs/TapLogin/TopBar.prefab +485 -0
  64. package/Standalone/Resources/Prefabs/TapLogin/TopBar.prefab.meta +7 -0
  65. package/Standalone/Resources/Prefabs/TapLogin/WebContainer.prefab +514 -0
  66. package/Standalone/Resources/Prefabs/TapLogin/WebContainer.prefab.meta +7 -0
  67. package/Standalone/Resources/Prefabs/TapLogin/WebWithPermissionContainer.prefab +988 -0
  68. package/Standalone/Resources/Prefabs/TapLogin/WebWithPermissionContainer.prefab.meta +7 -0
  69. package/Standalone/Resources/Prefabs/TapLogin.meta +8 -0
  70. package/Standalone/Resources/Prefabs/TapTapSdkWindow.prefab +175 -0
  71. package/Standalone/Resources/Prefabs/TapTapSdkWindow.prefab.meta +8 -0
  72. package/Standalone/Resources/Prefabs.meta +8 -0
  73. package/Standalone/Resources/Sprites/taptap-client-bg.png +0 -0
  74. package/Standalone/Resources/Sprites/taptap-client-bg.png.meta +92 -0
  75. package/Standalone/Resources/Sprites/taptap-divider.png +0 -0
  76. package/Standalone/Resources/Sprites/taptap-divider.png.meta +146 -0
  77. package/Standalone/Resources/Sprites/taptap-login-android-client.png +0 -0
  78. package/Standalone/Resources/Sprites/taptap-login-android-client.png.meta +128 -0
  79. package/Standalone/Resources/Sprites/taptap-login-auth-bg.png +0 -0
  80. package/Standalone/Resources/Sprites/taptap-login-auth-bg.png.meta +128 -0
  81. package/Standalone/Resources/Sprites/taptap-login-auth-checked-v2.png +0 -0
  82. package/Standalone/Resources/Sprites/taptap-login-auth-checked-v2.png.meta +128 -0
  83. package/Standalone/Resources/Sprites/taptap-login-auth-checked.png +0 -0
  84. package/Standalone/Resources/Sprites/taptap-login-auth-checked.png.meta +128 -0
  85. package/Standalone/Resources/Sprites/taptap-login-auth-unchecked.png +0 -0
  86. package/Standalone/Resources/Sprites/taptap-login-auth-unchecked.png.meta +128 -0
  87. package/Standalone/Resources/Sprites/taptap-login-button-bg.png +0 -0
  88. package/Standalone/Resources/Sprites/taptap-login-button-bg.png.meta +128 -0
  89. package/Standalone/Resources/Sprites/taptap-login-confirm-triangle.png +0 -0
  90. package/Standalone/Resources/Sprites/taptap-login-confirm-triangle.png.meta +128 -0
  91. package/Standalone/Resources/Sprites/taptap-login-ios-client.png +0 -0
  92. package/Standalone/Resources/Sprites/taptap-login-ios-client.png.meta +128 -0
  93. package/Standalone/Resources/Sprites/taptap-login-tips-bg.png +0 -0
  94. package/Standalone/Resources/Sprites/taptap-login-tips-bg.png.meta +128 -0
  95. package/Standalone/Resources/Sprites/taptap-logo.png +0 -0
  96. package/Standalone/Resources/Sprites/taptap-logo.png.meta +130 -0
  97. package/Standalone/Resources/Sprites/taptap-scan-tips-bg.png +0 -0
  98. package/Standalone/Resources/Sprites/taptap-scan-tips-bg.png.meta +128 -0
  99. package/Standalone/Resources/Sprites/taptap-scan-tips-error.png +0 -0
  100. package/Standalone/Resources/Sprites/taptap-scan-tips-error.png.meta +128 -0
  101. package/Standalone/Resources/Sprites/taptap-scan-tips-info.png +0 -0
  102. package/Standalone/Resources/Sprites/taptap-scan-tips-info.png.meta +128 -0
  103. package/Standalone/Resources/Sprites/taptap-scan-tips-success.png +0 -0
  104. package/Standalone/Resources/Sprites/taptap-scan-tips-success.png.meta +128 -0
  105. package/Standalone/Resources/Sprites/taptap-scan-tips-warning.png +0 -0
  106. package/Standalone/Resources/Sprites/taptap-scan-tips-warning.png.meta +128 -0
  107. package/Standalone/Resources/Sprites/taptap-sdk-bg.png +0 -0
  108. package/Standalone/Resources/Sprites/taptap-sdk-bg.png.meta +128 -0
  109. package/Standalone/Resources/Sprites/taptap-sdk-cancel.png +0 -0
  110. package/Standalone/Resources/Sprites/taptap-sdk-cancel.png.meta +128 -0
  111. package/Standalone/Resources/Sprites/taptap-sdk-guide.png +0 -0
  112. package/Standalone/Resources/Sprites/taptap-sdk-guide.png.meta +128 -0
  113. package/Standalone/Resources/Sprites/taptap-sdk-logo.png +0 -0
  114. package/Standalone/Resources/Sprites/taptap-sdk-logo.png.meta +128 -0
  115. package/Standalone/Resources/Sprites/taptap-sdk-qrcode-bg-grey.png +0 -0
  116. package/Standalone/Resources/Sprites/taptap-sdk-qrcode-bg-grey.png.meta +128 -0
  117. package/Standalone/Resources/Sprites/taptap-sdk-qrcode-bg.png +0 -0
  118. package/Standalone/Resources/Sprites/taptap-sdk-qrcode-bg.png.meta +128 -0
  119. package/Standalone/Resources/Sprites/taptap-sdk-refresh-btn-bg.png +0 -0
  120. package/Standalone/Resources/Sprites/taptap-sdk-refresh-btn-bg.png.meta +128 -0
  121. package/Standalone/Resources/Sprites/taptap-sdk-refresh.png +0 -0
  122. package/Standalone/Resources/Sprites/taptap-sdk-refresh.png.meta +128 -0
  123. package/Standalone/Resources/Sprites/taptap-tap-log-v2.png +0 -0
  124. package/Standalone/Resources/Sprites/taptap-tap-log-v2.png.meta +128 -0
  125. package/Standalone/Resources/Sprites/taptap-tap-logo.png +0 -0
  126. package/Standalone/Resources/Sprites/taptap-tap-logo.png.meta +128 -0
  127. package/Standalone/Resources/Sprites/taptap-web-login-icon-v2.png +0 -0
  128. package/Standalone/Resources/Sprites/taptap-web-login-icon-v2.png.meta +128 -0
  129. package/Standalone/Resources/Sprites/taptap-web-login-icon.png +0 -0
  130. package/Standalone/Resources/Sprites/taptap-web-login-icon.png.meta +128 -0
  131. package/Standalone/Resources/Sprites/taptap-web-login.png +0 -0
  132. package/Standalone/Resources/Sprites/taptap-web-login.png.meta +146 -0
  133. package/Standalone/Resources/Sprites.meta +8 -0
  134. package/Standalone/Resources.meta +8 -0
  135. package/Standalone/Runtime/Internal/ContainerWindow.cs +67 -0
  136. package/Standalone/Runtime/Internal/ContainerWindow.cs.meta +11 -0
  137. package/Standalone/Runtime/Internal/LoginLanguage.cs +1117 -0
  138. package/Standalone/Runtime/Internal/LoginLanguage.cs.meta +11 -0
  139. package/Standalone/Runtime/Internal/Net.cs +291 -0
  140. package/Standalone/Runtime/Internal/Net.cs.meta +11 -0
  141. package/Standalone/Runtime/Internal/QRCodeWindow.cs +776 -0
  142. package/Standalone/Runtime/Internal/QRCodeWindow.cs.meta +11 -0
  143. package/Standalone/Runtime/Internal/UI.cs +22 -0
  144. package/Standalone/Runtime/Internal/UI.cs.meta +11 -0
  145. package/Standalone/Runtime/Internal/UIAnimator.cs +77 -0
  146. package/Standalone/Runtime/Internal/UIAnimator.cs.meta +11 -0
  147. package/Standalone/Runtime/Internal/UIBase.cs +27 -0
  148. package/Standalone/Runtime/Internal/UIBase.cs.meta +11 -0
  149. package/Standalone/Runtime/Internal/UIElement.cs +185 -0
  150. package/Standalone/Runtime/Internal/UIElement.cs.meta +11 -0
  151. package/Standalone/Runtime/Internal/UIManager.cs +100 -0
  152. package/Standalone/Runtime/Internal/UIManager.cs.meta +11 -0
  153. package/Standalone/Runtime/Internal/WebLoginRequestManager.cs +185 -0
  154. package/Standalone/Runtime/Internal/WebLoginRequestManager.cs.meta +11 -0
  155. package/Standalone/Runtime/Internal.meta +8 -0
  156. package/Standalone/Runtime/Internal2/AccountManager.cs +87 -0
  157. package/Standalone/Runtime/Internal2/AccountManager.cs.meta +3 -0
  158. package/Standalone/Runtime/Internal2/AuthorizationProviderImpl.cs +13 -0
  159. package/Standalone/Runtime/Internal2/AuthorizationProviderImpl.cs.meta +3 -0
  160. package/Standalone/Runtime/Internal2/Http/LoginHttpClient.cs +139 -0
  161. package/Standalone/Runtime/Internal2/Http/LoginHttpClient.cs.meta +11 -0
  162. package/Standalone/Runtime/Internal2/Http/Response/ErrorResponse.cs +16 -0
  163. package/Standalone/Runtime/Internal2/Http/Response/ErrorResponse.cs.meta +11 -0
  164. package/Standalone/Runtime/Internal2/Http/Response/ProfileResponse.cs +28 -0
  165. package/Standalone/Runtime/Internal2/Http/Response/ProfileResponse.cs.meta +11 -0
  166. package/Standalone/Runtime/Internal2/Http/Response/QRCodeResponse.cs +22 -0
  167. package/Standalone/Runtime/Internal2/Http/Response/QRCodeResponse.cs.meta +11 -0
  168. package/Standalone/Runtime/Internal2/Http/Response/TokenResponse.cs +33 -0
  169. package/Standalone/Runtime/Internal2/Http/Response/TokenResponse.cs.meta +11 -0
  170. package/Standalone/Runtime/Internal2/Http/Response.meta +8 -0
  171. package/Standalone/Runtime/Internal2/Http.meta +8 -0
  172. package/Standalone/Runtime/Internal2/LoginService.cs +127 -0
  173. package/Standalone/Runtime/Internal2/LoginService.cs.meta +11 -0
  174. package/Standalone/Runtime/Internal2/QRCodeUtils.cs +50 -0
  175. package/Standalone/Runtime/Internal2/QRCodeUtils.cs.meta +11 -0
  176. package/Standalone/Runtime/Internal2/TapLoginStandaloneImpl.cs +181 -0
  177. package/Standalone/Runtime/Internal2/TapLoginStandaloneImpl.cs.meta +3 -0
  178. package/Standalone/Runtime/Internal2/UI/ClientButtonListener.cs +20 -0
  179. package/Standalone/Runtime/Internal2/UI/ClientButtonListener.cs.meta +11 -0
  180. package/Standalone/Runtime/Internal2/UI/LoginPanelController.cs +72 -0
  181. package/Standalone/Runtime/Internal2/UI/LoginPanelController.cs.meta +11 -0
  182. package/Standalone/Runtime/Internal2/UI/QRCodeController.cs +180 -0
  183. package/Standalone/Runtime/Internal2/UI/QRCodeController.cs.meta +11 -0
  184. package/Standalone/Runtime/Internal2/UI/TitleController.cs +20 -0
  185. package/Standalone/Runtime/Internal2/UI/TitleController.cs.meta +11 -0
  186. package/Standalone/Runtime/Internal2/UI/WebController.cs +125 -0
  187. package/Standalone/Runtime/Internal2/UI/WebController.cs.meta +11 -0
  188. package/Standalone/Runtime/Internal2/UI.meta +8 -0
  189. package/Standalone/Runtime/Internal2.meta +8 -0
  190. package/Standalone/Runtime/Public/IAuthorizationProvider.cs +9 -0
  191. package/Standalone/Runtime/Public/IAuthorizationProvider.cs.meta +3 -0
  192. package/Standalone/Runtime/Public/IComplianceProvider.cs +7 -0
  193. package/Standalone/Runtime/Public/IComplianceProvider.cs.meta +3 -0
  194. package/Standalone/Runtime/Public/TapTapLoginStandalone.cs +38 -0
  195. package/Standalone/Runtime/Public/TapTapLoginStandalone.cs.meta +3 -0
  196. package/Standalone/Runtime/Public.meta +8 -0
  197. package/Standalone/Runtime/TapSDK.Login.Standalone.Runtime.asmdef +24 -0
  198. package/Standalone/Runtime/TapSDK.Login.Standalone.Runtime.asmdef.meta +7 -0
  199. package/Standalone/Runtime.meta +8 -0
  200. package/Standalone.meta +8 -0
  201. package/package.json +11 -0
  202. package/package.json.meta +7 -0
@@ -0,0 +1,181 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.Linq;
4
+ using System.Threading.Tasks;
5
+ using TapSDK.Core;
6
+ using TapSDK.Core.Internal.Utils;
7
+ using TapSDK.Login.Internal.Http;
8
+ using TapSDK.Login.Standalone;
9
+ using UnityEngine;
10
+
11
+ namespace TapSDK.Login.Internal
12
+ {
13
+ public class TapLoginStandaloneImpl
14
+ {
15
+ private static TapLoginStandaloneImpl instance;
16
+
17
+ private TapLoginStandaloneImpl()
18
+ {
19
+
20
+ }
21
+
22
+ public static TapLoginStandaloneImpl Instance
23
+ {
24
+ get
25
+ {
26
+ if (instance == null)
27
+ {
28
+ instance = new TapLoginStandaloneImpl();
29
+ }
30
+ return instance;
31
+ }
32
+ }
33
+
34
+ public void Init(string clientId, TapTapRegionType regionType)
35
+ {
36
+ TapTapSdk.SDKInitialize(clientId, regionType == TapTapRegionType.CN);
37
+ AccountManager.Instance.Init();
38
+ CheckAndRefreshToken();
39
+ }
40
+
41
+ public Task<TapTapAccount> Login(string[] scopes)
42
+ {
43
+ if (!scopes.Contains(TapTapLogin.TAP_LOGIN_SCOPE_PUBLIC_PROFILE))
44
+ {
45
+ scopes = scopes.Append(TapTapLogin.TAP_LOGIN_SCOPE_PUBLIC_PROFILE).ToArray();
46
+ }
47
+ IComplianceProvider provider = BridgeUtils.CreateBridgeImplementation(typeof(IComplianceProvider),
48
+ "TapSDK.Compliance") as IComplianceProvider;
49
+ String complianceScope = provider?.GetAgeRangeScope();
50
+ if (complianceScope != null)
51
+ {
52
+ scopes = scopes.Append(complianceScope).ToArray();
53
+ }
54
+ TaskCompletionSource<TapTapAccount> tcs = new TaskCompletionSource<TapTapAccount>();
55
+ LoginPanelController.OpenParams openParams = new LoginPanelController.OpenParams {
56
+ ClientId = TapTapSdk.ClientId,
57
+ Scopes = scopes,
58
+ OnAuth = async tokenData => {
59
+ if (tokenData == null) {
60
+ tcs.TrySetException(new TapException((int) TapErrorCode.ERROR_CODE_UNDEFINED, "UnKnow Error"));
61
+ } else {
62
+ // 将 TokenData 转化为 AccessToken
63
+ AccessToken refreshToken = new AccessToken {
64
+ kid = tokenData.Kid,
65
+ tokenType = tokenData.TokenType,
66
+ macKey = tokenData.MacKey,
67
+ macAlgorithm = tokenData.MacAlgorithm,
68
+ scopeSet = tokenData.Scopes
69
+ };
70
+ ProfileData profileData = await LoginService.GetProfile(TapTapSdk.ClientId, refreshToken);
71
+ if (profileData != null)
72
+ {
73
+ AccountManager.Instance.Account = new TapTapAccount(
74
+ refreshToken, profileData.OpenId, profileData.UnionId, profileData.Name, profileData.Avatar,
75
+ profileData.Email);
76
+ tcs.TrySetResult(AccountManager.Instance.Account);
77
+ }
78
+ else
79
+ {
80
+ tcs.TrySetException(new TapException((int) TapErrorCode.ERROR_CODE_UNDEFINED, "UnKnow Error"));
81
+ }
82
+ }
83
+ },
84
+ OnError = e => {
85
+ tcs.TrySetException(e);
86
+ },
87
+ OnClose = () => {
88
+ tcs.TrySetException(
89
+ new TapException((int) TapErrorCode.ERROR_CODE_LOGIN_CANCEL, "Login Cancel"));
90
+ }
91
+ };
92
+ TapSDK.UI.UIManager.Instance.OpenUI<LoginPanelController>("Prefabs/TapLogin/LoginPanel", openParams);
93
+ return tcs.Task;
94
+ }
95
+
96
+ public Task<AccessToken> Authorize(string[] scopes = null)
97
+ {
98
+ TaskCompletionSource<AccessToken> tcs = new TaskCompletionSource<AccessToken>();
99
+ LoginPanelController.OpenParams openParams = new LoginPanelController.OpenParams {
100
+ ClientId = TapTapSdk.ClientId,
101
+ Scopes = new HashSet<string>(scopes).ToArray(),
102
+ OnAuth = tokenData => {
103
+ if (tokenData == null) {
104
+ tcs.TrySetException(new TapException((int) TapErrorCode.ERROR_CODE_UNDEFINED, "UnKnow Error"));
105
+ } else {
106
+ // 将 TokenData 转化为 AccessToken
107
+ AccessToken accessToken = new AccessToken {
108
+ kid = tokenData.Kid,
109
+ tokenType = tokenData.TokenType,
110
+ macKey = tokenData.MacKey,
111
+ macAlgorithm = tokenData.MacAlgorithm,
112
+ scopeSet = tokenData.Scopes
113
+ };
114
+ tcs.TrySetResult(accessToken);
115
+ }
116
+ },
117
+ OnError = e => {
118
+ tcs.TrySetException(e);
119
+ },
120
+ OnClose = () => {
121
+ tcs.TrySetException(
122
+ new TapException((int) TapErrorCode.ERROR_CODE_LOGIN_CANCEL, "Login Cancel"));
123
+ }
124
+ };
125
+ TapSDK.UI.UIManager.Instance.OpenUI<LoginPanelController>("Prefabs/TapLogin/LoginPanel", openParams);
126
+ return tcs.Task;
127
+ }
128
+
129
+ public void Logout()
130
+ {
131
+ AccountManager.Instance.ClearCache();
132
+ }
133
+
134
+ public Task<TapTapAccount> GetCurrentAccount()
135
+ {
136
+ var tcs = new TaskCompletionSource<TapTapAccount>();
137
+ tcs.TrySetResult(AccountManager.Instance.Account);
138
+ return tcs.Task;
139
+ }
140
+
141
+ private async Task CheckAndRefreshToken(){
142
+ try
143
+ {
144
+ AccessToken accessToken = AccountManager.Instance.Account?.accessToken;
145
+ if(accessToken != null){
146
+ TokenData tokenData = null;
147
+ try{
148
+ tokenData = await LoginService.RefreshToken(TapTapSdk.ClientId, accessToken.kid);
149
+ }catch(TapException e){
150
+ //清除本地缓存
151
+ if(e.code < 0 ){
152
+ Logout();
153
+ }
154
+ return;
155
+ }
156
+
157
+ if (tokenData == null)
158
+ {
159
+ return;
160
+ }
161
+ AccessToken refreshToken = new AccessToken {
162
+ kid = tokenData.Kid,
163
+ tokenType = tokenData.TokenType,
164
+ macKey = tokenData.MacKey,
165
+ macAlgorithm = tokenData.MacAlgorithm,
166
+ scopeSet = tokenData.Scopes
167
+ };
168
+ ProfileData profileData = await LoginService.GetProfile(TapTapSdk.ClientId, refreshToken);
169
+ if (profileData != null)
170
+ {
171
+ AccountManager.Instance.Account = new TapTapAccount(
172
+ refreshToken, profileData.OpenId, profileData.UnionId, profileData.Name, profileData.Avatar,
173
+ profileData.Email);
174
+ }
175
+ }
176
+ }catch(Exception e){
177
+ Debug.Log("refresh TapToken fail reason : " + e.Message + "\n stack = " + e.StackTrace);
178
+ }
179
+ }
180
+ }
181
+ }
@@ -0,0 +1,3 @@
1
+ fileFormatVersion: 2
2
+ guid: 936985f417854fb7883aadaabd65350a
3
+ timeCreated: 1717472032
@@ -0,0 +1,20 @@
1
+ using System;
2
+ using System.Collections;
3
+ using System.Collections.Generic;
4
+ using UnityEngine;
5
+ using UnityEngine.EventSystems;
6
+
7
+ namespace TapSDK.Login.Internal {
8
+ public class ClientButtonListener : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {
9
+ public Action OnMouseEnter { get; set; }
10
+ public Action OnMouseExit { get; set; }
11
+
12
+ public void OnPointerEnter(PointerEventData eventData) {
13
+ OnMouseEnter?.Invoke();
14
+ }
15
+
16
+ public void OnPointerExit(PointerEventData eventData) {
17
+ OnMouseExit?.Invoke();
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 4c22895152b984269a88e5f572f5c372
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,72 @@
1
+ using UnityEngine;
2
+ using UnityEngine.UI;
3
+ using TapSDK.UI;
4
+ using TapSDK.Login.Internal.Http;
5
+ using System;
6
+ using TapSDK.Core;
7
+
8
+ namespace TapSDK.Login.Internal {
9
+ public class LoginPanelController : BasePanelController {
10
+ public enum Type {
11
+ Auth,
12
+ Login
13
+ }
14
+
15
+ public class OpenParams : AbstractOpenPanelParameter {
16
+ public Type Type { get; set; }
17
+ public string ClientId { get; set; }
18
+ public string[] Scopes { get; set; }
19
+ public Action<TokenData> OnAuth { get; set; }
20
+ public Action<TapException> OnError { get; set; }
21
+ public Action OnClose { get; set; }
22
+ }
23
+
24
+ private TitleController titleController;
25
+ private QRCodeController qrcodeController;
26
+ private WebController webController;
27
+
28
+ protected override void BindComponents() {
29
+ base.BindComponents();
30
+
31
+ Button closeBtn = transform.Find("TopBar/CloseButton").GetComponent<Button>();
32
+ closeBtn.onClick.AddListener(OnCloseClicked);
33
+
34
+ Transform titleTrans = transform.Find("TopBar/Title");
35
+ titleController = new TitleController(titleTrans);
36
+
37
+ Transform qrcodeTrans = transform.Find("QRCode");
38
+ qrcodeController = new QRCodeController(qrcodeTrans, OnAuth);
39
+
40
+ Transform webTrans = transform.Find("Web");
41
+ webController = new WebController(webTrans, OnAuth);
42
+ }
43
+
44
+ protected override void OnLoadSuccess() {
45
+ base.OnLoadSuccess();
46
+
47
+ OpenParams openParams = openParam as OpenParams;
48
+ titleController.Load();
49
+ qrcodeController.Load(openParams.ClientId, openParams.Scopes);
50
+ webController.Load(openParams.ClientId, openParams.Scopes);
51
+ }
52
+
53
+ private void OnDestroy() {
54
+ qrcodeController.Unload();
55
+ webController.Unload();
56
+ }
57
+
58
+ private void OnCloseClicked() {
59
+ Close();
60
+ OpenParams openParams = openParam as OpenParams;
61
+ openParams.OnClose.Invoke();
62
+ }
63
+
64
+ protected void OnAuth(TokenData tokenData) {
65
+ if (tokenData != null) {
66
+ OpenParams openParams = openParam as OpenParams;
67
+ openParams.OnAuth.Invoke(tokenData);
68
+ Close();
69
+ }
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 5793cd5969c3449e39e4f6963703d996
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,180 @@
1
+ using System;
2
+ using System.Threading.Tasks;
3
+ using UnityEngine;
4
+ using UnityEngine.UI;
5
+ using TapSDK.Login.Internal.Http;
6
+ using TapSDK.Core;
7
+ using TapSDK.Core.Internal.Utils;
8
+ using UnityEngine.EventSystems;
9
+
10
+ namespace TapSDK.Login.Internal {
11
+ public class QRCodeController {
12
+ private readonly static string DEMO_IMAGE_CN_HOST = "https://sdk-assets.tds1.tapfiles.cn";
13
+ private readonly static string DEMO_IMAGE_URL_IOS_ZH = $"{DEMO_IMAGE_CN_HOST}/scan-guide/ios.png";
14
+ private readonly static string DEMO_IMAGE_URL_ANDROID_ZH = $"{DEMO_IMAGE_CN_HOST}/scan-guide/android.png";
15
+
16
+ private readonly static string DEMO_IMAGE_IO_HOST = "https://sdk-assets.ap-sg.tdsfiles.com";
17
+ private readonly static string DEMO_IMAGE_URL_IOS_EN = $"{DEMO_IMAGE_IO_HOST}/scan-guide/ios.png";
18
+ private readonly static string DEMO_IMAGE_URL_ANDROID_EN = $"{DEMO_IMAGE_IO_HOST}/scan-guide/android.png";
19
+
20
+ private readonly static string DEFAULT_IOS_CLIENT = "Sprites/taptap-login-ios-client";
21
+ private readonly static string DEFAULT_ANDROID_CLIENT = "Sprites/taptap-login-android-client";
22
+
23
+ private readonly static string AUTH_PENDING = "authorization_pending";
24
+ private readonly static string AUTH_WAITING = "authorization_waiting";
25
+ private readonly static string AUTH_DENIED = "access_denied";
26
+ private readonly static string AUTH_SUCCESS = "";
27
+
28
+ private readonly Action<TokenData> onAuth;
29
+
30
+ private readonly Text titleText;
31
+ private readonly RawImage qrcodeImage;
32
+ private readonly Text tipsText;
33
+ private readonly GameObject scanTips;
34
+ private readonly RawImage demoImage;
35
+
36
+ private readonly Button refreshButton;
37
+
38
+ private bool isRunning;
39
+ private QRCodeData qrcodeData;
40
+
41
+ private string clientId;
42
+ private string[] scopes;
43
+
44
+ public QRCodeController(Transform transform, Action<TokenData> onAuth) {
45
+ this.onAuth = onAuth;
46
+
47
+ titleText = transform.Find("Title").GetComponent<Text>();
48
+ qrcodeImage = transform.Find("QRCode/Image").GetComponent<RawImage>();
49
+ tipsText = transform.Find("Tips").GetComponent<Text>();
50
+
51
+ ClientButtonListener iOSButtonListener = transform.Find("Clients/iOSButton").GetComponent<ClientButtonListener>();
52
+ iOSButtonListener.GetComponent<Button>().onClick.AddListener(() => {
53
+ EventSystem.current.SetSelectedGameObject(null);
54
+ });
55
+ iOSButtonListener.OnMouseEnter = OnShowIOSDemoImage;
56
+ iOSButtonListener.OnMouseExit = OnCloseDemoImage;
57
+ ClientButtonListener androidButtonListener = transform.Find("Clients/AndroidButton").GetComponent<ClientButtonListener>();
58
+ androidButtonListener.OnMouseEnter = OnShowAndroidDemoImage;
59
+ androidButtonListener.OnMouseExit = OnCloseDemoImage;
60
+ androidButtonListener.GetComponent<Button>().onClick.AddListener(() => {
61
+ EventSystem.current.SetSelectedGameObject(null);
62
+ });
63
+
64
+ scanTips = transform.Find("ScanTips").gameObject;
65
+ demoImage = scanTips.transform.Find("DemoImage").GetComponent<RawImage>();
66
+ scanTips.SetActive(false);
67
+
68
+ refreshButton = transform.Find("QRCode/RefreshButton").GetComponent<Button>();
69
+ }
70
+
71
+ public void Load(string clientId, string[] scopes) {
72
+ this.clientId = clientId;
73
+ this.scopes = scopes;
74
+
75
+ ILoginLang lang = LoginLanguage.GetCurrentLang();
76
+ titleText.text = lang.QrTitleLogin();
77
+ tipsText.text = $"{lang.QrNoticeUse()} <b>TapTap</b> {lang.QrNoticeClient()}{lang.QrNoticeScanToLogin()}";
78
+
79
+ // 加载二维码
80
+ _ = RefreshQRCode(clientId, scopes);
81
+ }
82
+
83
+ public void Unload() {
84
+ isRunning = false;
85
+ }
86
+
87
+ private async Task RefreshQRCode(string clientId, string[] scopes) {
88
+ try {
89
+ refreshButton.gameObject.SetActive(false);
90
+ qrcodeData = await LoginService.GetQRCodeUrl(clientId, scopes);
91
+ qrcodeImage.texture = QRCodeUtils.EncodeQrImage(qrcodeData.Url, 320, 320);
92
+
93
+ // 加载二维码完成后再开启监听
94
+ _ = ListenScanQRCode(clientId);
95
+
96
+ await Task.Delay(qrcodeData.ExpiresIn * 1000);
97
+
98
+ // 过期暂停监听
99
+ isRunning = false;
100
+ ShowRefreshQRCode();
101
+ } catch (Exception) {
102
+ // 加载失败
103
+ ShowRefreshQRCode();
104
+ return;
105
+ }
106
+ }
107
+
108
+ private async Task ListenScanQRCode(string clientId) {
109
+ isRunning = true;
110
+ while (isRunning) {
111
+ if (qrcodeData == null) {
112
+ await Task.Delay(3 * 1000);
113
+ } else {
114
+ try {
115
+ TokenData tokenData = await LoginService.RequestScanQRCodeResult(clientId, qrcodeData.DeviceCode);
116
+ onAuth.Invoke(tokenData);
117
+
118
+ return ;
119
+ } catch (TapException e) {
120
+ ILoginLang lang = LoginLanguage.GetCurrentLang();
121
+ if (e.Message == AUTH_PENDING) {
122
+
123
+ } else if (e.Message == AUTH_WAITING) {
124
+ UI.UIManager.Instance.OpenToast(true,
125
+ $"{lang.QrnNoticeSuccess()},{lang.QrnNoticeSuccess2()}",
126
+ icon: UI.UIManager.WhiteToastSuccessIcon);
127
+ } else if (e.Message == AUTH_DENIED) {
128
+ UI.UIManager.Instance.OpenToast(true,
129
+ $"{lang.QrNoticeCancel()},{lang.QrNoticeCancel2()}",
130
+ icon: UI.UIManager.WhiteToastErrorIcon);
131
+ ShowRefreshQRCode();
132
+ }
133
+ await Task.Delay(qrcodeData.Interval * 1000);
134
+ } catch (Exception) {
135
+ await Task.Delay(qrcodeData.Interval * 1000);
136
+ }
137
+ }
138
+ }
139
+ }
140
+
141
+ private void OnShowIOSDemoImage() {
142
+ string url = DEMO_IMAGE_URL_IOS_ZH;
143
+ if (TapTapSDK.tapTapSDKCoreOptions != null && TapTapSDK.tapTapSDKCoreOptions.region == TapTapRegionType.Overseas) {
144
+ url = DEMO_IMAGE_URL_IOS_EN;
145
+ }
146
+ ShowDemoImage(url);
147
+ }
148
+
149
+ private void OnShowAndroidDemoImage() {
150
+ string url = DEMO_IMAGE_URL_ANDROID_ZH;
151
+ if (TapTapSDK.tapTapSDKCoreOptions != null && TapTapSDK.tapTapSDKCoreOptions.region == TapTapRegionType.Overseas) {
152
+ url = DEMO_IMAGE_URL_ANDROID_EN;
153
+ }
154
+ ShowDemoImage(url);
155
+ }
156
+
157
+ private async void ShowDemoImage(string url) {
158
+ demoImage.texture = null;
159
+ scanTips.SetActive(true);
160
+ try {
161
+ demoImage.texture = await ImageUtils.LoadImage(url);
162
+ } catch (Exception) {
163
+ demoImage.texture = null;
164
+ }
165
+ }
166
+
167
+ private void OnCloseDemoImage() {
168
+ scanTips.SetActive(false);
169
+ }
170
+
171
+ private void ShowRefreshQRCode() {
172
+ qrcodeImage.texture = null;
173
+ refreshButton.gameObject.SetActive(true);
174
+ refreshButton.onClick.RemoveAllListeners();
175
+ refreshButton.onClick.AddListener(() => {
176
+ _ = RefreshQRCode(clientId, scopes);
177
+ });
178
+ }
179
+ }
180
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 1dfc9ca200952477aa3fd71f1e608aee
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,20 @@
1
+ using TapSDK.Login.Internal;
2
+ using UnityEngine;
3
+ using UnityEngine.UI;
4
+
5
+ public class TitleController {
6
+ private readonly Text leftText;
7
+ private readonly Text rightText;
8
+
9
+ public TitleController(Transform transform) {
10
+ leftText = transform.Find("LeftText").GetComponent<Text>();
11
+ rightText = transform.Find("RightText").GetComponent<Text>();
12
+ }
13
+
14
+ public void Load() {
15
+ ILoginLang lang = LoginLanguage.GetCurrentLang();
16
+ leftText.text = lang.TitleLogin();
17
+ leftText.gameObject.SetActive(!string.IsNullOrEmpty(leftText.text));
18
+ rightText.gameObject.SetActive(false);
19
+ }
20
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 3929af6c2fe8e4234bca9f0d9c4d1761
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,125 @@
1
+ using System;
2
+ using System.Net;
3
+ using UnityEngine;
4
+ using UnityEngine.UI;
5
+ using TapSDK.Login.Internal.Http;
6
+ using System.Collections.Specialized;
7
+ using TapSDK.Core.Internal.Utils;
8
+
9
+ namespace TapSDK.Login.Internal {
10
+ public class WebController {
11
+ private readonly Action<TokenData> onAuth;
12
+
13
+ private readonly Text titleText;
14
+ private readonly Button jumpButton;
15
+ private readonly Text descriptionText;
16
+
17
+ private HttpListener server;
18
+
19
+ private string clientId;
20
+
21
+ protected string[] scopes;
22
+
23
+ private bool isRunning;
24
+
25
+ public WebController(Transform transform, Action<TokenData> onAuth) {
26
+ this.onAuth = onAuth;
27
+
28
+ titleText = transform.Find("Title").GetComponent<Text>();
29
+ jumpButton = transform.Find("JumpButton").GetComponent<Button>();
30
+ descriptionText = transform.Find("Description").GetComponent<Text>();
31
+
32
+ jumpButton.onClick.AddListener(OnJumpClicked);
33
+ }
34
+
35
+ protected void LoadBasicInfo(string clientId) {
36
+ this.clientId = clientId;
37
+
38
+ ILoginLang lang = LoginLanguage.GetCurrentLang();
39
+ titleText.text = lang.WebLogin();
40
+ Text jumpText = jumpButton.transform.Find("Text").GetComponent<Text>();
41
+ jumpText.text = lang.WebButtonJumpToWeb();
42
+ descriptionText.text = lang.WebNotice();
43
+ }
44
+
45
+ public void Load(string clientId, string[] scopes) {
46
+ LoadBasicInfo(clientId);
47
+ this.scopes = scopes;
48
+ }
49
+
50
+ public void Unload() {
51
+ isRunning = false;
52
+ server?.Stop();
53
+ }
54
+
55
+ protected virtual async void OnJumpClicked() {
56
+ ILoginLang lang = LoginLanguage.GetCurrentLang();
57
+ UI.UIManager.Instance.OpenToast(true,
58
+ lang.WebNoticeLogin(),
59
+ icon: UI.UIManager.WhiteToastInfoIcon);
60
+
61
+ WebLoginRequestManager.Instance.CreateNewLoginRequest(scopes);
62
+
63
+ string url = WebLoginRequestManager.Instance.GetCurrentRequest().GetWebLoginUrl();
64
+ Application.OpenURL(url);
65
+
66
+ // 启动监听
67
+ server = new HttpListener();
68
+ server.Prefixes.Add(WebLoginRequestManager.Instance.GetCurrentRequest().GetRedirectHost());
69
+ server.Start();
70
+
71
+ isRunning = true;
72
+ while (isRunning) {
73
+ try {
74
+ HttpListenerContext context = await server.GetContextAsync();
75
+ Debug.Log($"{context.Request.HttpMethod} {context.Request.Url}");
76
+ context.Response.StatusCode = 200;
77
+ context.Response.Close();
78
+
79
+ if (context.Request.HttpMethod == "OPTIONS") {
80
+ continue;
81
+ }
82
+
83
+ // 检测 url 合法性
84
+ string code = GetRequestCode(context.Request.Url);
85
+ // 判断授权失败
86
+ if (string.IsNullOrEmpty(code)) {
87
+ // 授权失败
88
+ UI.UIManager.Instance.OpenToast(true,
89
+ $"{lang.WebNoticeFail()},{lang.WebNoticeFail2()}",
90
+ icon: UI.UIManager.WhiteToastErrorIcon);
91
+ continue;
92
+ }
93
+
94
+ TokenData tokenData = await LoginService.Authorize(clientId, code);
95
+
96
+ onAuth.Invoke(tokenData);
97
+
98
+ return;
99
+ } catch (Exception) {
100
+ continue;
101
+ }
102
+ }
103
+ }
104
+
105
+ private string GetRequestCode(Uri uri) {
106
+ if (uri == null) {
107
+ return null;
108
+ }
109
+
110
+ if (!uri.LocalPath.Contains(CodeUtil.GetTapTapOAuthPrefix())) {
111
+ return null;
112
+ }
113
+
114
+ NameValueCollection queryPairs = UrlUtils.ParseQueryString(uri.Query);
115
+ string code = queryPairs["code"];
116
+ string state = queryPairs["state"];
117
+ if (string.IsNullOrEmpty(state) || string.IsNullOrEmpty(code)) {
118
+ return null;
119
+ }
120
+
121
+ return state.Equals(WebLoginRequestManager.Instance.GetCurrentRequest().GetState()) ?
122
+ code : null;
123
+ }
124
+ }
125
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: f18f52d63f5de4d4f9886153aa9569a5
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 80e3ca190dcd64d76a8081b617253460
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant:
@@ -0,0 +1,8 @@
1
+ fileFormatVersion: 2
2
+ guid: 29e3eb8ffb62e4d4b938af5d54d0b536
3
+ folderAsset: yes
4
+ DefaultImporter:
5
+ externalObjects: {}
6
+ userData:
7
+ assetBundleName:
8
+ assetBundleVariant: