hm-tracking-sdk 0.1.0

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 (46) hide show
  1. package/README.md +291 -0
  2. package/dist/browser/index.es.js +36247 -0
  3. package/dist/browser/index.umd.js +1245 -0
  4. package/dist/browser.d.ts +1 -0
  5. package/dist/browser.js +8 -0
  6. package/dist/browser.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.js +4 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/sdk/HmTgTrackingSDK.d.ts +68 -0
  11. package/dist/sdk/HmTgTrackingSDK.js +336 -0
  12. package/dist/sdk/HmTgTrackingSDK.js.map +1 -0
  13. package/dist/sdk/HmTrackingSDK.d.ts +68 -0
  14. package/dist/sdk/HmTrackingSDK.js +336 -0
  15. package/dist/sdk/HmTrackingSDK.js.map +1 -0
  16. package/dist/sdk/TgTrackingSDK.d.ts +68 -0
  17. package/dist/sdk/TgTrackingSDK.js +336 -0
  18. package/dist/sdk/TgTrackingSDK.js.map +1 -0
  19. package/dist/sdk/adMonitor.d.ts +13 -0
  20. package/dist/sdk/adMonitor.js +51 -0
  21. package/dist/sdk/adMonitor.js.map +1 -0
  22. package/dist/sdk/api.d.ts +35 -0
  23. package/dist/sdk/api.js +73 -0
  24. package/dist/sdk/api.js.map +1 -0
  25. package/dist/sdk/http.d.ts +16 -0
  26. package/dist/sdk/http.js +43 -0
  27. package/dist/sdk/http.js.map +1 -0
  28. package/dist/sdk/index.d.ts +3 -0
  29. package/dist/sdk/index.js +4 -0
  30. package/dist/sdk/index.js.map +1 -0
  31. package/dist/sdk/monetag.d.ts +29 -0
  32. package/dist/sdk/monetag.js +115 -0
  33. package/dist/sdk/monetag.js.map +1 -0
  34. package/dist/sdk/storage.d.ts +8 -0
  35. package/dist/sdk/storage.js +30 -0
  36. package/dist/sdk/storage.js.map +1 -0
  37. package/dist/sdk/telegram.d.ts +12 -0
  38. package/dist/sdk/telegram.js +139 -0
  39. package/dist/sdk/telegram.js.map +1 -0
  40. package/dist/sdk/tonWalletProvider.d.ts +13 -0
  41. package/dist/sdk/tonWalletProvider.js +142 -0
  42. package/dist/sdk/tonWalletProvider.js.map +1 -0
  43. package/dist/sdk/types.d.ts +212 -0
  44. package/dist/sdk/types.js +7 -0
  45. package/dist/sdk/types.js.map +1 -0
  46. package/package.json +63 -0
@@ -0,0 +1,336 @@
1
+ import { HttpClient, PROD_BASE_URL } from "./http.js";
2
+ import { NamespacedStorage } from "./storage.js";
3
+ import { APIService } from "./api.js";
4
+ import { HmAdManager } from "./monetag.js";
5
+ import { AdMonitor } from "./adMonitor.js";
6
+ import { getTelegramUserUnsafe, isTelegramEnv, getDefaultMockUser, getAnonymousBrowserUser, } from "./telegram.js";
7
+ import WebApp from "@twa-dev/sdk";
8
+ import { DefaultTonWalletProvider } from "./tonWalletProvider.js";
9
+ /**
10
+ * TgTrackingSDK
11
+ * - Telegram 环境自动读取用户信息,否则使用自定义用户
12
+ * - /user/auth 鉴权并缓存 token
13
+ * - 封装广告位配置获取与广告创建/展示
14
+ * - 集成 Monetag (脚本注入 + 展示)
15
+ * - 集成 Telegram 钱包支付(基于商户支付接口)
16
+ */
17
+ export class TgTrackingSDK {
18
+ constructor(options) {
19
+ this.options = options;
20
+ this.token = null;
21
+ this.user = null;
22
+ const opts = this.options || {};
23
+ this.storage = new NamespacedStorage(opts.storageKeyPrefix || "tg_tracking_sdk");
24
+ this.token = this.storage.get("token");
25
+ const baseURL = opts.baseURL || PROD_BASE_URL;
26
+ this.http = new HttpClient({
27
+ getToken: () => this.token,
28
+ onAuthError: () => this.clearAuth(),
29
+ baseURL,
30
+ });
31
+ this.api = new APIService(this.http);
32
+ this.hmAdManager = new HmAdManager({ autoInjectScript: true });
33
+ this.adMonitor = new AdMonitor((params) => this.api.adMonitor(params));
34
+ this.tonWallet = new DefaultTonWalletProvider(this.bindWallet.bind(this));
35
+ }
36
+ async init() {
37
+ const inTelegram = isTelegramEnv();
38
+ try {
39
+ const opts = this.options || {};
40
+ const tgUser = inTelegram ? getTelegramUserUnsafe() : null;
41
+ // 优先级:Telegram 环境用户 > 自定义用户 > 浏览器匿名用户 > mock 用户
42
+ if (tgUser) {
43
+ this.user = tgUser;
44
+ console.log("使用 Telegram 环境用户信息: 成功");
45
+ }
46
+ else if (opts.customUser) {
47
+ this.user = opts.customUser;
48
+ console.log("使用自定义用户信息");
49
+ }
50
+ else if (typeof window !== "undefined") {
51
+ this.user = getAnonymousBrowserUser();
52
+ console.log("使用浏览器匿名用户信息");
53
+ }
54
+ else {
55
+ this.user = getDefaultMockUser();
56
+ console.log("使用默认Mock用户信息");
57
+ }
58
+ if (!this.user) {
59
+ throw new Error("未获取到用户信息:请在非 Telegram 环境提供 customUser");
60
+ }
61
+ // 清理旧 token,开始认证
62
+ this.clearAuth();
63
+ await this.auth();
64
+ try {
65
+ await this.hmAdManager.init();
66
+ }
67
+ catch (error) {
68
+ console.error("广告管理器初始化失败,但继续执行其他初始化:", error);
69
+ }
70
+ }
71
+ catch (error) {
72
+ console.error("SDK初始化失败:", error);
73
+ throw error;
74
+ }
75
+ }
76
+ /**
77
+ * 调用 /user/auth 并持久化 token
78
+ */
79
+ async auth() {
80
+ try {
81
+ const res = await this.api.auth(this.user);
82
+ if (res.code !== 1)
83
+ throw new Error(res.msg || "鉴权失败");
84
+ const token = res.data?.token;
85
+ if (!token)
86
+ throw new Error("鉴权未返回 token");
87
+ this.token = token;
88
+ this.storage.set("token", token);
89
+ }
90
+ catch (error) {
91
+ console.error("auth认证失败:", error);
92
+ throw error;
93
+ }
94
+ }
95
+ /**
96
+ * 清空鉴权状态
97
+ */
98
+ clearAuth() {
99
+ this.token = null;
100
+ this.storage.remove("token");
101
+ }
102
+ /**
103
+ * 支付相关方法调用前校验 Telegram 环境
104
+ */
105
+ ensureTelegramEnvOrThrow() {
106
+ if (!isTelegramEnv()) {
107
+ throw new Error("支付相关功能仅支持在 Telegram 环境内使用");
108
+ }
109
+ }
110
+ /**
111
+ * 获取广告位配置
112
+ */
113
+ async getAdPositionConfig(adPositionName) {
114
+ const res = await this.api.getAdPositionConfig(String(adPositionName));
115
+ if (res.code !== 1)
116
+ throw new Error(res.msg || "获取广告位配置失败");
117
+ return res.data || [];
118
+ }
119
+ /**
120
+ * 创建广告
121
+ */
122
+ async createAd(params) {
123
+ const res = await this.api.createAd(params);
124
+ if (res.code !== 1)
125
+ throw new Error(res.msg || "创建广告失败");
126
+ const data = res.data;
127
+ if (data?.spaceId) {
128
+ await this.hmAdManager.setSpace(String(data.spaceId));
129
+ }
130
+ return data;
131
+ }
132
+ /**
133
+ * 展示广告(插屏/激励)传入 adPositionName,SDK 将自动完成:获取配置 -> 创建广告 -> 展示
134
+ * - 自动调用监测 URL(第一个链接走 /v2/ad/monitor,其余直接 GET)
135
+ */
136
+ async showHmAdByPosition(adPositionName) {
137
+ const configs = await this.getAdPositionConfig(adPositionName);
138
+ if (!configs || configs.length === 0) {
139
+ throw new Error("未找到广告位配置");
140
+ }
141
+ const cfg = configs[0];
142
+ const ad = await this.createAd({
143
+ adId: cfg.adId,
144
+ adPositionId: cfg.adPositionId,
145
+ });
146
+ const monitor = {
147
+ start: ad.start,
148
+ show: ad.show,
149
+ error: ad.error,
150
+ close: ad.close,
151
+ reward: ad.reward,
152
+ };
153
+ await this.showHmAdWithMonitor(monitor, ad.adShowId);
154
+ }
155
+ async showHmAdWithMonitor(monitor, adShowId) {
156
+ const id = adShowId || "";
157
+ await this.adMonitor.send(monitor.start, id);
158
+ await this.adMonitor.send(monitor.show, id);
159
+ try {
160
+ await this.hmAdManager.show();
161
+ await this.adMonitor.send(monitor.close, id);
162
+ await this.adMonitor.send(monitor.reward, id);
163
+ }
164
+ catch (e) {
165
+ await this.adMonitor.send(monitor.error, id);
166
+ throw e;
167
+ }
168
+ }
169
+ async showHmPopupAd(monitor, adShowId) {
170
+ const id = adShowId || "";
171
+ await this.adMonitor.send(monitor.start, id);
172
+ await this.adMonitor.send(monitor.show, id);
173
+ try {
174
+ await this.hmAdManager.showPopup();
175
+ await this.adMonitor.send(monitor.close, id);
176
+ await this.adMonitor.send(monitor.reward, id);
177
+ }
178
+ catch (e) {
179
+ await this.adMonitor.send(monitor.error, id);
180
+ throw e;
181
+ }
182
+ }
183
+ async showHmInAppAd(monitor, inAppOptions, adShowId) {
184
+ const id = adShowId || "";
185
+ await this.adMonitor.send(monitor.start, id);
186
+ await this.adMonitor.send(monitor.show, id);
187
+ try {
188
+ await this.hmAdManager.showInApp(inAppOptions);
189
+ await this.adMonitor.send(monitor.close, id);
190
+ await this.adMonitor.send(monitor.reward, id);
191
+ }
192
+ catch (e) {
193
+ await this.adMonitor.send(monitor.error, id);
194
+ throw e;
195
+ }
196
+ }
197
+ /**
198
+ * 绑定钱包地址到服务器
199
+ */
200
+ async bindWallet(walletAddress) {
201
+ try {
202
+ const res = await this.api.bindWalletReq({
203
+ wallet: walletAddress,
204
+ forceBind: true,
205
+ });
206
+ if (res.code !== 1) {
207
+ console.warn("钱包地址绑定失败:", res.msg);
208
+ return;
209
+ }
210
+ }
211
+ catch (error) {
212
+ console.error("钱包地址绑定请求失败:", error);
213
+ throw error;
214
+ }
215
+ }
216
+ async disconnectWallet() {
217
+ try {
218
+ if (!this.tonWallet)
219
+ return;
220
+ await this.tonWallet.disconnect();
221
+ }
222
+ catch (e) {
223
+ console.error("断开 Ton 钱包失败:", e);
224
+ }
225
+ }
226
+ async connectWallet() {
227
+ if (!this.tonWallet)
228
+ return false;
229
+ return await this.tonWallet.connect();
230
+ }
231
+ isWalletConnected() {
232
+ return !!this.tonWallet?.isConnected();
233
+ }
234
+ async ensureWalletConnected() {
235
+ this.ensureTelegramEnvOrThrow();
236
+ if (!this.tonWallet)
237
+ return false;
238
+ return await this.tonWallet.connect();
239
+ }
240
+ async getSupportedPayModes() {
241
+ const res = await this.api.merchantPayModeList();
242
+ if (res.code !== 1)
243
+ throw new Error(res.msg || "获取支付方式失败");
244
+ const raw = res.data;
245
+ if (Array.isArray(raw)) {
246
+ return { payModeList: raw };
247
+ }
248
+ const list = Array.isArray(raw?.payModeList) ? raw.payModeList : [];
249
+ return { payModeList: list };
250
+ }
251
+ async merchantPayQueryResult(data) {
252
+ const res = await this.api.merchantPayQueryResult(data);
253
+ if (res.code !== 1)
254
+ throw new Error(res.msg || "查询支付结果失败");
255
+ return res.data;
256
+ }
257
+ /**
258
+ * 通用支付完成回调
259
+ * @param orderSn 订单号
260
+ * @param status 支付状态 success/failed/cancelled
261
+ * @param transferHash 交易哈希(可选)
262
+ */
263
+ async finishPayment(orderSn, status, transferHash = "") {
264
+ const finishPayload = {
265
+ orderSn,
266
+ status,
267
+ transferHash,
268
+ };
269
+ const finishRes = await this.api.merchantPayFinish(finishPayload);
270
+ if (finishRes.code !== 1) {
271
+ throw new Error(finishRes.msg || "支付完成回调失败");
272
+ }
273
+ return finishRes.data;
274
+ }
275
+ async payByMerchant(data) {
276
+ this.ensureTelegramEnvOrThrow();
277
+ const upperCurrency = data.currencyName?.toUpperCase();
278
+ const createRes = await this.api.merchantPayCreate(data);
279
+ if (createRes.code !== 1)
280
+ throw new Error(createRes.msg || "创建支付订单失败");
281
+ const order = createRes.data;
282
+ // Stars 支付:无需连接钱包,直接拉起发票(若 payUrl 存在)
283
+ if (upperCurrency === "STARS" && order.payUrl) {
284
+ try {
285
+ await new Promise((resolve, reject) => {
286
+ WebApp.openInvoice(order.payUrl, (status) => {
287
+ // status 可能是 "paid", "cancelled", "failed" 等
288
+ if (status === "paid") {
289
+ resolve();
290
+ }
291
+ else {
292
+ reject(new Error(`星币支付未完成: ${status || "未知状态"}`));
293
+ }
294
+ });
295
+ });
296
+ // 星币支付成功后调用支付完成回调并返回结果
297
+ const finishRes = await this.finishPayment(order.orderSn, "success");
298
+ return finishRes;
299
+ }
300
+ catch (error) {
301
+ // 支付失败或取消
302
+ const finishRes = await this.finishPayment(order.orderSn, "failed");
303
+ return finishRes;
304
+ }
305
+ }
306
+ // 其他币种需已连接钱包(仅判断连接状态,不主动连接或上报)
307
+ if (!this.tonWallet || !this.tonWallet.isConnected()) {
308
+ throw new Error("请先连接钱包");
309
+ }
310
+ const msg = order.transferData?.messages?.[0];
311
+ if (!msg)
312
+ throw new Error("订单未返回链上消息");
313
+ let result;
314
+ try {
315
+ if (upperCurrency === "TON") {
316
+ result = await this.tonWallet.sendTonTransaction(order.transferData);
317
+ }
318
+ else if (upperCurrency === "USDT") {
319
+ result = await this.tonWallet.sendUsdtTransaction(order.transferData);
320
+ }
321
+ else {
322
+ // 其他币种暂不处理
323
+ throw new Error("暂不支持的币种");
324
+ }
325
+ const transferHash = result?.transferHash;
326
+ const finishRes = await this.finishPayment(order.orderSn, "success", transferHash || "");
327
+ return finishRes;
328
+ }
329
+ catch (error) {
330
+ // 支付失败或取消
331
+ const finishRes = await this.finishPayment(order.orderSn, "failed");
332
+ return finishRes;
333
+ }
334
+ }
335
+ }
336
+ //# sourceMappingURL=TgTrackingSDK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TgTrackingSDK.js","sourceRoot":"","sources":["../../src/sdk/TgTrackingSDK.ts"],"names":[],"mappings":"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","sourcesContent":["import { HttpClient, PROD_BASE_URL } from \"./http.js\";\r\nimport { NamespacedStorage } from \"./storage.js\";\r\nimport { APIService } from \"./api.js\";\r\nimport { HmAdManager } from \"./monetag.js\";\r\nimport { AdMonitor } from \"./adMonitor.js\";\r\nimport {\r\n SDKInitOptions,\r\n TelegramUserInfo,\r\n AdPositionName,\r\n AdConfigItem,\r\n CreateAdParams,\r\n AdResponseData,\r\n MonitorUrls,\r\n MerchantPayCreateRequest,\r\n MerchantPayCreateResponseData,\r\n MerchantPayFinishRequest,\r\n MerchantPayModeListData,\r\n TonWalletProvider,\r\n MerchantPayFinishResponseData,\r\n MerchantPayQueryResultRequest,\r\n MerchantPayQueryResultResponseData,\r\n} from \"./types.js\";\r\nimport {\r\n getTelegramUserUnsafe,\r\n isTelegramEnv,\r\n getDefaultMockUser,\r\n getAnonymousBrowserUser,\r\n} from \"./telegram.js\";\r\nimport WebApp from \"@twa-dev/sdk\";\r\nimport { DefaultTonWalletProvider } from \"./tonWalletProvider.js\";\r\n\r\n/**\r\n * TgTrackingSDK\r\n * - Telegram 环境自动读取用户信息,否则使用自定义用户\r\n * - /user/auth 鉴权并缓存 token\r\n * - 封装广告位配置获取与广告创建/展示\r\n * - 集成 Monetag (脚本注入 + 展示)\r\n * - 集成 Telegram 钱包支付(基于商户支付接口)\r\n */\r\nexport class TgTrackingSDK {\r\n private storage: NamespacedStorage;\r\n private http: HttpClient;\r\n private api: APIService;\r\n private token: string | null = null;\r\n private user: TelegramUserInfo | null = null;\r\n private hmAdManager: HmAdManager;\r\n private adMonitor: AdMonitor;\r\n private tonWallet?: TonWalletProvider;\r\n\r\n constructor(private options?: SDKInitOptions) {\r\n const opts = this.options || {};\r\n this.storage = new NamespacedStorage(\r\n opts.storageKeyPrefix || \"tg_tracking_sdk\"\r\n );\r\n this.token = this.storage.get<string>(\"token\");\r\n\r\n const baseURL = opts.baseURL || PROD_BASE_URL;\r\n this.http = new HttpClient({\r\n getToken: () => this.token,\r\n onAuthError: () => this.clearAuth(),\r\n baseURL,\r\n });\r\n this.api = new APIService(this.http);\r\n this.hmAdManager = new HmAdManager({ autoInjectScript: true });\r\n this.adMonitor = new AdMonitor((params) => this.api.adMonitor(params));\r\n this.tonWallet = new DefaultTonWalletProvider(this.bindWallet.bind(this));\r\n }\r\n\r\n async init(): Promise<void> {\r\n const inTelegram = isTelegramEnv();\r\n\r\n try {\r\n const opts = this.options || {};\r\n const tgUser = inTelegram ? getTelegramUserUnsafe() : null;\r\n // 优先级:Telegram 环境用户 > 自定义用户 > 浏览器匿名用户 > mock 用户\r\n if (tgUser) {\r\n this.user = tgUser;\r\n console.log(\"使用 Telegram 环境用户信息: 成功\");\r\n } else if (opts.customUser) {\r\n this.user = opts.customUser;\r\n console.log(\"使用自定义用户信息\");\r\n } else if (typeof window !== \"undefined\") {\r\n this.user = getAnonymousBrowserUser();\r\n console.log(\"使用浏览器匿名用户信息\");\r\n } else {\r\n this.user = getDefaultMockUser();\r\n console.log(\"使用默认Mock用户信息\");\r\n }\r\n\r\n if (!this.user) {\r\n throw new Error(\r\n \"未获取到用户信息:请在非 Telegram 环境提供 customUser\"\r\n );\r\n }\r\n\r\n // 清理旧 token,开始认证\r\n this.clearAuth();\r\n await this.auth();\r\n\r\n try {\r\n await this.hmAdManager.init();\r\n } catch (error) {\r\n console.error(\"广告管理器初始化失败,但继续执行其他初始化:\", error);\r\n }\r\n } catch (error) {\r\n console.error(\"SDK初始化失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 调用 /user/auth 并持久化 token\r\n */\r\n private async auth(): Promise<void> {\r\n try {\r\n const res = await this.api.auth(this.user as Record<string, unknown>);\r\n if (res.code !== 1) throw new Error(res.msg || \"鉴权失败\");\r\n const token = (res.data as any)?.token as string | undefined;\r\n if (!token) throw new Error(\"鉴权未返回 token\");\r\n this.token = token;\r\n this.storage.set(\"token\", token);\r\n } catch (error) {\r\n console.error(\"auth认证失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 清空鉴权状态\r\n */\r\n private clearAuth() {\r\n this.token = null;\r\n this.storage.remove(\"token\");\r\n }\r\n\r\n /**\r\n * 支付相关方法调用前校验 Telegram 环境\r\n */\r\n private ensureTelegramEnvOrThrow() {\r\n if (!isTelegramEnv()) {\r\n throw new Error(\"支付相关功能仅支持在 Telegram 环境内使用\");\r\n }\r\n }\r\n\r\n /**\r\n * 获取广告位配置\r\n */\r\n private async getAdPositionConfig(\r\n adPositionName: AdPositionName | string\r\n ): Promise<AdConfigItem[]> {\r\n const res = await this.api.getAdPositionConfig(String(adPositionName));\r\n if (res.code !== 1) throw new Error(res.msg || \"获取广告位配置失败\");\r\n return res.data || [];\r\n }\r\n\r\n /**\r\n * 创建广告\r\n */\r\n private async createAd(params: CreateAdParams): Promise<AdResponseData> {\r\n const res = await this.api.createAd(params);\r\n if (res.code !== 1) throw new Error(res.msg || \"创建广告失败\");\r\n const data = res.data as AdResponseData;\r\n\r\n if (data?.spaceId) {\r\n await this.hmAdManager.setSpace(String(data.spaceId));\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /**\r\n * 展示广告(插屏/激励)传入 adPositionName,SDK 将自动完成:获取配置 -> 创建广告 -> 展示\r\n * - 自动调用监测 URL(第一个链接走 /v2/ad/monitor,其余直接 GET)\r\n */\r\n async showHmAdByPosition(\r\n adPositionName: AdPositionName | string\r\n ): Promise<void> {\r\n const configs = await this.getAdPositionConfig(adPositionName);\r\n if (!configs || configs.length === 0) {\r\n throw new Error(\"未找到广告位配置\");\r\n }\r\n const cfg = configs[0];\r\n const ad = await this.createAd({\r\n adId: cfg.adId,\r\n adPositionId: cfg.adPositionId,\r\n });\r\n const monitor: MonitorUrls = {\r\n start: ad.start,\r\n show: ad.show,\r\n error: ad.error,\r\n close: ad.close,\r\n reward: ad.reward,\r\n };\r\n await this.showHmAdWithMonitor(monitor, ad.adShowId);\r\n }\r\n\r\n private async showHmAdWithMonitor(\r\n monitor: MonitorUrls,\r\n adShowId?: string\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.show();\r\n await this.adMonitor.send(monitor.close, id);\r\n await this.adMonitor.send(monitor.reward, id);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n throw e;\r\n }\r\n }\r\n\r\n async showHmPopupAd(monitor: MonitorUrls, adShowId?: string): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.showPopup();\r\n await this.adMonitor.send(monitor.close, id);\r\n await this.adMonitor.send(monitor.reward, id);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n throw e;\r\n }\r\n }\r\n\r\n async showHmInAppAd(\r\n monitor: MonitorUrls,\r\n inAppOptions?: any,\r\n adShowId?: string\r\n ): Promise<void> {\r\n const id = adShowId || \"\";\r\n await this.adMonitor.send(monitor.start, id);\r\n await this.adMonitor.send(monitor.show, id);\r\n try {\r\n await this.hmAdManager.showInApp(inAppOptions);\r\n await this.adMonitor.send(monitor.close, id);\r\n await this.adMonitor.send(monitor.reward, id);\r\n } catch (e) {\r\n await this.adMonitor.send(monitor.error, id);\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * 绑定钱包地址到服务器\r\n */\r\n private async bindWallet(walletAddress: string): Promise<void> {\r\n try {\r\n const res = await this.api.bindWalletReq({\r\n wallet: walletAddress,\r\n forceBind: true,\r\n });\r\n if (res.code !== 1) {\r\n console.warn(\"钱包地址绑定失败:\", res.msg);\r\n return;\r\n }\r\n } catch (error) {\r\n console.error(\"钱包地址绑定请求失败:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnectWallet(): Promise<void> {\r\n try {\r\n if (!this.tonWallet) return;\r\n await this.tonWallet.disconnect();\r\n } catch (e) {\r\n console.error(\"断开 Ton 钱包失败:\", e);\r\n }\r\n }\r\n\r\n async connectWallet(): Promise<boolean> {\r\n if (!this.tonWallet) return false;\r\n return await this.tonWallet.connect();\r\n }\r\n\r\n isWalletConnected(): boolean {\r\n return !!this.tonWallet?.isConnected();\r\n }\r\n\r\n async ensureWalletConnected(): Promise<boolean> {\r\n this.ensureTelegramEnvOrThrow();\r\n if (!this.tonWallet) return false;\r\n return await this.tonWallet.connect();\r\n }\r\n\r\n async getSupportedPayModes(): Promise<MerchantPayModeListData> {\r\n const res = await this.api.merchantPayModeList();\r\n if (res.code !== 1) throw new Error(res.msg || \"获取支付方式失败\");\r\n const raw: any = res.data as any;\r\n if (Array.isArray(raw)) {\r\n return { payModeList: raw };\r\n }\r\n const list = Array.isArray(raw?.payModeList) ? raw.payModeList : [];\r\n return { payModeList: list };\r\n }\r\n\r\n async merchantPayQueryResult(\r\n data: MerchantPayQueryResultRequest\r\n ): Promise<MerchantPayQueryResultResponseData> {\r\n const res = await this.api.merchantPayQueryResult(data);\r\n if (res.code !== 1) throw new Error(res.msg || \"查询支付结果失败\");\r\n return res.data;\r\n }\r\n\r\n /**\r\n * 通用支付完成回调\r\n * @param orderSn 订单号\r\n * @param status 支付状态 success/failed/cancelled\r\n * @param transferHash 交易哈希(可选)\r\n */\r\n private async finishPayment(\r\n orderSn: string,\r\n status: string,\r\n transferHash: string = \"\"\r\n ): Promise<MerchantPayFinishResponseData> {\r\n const finishPayload: MerchantPayFinishRequest = {\r\n orderSn,\r\n status,\r\n transferHash,\r\n };\r\n const finishRes = await this.api.merchantPayFinish(finishPayload);\r\n if (finishRes.code !== 1) {\r\n throw new Error(finishRes.msg || \"支付完成回调失败\");\r\n }\r\n return finishRes.data;\r\n }\r\n\r\n async payByMerchant(\r\n data: MerchantPayCreateRequest\r\n ): Promise<MerchantPayFinishResponseData> {\r\n this.ensureTelegramEnvOrThrow();\r\n const upperCurrency = data.currencyName?.toUpperCase();\r\n const createRes = await this.api.merchantPayCreate(data);\r\n if (createRes.code !== 1)\r\n throw new Error(createRes.msg || \"创建支付订单失败\");\r\n const order = createRes.data;\r\n\r\n // Stars 支付:无需连接钱包,直接拉起发票(若 payUrl 存在)\r\n if (upperCurrency === \"STARS\" && order.payUrl) {\r\n try {\r\n await new Promise<void>((resolve, reject) => {\r\n WebApp.openInvoice(order.payUrl as any, (status) => {\r\n // status 可能是 \"paid\", \"cancelled\", \"failed\" 等\r\n if (status === \"paid\") {\r\n resolve();\r\n } else {\r\n reject(new Error(`星币支付未完成: ${status || \"未知状态\"}`));\r\n }\r\n });\r\n });\r\n // 星币支付成功后调用支付完成回调并返回结果\r\n const finishRes = await this.finishPayment(order.orderSn, \"success\");\r\n return finishRes;\r\n } catch (error) {\r\n // 支付失败或取消\r\n const finishRes = await this.finishPayment(order.orderSn, \"failed\");\r\n return finishRes;\r\n }\r\n }\r\n\r\n // 其他币种需已连接钱包(仅判断连接状态,不主动连接或上报)\r\n if (!this.tonWallet || !this.tonWallet.isConnected()) {\r\n throw new Error(\"请先连接钱包\");\r\n }\r\n const msg = order.transferData?.messages?.[0];\r\n if (!msg) throw new Error(\"订单未返回链上消息\");\r\n\r\n let result;\r\n try {\r\n if (upperCurrency === \"TON\") {\r\n result = await this.tonWallet.sendTonTransaction(order.transferData);\r\n } else if (upperCurrency === \"USDT\") {\r\n result = await this.tonWallet.sendUsdtTransaction(order.transferData);\r\n } else {\r\n // 其他币种暂不处理\r\n throw new Error(\"暂不支持的币种\");\r\n }\r\n\r\n const transferHash = (result as any)?.transferHash;\r\n const finishRes = await this.finishPayment(\r\n order.orderSn,\r\n \"success\",\r\n transferHash || \"\"\r\n );\r\n return finishRes;\r\n } catch (error) {\r\n // 支付失败或取消\r\n const finishRes = await this.finishPayment(order.orderSn, \"failed\");\r\n return finishRes;\r\n }\r\n }\r\n}\r\n"]}
@@ -0,0 +1,13 @@
1
+ export interface MonitorParams {
2
+ param: string;
3
+ request_code: string;
4
+ timestamp: string;
5
+ }
6
+ export declare class AdMonitor {
7
+ private getMonitor?;
8
+ constructor(getMonitor?: ((params: MonitorParams) => Promise<any>) | undefined);
9
+ extractParamsFromUrl(url?: string): {
10
+ param: string;
11
+ } | null;
12
+ send(urlOrUrls: string | string[] | undefined, adShowId: string): Promise<any>;
13
+ }
@@ -0,0 +1,51 @@
1
+ import CryptoJS from "crypto-js";
2
+ export class AdMonitor {
3
+ constructor(getMonitor) {
4
+ this.getMonitor = getMonitor;
5
+ }
6
+ extractParamsFromUrl(url) {
7
+ if (!url)
8
+ return null;
9
+ try {
10
+ const urlObj = new URL(url);
11
+ const param = urlObj.searchParams.get("param") || "";
12
+ return { param };
13
+ }
14
+ catch (_) {
15
+ return null;
16
+ }
17
+ }
18
+ async send(urlOrUrls, adShowId) {
19
+ if (!urlOrUrls)
20
+ return;
21
+ const urls = Array.isArray(urlOrUrls) ? urlOrUrls : [urlOrUrls];
22
+ if (urls.length === 0)
23
+ return;
24
+ const first = urls[0];
25
+ const extracted = this.extractParamsFromUrl(first);
26
+ let resp = undefined;
27
+ if (extracted && this.getMonitor) {
28
+ try {
29
+ const timestamp = Math.floor(Date.now() / 1000).toString();
30
+ const request_code = CryptoJS.MD5(adShowId + timestamp).toString();
31
+ const params = {
32
+ param: extracted.param,
33
+ request_code,
34
+ timestamp,
35
+ };
36
+ resp = await this.getMonitor(params);
37
+ }
38
+ catch (_) { }
39
+ }
40
+ await Promise.allSettled(urls.slice(1).map((u) => {
41
+ try {
42
+ return fetch(u, { method: "GET" });
43
+ }
44
+ catch (_) {
45
+ return Promise.resolve();
46
+ }
47
+ }));
48
+ return resp;
49
+ }
50
+ }
51
+ //# sourceMappingURL=adMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adMonitor.js","sourceRoot":"","sources":["../../src/sdk/adMonitor.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAQjC,MAAM,OAAO,SAAS;IACpB,YAAoB,UAAoD;QAApD,eAAU,GAAV,UAAU,CAA0C;IAAG,CAAC;IAE5E,oBAAoB,CAAC,GAAY;QAC/B,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACrD,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,SAAwC,EACxC,QAAgB;QAEhB,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,IAAI,GAAQ,SAAS,CAAC;QAC1B,IAAI,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAC3D,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;gBACnE,MAAM,MAAM,GAAkB;oBAC5B,KAAK,EAAE,SAAS,CAAC,KAAK;oBACtB,YAAY;oBACZ,SAAS;iBACV,CAAC;gBACF,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC,CAAA,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC;gBACH,OAAO,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import CryptoJS from \"crypto-js\";\r\n\r\nexport interface MonitorParams {\r\n param: string;\r\n request_code: string;\r\n timestamp: string;\r\n}\r\n\r\nexport class AdMonitor {\r\n constructor(private getMonitor?: (params: MonitorParams) => Promise<any>) {}\r\n\r\n extractParamsFromUrl(url?: string): { param: string } | null {\r\n if (!url) return null;\r\n try {\r\n const urlObj = new URL(url);\r\n const param = urlObj.searchParams.get(\"param\") || \"\";\r\n return { param };\r\n } catch (_) {\r\n return null;\r\n }\r\n }\r\n\r\n async send(\r\n urlOrUrls: string | string[] | undefined,\r\n adShowId: string\r\n ): Promise<any> {\r\n if (!urlOrUrls) return;\r\n const urls = Array.isArray(urlOrUrls) ? urlOrUrls : [urlOrUrls];\r\n if (urls.length === 0) return;\r\n\r\n const first = urls[0];\r\n const extracted = this.extractParamsFromUrl(first);\r\n let resp: any = undefined;\r\n if (extracted && this.getMonitor) {\r\n try {\r\n const timestamp = Math.floor(Date.now() / 1000).toString();\r\n const request_code = CryptoJS.MD5(adShowId + timestamp).toString();\r\n const params: MonitorParams = {\r\n param: extracted.param,\r\n request_code,\r\n timestamp,\r\n };\r\n resp = await this.getMonitor(params);\r\n } catch (_) {}\r\n }\r\n\r\n await Promise.allSettled(\r\n urls.slice(1).map((u) => {\r\n try {\r\n return fetch(u, { method: \"GET\" });\r\n } catch (_) {\r\n return Promise.resolve();\r\n }\r\n })\r\n );\r\n\r\n return resp;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,35 @@
1
+ import { HttpClient } from "./http.js";
2
+ import type { APIResponse, AuthResponseData, CreateAdParams, AdResponseData, AdConfigItem, MerchantPayModeListData, MerchantPayCreateRequest, MerchantPayCreateResponseData, MerchantPayFinishRequest, MerchantPayQueryResultRequest, MerchantPayNotifyRequest, BindWalletReq, BindWalletResponseData } from "./types.js";
3
+ export declare class APIService {
4
+ private http;
5
+ constructor(http: HttpClient);
6
+ auth(user: Record<string, unknown>): Promise<APIResponse<AuthResponseData>>;
7
+ getAdPositionConfig(adPositionName: string): Promise<APIResponse<AdConfigItem[]>>;
8
+ createAd(params: CreateAdParams): Promise<APIResponse<AdResponseData>>;
9
+ adMonitor(params: {
10
+ param: string;
11
+ request_code: string;
12
+ timestamp: string;
13
+ }): Promise<APIResponse<unknown>>;
14
+ bindWalletReq(data: BindWalletReq): Promise<APIResponse<BindWalletResponseData>>;
15
+ /**
16
+ * 商户支付:获取支付方式
17
+ */
18
+ merchantPayModeList(): Promise<APIResponse<MerchantPayModeListData>>;
19
+ /**
20
+ * 商户支付:创建支付订单
21
+ */
22
+ merchantPayCreate(data: MerchantPayCreateRequest): Promise<APIResponse<MerchantPayCreateResponseData>>;
23
+ /**
24
+ * 商户支付:完成支付回调
25
+ */
26
+ merchantPayFinish(data: MerchantPayFinishRequest): Promise<APIResponse<import("./types.js").MerchantPayOrderBase>>;
27
+ /**
28
+ * 商户支付:查询支付订单结果
29
+ */
30
+ merchantPayQueryResult(data: MerchantPayQueryResultRequest): Promise<APIResponse<import("./types.js").MerchantPayOrderBase>>;
31
+ /**
32
+ * 商户支付:支付完成通知结果
33
+ */
34
+ merchantPayNotify(data: MerchantPayNotifyRequest): Promise<APIResponse<Record<string, unknown>>>;
35
+ }
@@ -0,0 +1,73 @@
1
+ export class APIService {
2
+ constructor(http) {
3
+ this.http = http;
4
+ }
5
+ auth(user) {
6
+ return this.http
7
+ .post("/api/user/auth", user)
8
+ .then((r) => r.data);
9
+ }
10
+ getAdPositionConfig(adPositionName) {
11
+ return this.http
12
+ .post("/api/ad/adPositionDisplayAd", {
13
+ adPositionName,
14
+ })
15
+ .then((r) => r.data);
16
+ }
17
+ createAd(params) {
18
+ return this.http
19
+ .post("/api/v2/ad/create", params)
20
+ .then((r) => r.data);
21
+ }
22
+ adMonitor(params) {
23
+ return this.http
24
+ .get("/api/v2/ad/monitor", { params })
25
+ .then((r) => r.data);
26
+ }
27
+ bindWalletReq(data) {
28
+ return this.http
29
+ .post("/api/user/bindWallet", data)
30
+ .then((r) => r.data);
31
+ }
32
+ /**
33
+ * 商户支付:获取支付方式
34
+ */
35
+ merchantPayModeList() {
36
+ return this.http
37
+ .get("/api/v2/merchant/pay/modeList")
38
+ .then((r) => r.data);
39
+ }
40
+ /**
41
+ * 商户支付:创建支付订单
42
+ */
43
+ merchantPayCreate(data) {
44
+ return this.http
45
+ .post("/api/v2/merchant/pay/create", data)
46
+ .then((r) => r.data);
47
+ }
48
+ /**
49
+ * 商户支付:完成支付回调
50
+ */
51
+ merchantPayFinish(data) {
52
+ return this.http
53
+ .post("/api/v2/merchant/pay/finish", data)
54
+ .then((r) => r.data);
55
+ }
56
+ /**
57
+ * 商户支付:查询支付订单结果
58
+ */
59
+ merchantPayQueryResult(data) {
60
+ return this.http
61
+ .post("/api/v2/merchant/pay/queryResult", data)
62
+ .then((r) => r.data);
63
+ }
64
+ /**
65
+ * 商户支付:支付完成通知结果
66
+ */
67
+ merchantPayNotify(data) {
68
+ return this.http
69
+ .post("/api/v2/merchant/pay/notify", data)
70
+ .then((r) => r.data);
71
+ }
72
+ }
73
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/sdk/api.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAO,UAAU;IACrB,YAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAG,CAAC;IAExC,IAAI,CAAC,IAA6B;QAChC,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAAgC,gBAAgB,EAAE,IAAI,CAAC;aAC3D,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,mBAAmB,CAAC,cAAsB;QACxC,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAA8B,6BAA6B,EAAE;YAChE,cAAc;SACf,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,MAAsB;QAC7B,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAA8B,mBAAmB,EAAE,MAAM,CAAC;aAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,MAIT;QACC,OAAO,IAAI,CAAC,IAAI;aACb,GAAG,CAAuB,oBAAoB,EAAE,EAAE,MAAM,EAAE,CAAC;aAC3D,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,aAAa,CAAC,IAAmB;QAC/B,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CAAsC,sBAAsB,EAAE,IAAI,CAAC;aACvE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,IAAI;aACb,GAAG,CACF,+BAA+B,CAChC;aACA,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAA8B;QAC9C,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CACH,6BAA6B,EAC7B,IAAI,CACL;aACA,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAA8B;QAC9C,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CACH,6BAA6B,EAC7B,IAAI,CACL;aACA,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,IAAmC;QACxD,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CACH,kCAAkC,EAClC,IAAI,CACL;aACA,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAA8B;QAC9C,OAAO,IAAI,CAAC,IAAI;aACb,IAAI,CACH,6BAA6B,EAC7B,IAAI,CACL;aACA,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;CACF","sourcesContent":["import { HttpClient } from \"./http.js\";\r\nimport type {\r\n APIResponse,\r\n AuthResponseData,\r\n CreateAdParams,\r\n AdResponseData,\r\n AdConfigItem,\r\n MerchantPayModeListData,\r\n MerchantPayCreateRequest,\r\n MerchantPayCreateResponseData,\r\n MerchantPayFinishRequest,\r\n MerchantPayFinishResponseData,\r\n MerchantPayQueryResultRequest,\r\n MerchantPayQueryResultResponseData,\r\n MerchantPayNotifyRequest,\r\n BindWalletReq,\r\n BindWalletResponseData,\r\n} from \"./types.js\";\r\n\r\nexport class APIService {\r\n constructor(private http: HttpClient) {}\r\n\r\n auth(user: Record<string, unknown>) {\r\n return this.http\r\n .post<APIResponse<AuthResponseData>>(\"/api/user/auth\", user)\r\n .then((r) => r.data);\r\n }\r\n\r\n getAdPositionConfig(adPositionName: string) {\r\n return this.http\r\n .post<APIResponse<AdConfigItem[]>>(\"/api/ad/adPositionDisplayAd\", {\r\n adPositionName,\r\n })\r\n .then((r) => r.data);\r\n }\r\n\r\n createAd(params: CreateAdParams) {\r\n return this.http\r\n .post<APIResponse<AdResponseData>>(\"/api/v2/ad/create\", params)\r\n .then((r) => r.data);\r\n }\r\n\r\n adMonitor(params: {\r\n param: string;\r\n request_code: string;\r\n timestamp: string;\r\n }) {\r\n return this.http\r\n .get<APIResponse<unknown>>(\"/api/v2/ad/monitor\", { params })\r\n .then((r) => r.data);\r\n }\r\n\r\n bindWalletReq(data: BindWalletReq) {\r\n return this.http\r\n .post<APIResponse<BindWalletResponseData>>(\"/api/user/bindWallet\", data)\r\n .then((r) => r.data);\r\n }\r\n\r\n /**\r\n * 商户支付:获取支付方式\r\n */\r\n merchantPayModeList() {\r\n return this.http\r\n .get<APIResponse<MerchantPayModeListData>>(\r\n \"/api/v2/merchant/pay/modeList\"\r\n )\r\n .then((r) => r.data);\r\n }\r\n\r\n /**\r\n * 商户支付:创建支付订单\r\n */\r\n merchantPayCreate(data: MerchantPayCreateRequest) {\r\n return this.http\r\n .post<APIResponse<MerchantPayCreateResponseData>>(\r\n \"/api/v2/merchant/pay/create\",\r\n data\r\n )\r\n .then((r) => r.data);\r\n }\r\n\r\n /**\r\n * 商户支付:完成支付回调\r\n */\r\n merchantPayFinish(data: MerchantPayFinishRequest) {\r\n return this.http\r\n .post<APIResponse<MerchantPayFinishResponseData>>(\r\n \"/api/v2/merchant/pay/finish\",\r\n data\r\n )\r\n .then((r) => r.data);\r\n }\r\n\r\n /**\r\n * 商户支付:查询支付订单结果\r\n */\r\n merchantPayQueryResult(data: MerchantPayQueryResultRequest) {\r\n return this.http\r\n .post<APIResponse<MerchantPayQueryResultResponseData>>(\r\n \"/api/v2/merchant/pay/queryResult\",\r\n data\r\n )\r\n .then((r) => r.data);\r\n }\r\n\r\n /**\r\n * 商户支付:支付完成通知结果\r\n */\r\n merchantPayNotify(data: MerchantPayNotifyRequest) {\r\n return this.http\r\n .post<APIResponse<Record<string, unknown>>>(\r\n \"/api/v2/merchant/pay/notify\",\r\n data\r\n )\r\n .then((r) => r.data);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,16 @@
1
+ import { AxiosRequestConfig, AxiosResponse } from "axios";
2
+ export interface CreateHttpClientOptions {
3
+ getToken: () => string | null;
4
+ onAuthError?: () => void;
5
+ baseURL?: string;
6
+ }
7
+ export declare const PROD_BASE_URL = "https://miniapp.spinfi.me";
8
+ export declare const TEST_BASE_URL = "https://miniapptest-spinfi.xy1212.com";
9
+ export declare class HttpClient {
10
+ private options;
11
+ private instance;
12
+ constructor(options: CreateHttpClientOptions);
13
+ request<T = any>(config: AxiosRequestConfig): Promise<AxiosResponse<T>>;
14
+ get<T = any>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T, any>>;
15
+ post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<AxiosResponse<T, any>>;
16
+ }
@@ -0,0 +1,43 @@
1
+ import axios from "axios";
2
+ export const PROD_BASE_URL = "https://miniapp.spinfi.me";
3
+ export const TEST_BASE_URL = "https://miniapptest-spinfi.xy1212.com";
4
+ export class HttpClient {
5
+ constructor(options) {
6
+ this.options = options;
7
+ const baseURL = options.baseURL;
8
+ this.instance = axios.create({
9
+ baseURL,
10
+ timeout: 30000,
11
+ });
12
+ this.instance.interceptors.request.use((config) => {
13
+ const token = this.options.getToken();
14
+ if (token) {
15
+ config.headers = config.headers || {};
16
+ const bearer = `Bearer ${token}`;
17
+ config.headers["Authorization"] = bearer;
18
+ }
19
+ return config;
20
+ });
21
+ this.instance.interceptors.response.use((response) => {
22
+ return response;
23
+ }, (error) => {
24
+ if (error.response) {
25
+ const status = error.response.status;
26
+ if (status === 401 && this.options.onAuthError) {
27
+ this.options.onAuthError();
28
+ }
29
+ }
30
+ return Promise.reject(error);
31
+ });
32
+ }
33
+ request(config) {
34
+ return this.instance.request(config);
35
+ }
36
+ get(url, config) {
37
+ return this.instance.get(url, config);
38
+ }
39
+ post(url, data, config) {
40
+ return this.instance.post(url, data, config);
41
+ }
42
+ }
43
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/sdk/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAQhF,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AACzD,MAAM,CAAC,MAAM,aAAa,GAAG,uCAAuC,CAAC;AAErE,MAAM,OAAO,UAAU;IAGrB,YAAoB,OAAgC;QAAhC,YAAO,GAAP,OAAO,CAAyB;QAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAEhC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC;YAC3B,OAAO;YACP,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,UAAU,KAAK,EAAE,CAAC;gBAChC,MAAM,CAAC,OAAkC,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC;YACvE,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACrC,CAAC,QAAQ,EAAE,EAAE;YACX,OAAO,QAAQ,CAAC;QAClB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrC,IAAI,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;oBAC/C,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7B,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAU,MAA0B;QACzC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAI,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,GAAG,CAAU,GAAW,EAAE,MAA2B;QACnD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAI,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,CAAU,GAAW,EAAE,IAAU,EAAE,MAA2B;QAChE,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClD,CAAC;CACF","sourcesContent":["import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\r\n\r\nexport interface CreateHttpClientOptions {\r\n getToken: () => string | null;\r\n onAuthError?: () => void;\r\n baseURL?: string;\r\n}\r\n\r\nexport const PROD_BASE_URL = \"https://miniapp.spinfi.me\";\r\nexport const TEST_BASE_URL = \"https://miniapptest-spinfi.xy1212.com\";\r\n\r\nexport class HttpClient {\r\n private instance: AxiosInstance;\r\n\r\n constructor(private options: CreateHttpClientOptions) {\r\n const baseURL = options.baseURL;\r\n\r\n this.instance = axios.create({\r\n baseURL,\r\n timeout: 30000,\r\n });\r\n\r\n this.instance.interceptors.request.use((config) => {\r\n const token = this.options.getToken();\r\n if (token) {\r\n config.headers = config.headers || {};\r\n const bearer = `Bearer ${token}`;\r\n (config.headers as Record<string, string>)[\"Authorization\"] = bearer;\r\n }\r\n return config;\r\n });\r\n\r\n this.instance.interceptors.response.use(\r\n (response) => {\r\n return response;\r\n },\r\n (error) => {\r\n if (error.response) {\r\n const status = error.response.status;\r\n if (status === 401 && this.options.onAuthError) {\r\n this.options.onAuthError();\r\n }\r\n }\r\n return Promise.reject(error);\r\n }\r\n );\r\n }\r\n\r\n request<T = any>(config: AxiosRequestConfig): Promise<AxiosResponse<T>> {\r\n return this.instance.request<T>(config);\r\n }\r\n\r\n get<T = any>(url: string, config?: AxiosRequestConfig) {\r\n return this.instance.get<T>(url, config);\r\n }\r\n\r\n post<T = any>(url: string, data?: any, config?: AxiosRequestConfig) {\r\n return this.instance.post<T>(url, data, config);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,3 @@
1
+ export * from "./HmTrackingSDK.js";
2
+ export * from "./types.js";
3
+ export * from "./tonWalletProvider.js";