@alipay/ams-checkout 0.0.1786071074-dev.0 → 0.0.1786071074-dev.2

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.
@@ -29,13 +29,20 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
29
29
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
30
30
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
31
31
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
32
- import { openModal, showToast, sdkQuery, getLocaleFromRenderData, getDevReqConfig, getMetaData, buildPageUrl, debugError, debug, MessageType, request, parseHostSign, SDKBridge, parseTrackerId, oneAccountQuery, OpenSDKError, awaitWrap, themeColorMap, ApplePayHostService, buildRecurringPaymentRequest, checkSessionData, sdkTracker, ModalPort } from "../../../../modern/tools";
32
+ import { ERRORMESSAGE, PROMISE_CALLBACK_CODE } from "../../../../constant";
33
+ import { BusManager, BusMessage } from "../../../bus";
34
+ import { ApplePayActionEnum } from "../../../bus/interface";
33
35
  import { shouldQueryOneAccount } from "../../../utils/connectConfig";
36
+ import { ApplePayHostService, awaitWrap, buildPageUrl, buildRecurringPaymentRequest, checkSessionData, debug, debugError, getDevReqConfig, getLocaleFromRenderData, getMetaData, MessageType, ModalPort, oneAccountQuery, openModal, OpenSDKError, parseHostSign, parseTrackerId, request, SDKBridge, sdkQuery, sdkTracker, showToast, themeColorMap } from "../../../../modern/tools";
37
+ import { getApplePayPaymentSession } from "../../../../service";
34
38
  import { device } from "../../../../util";
39
+ import { BEFORE_CONFIRM_TIMEOUT_MS, executeWithTimeout, MERCHANT_CONFIRM_ABORT_CODE, MERCHANT_CONFIRM_TIMEOUT_CODE } from "../../../../util/beforeConfirm";
40
+ import CallApp from "../../../../util/intl-callapp/es/main";
41
+ import { LogConfig, Logger } from "../../../../util/logger";
42
+ import { v4 as uuid } from 'uuid';
35
43
  import { EventCallbackCode } from "../type";
36
- import { adaptSubmitResult, adaptAppearance } from "./adapter";
37
44
  import { safeParse } from "../util";
38
- import { v4 as uuid } from 'uuid';
45
+ import { adaptAppearance, adaptSubmitResult } from "./adapter";
39
46
 
40
47
  // ============================================================
41
48
  // 埋点 helper(不改 opensdk 源码,复用 sdkTracker 单例,trackId 已自动注入)
@@ -46,24 +53,6 @@ import { v4 as uuid } from 'uuid';
46
53
 
47
54
  var TRACK_CODE_PREFIX = '7982';
48
55
 
49
- // 缓存解析出的 merchantId,供埋点 helper 在任意阶段统一带上
50
- var _merchantId = '';
51
- var track = function track(phase, msg) {
52
- var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
53
- try {
54
- var code = "".concat(TRACK_CODE_PREFIX).concat(phase === 'error' ? '' : phase);
55
- // LogItem 类型未暴露 merchant_id 字段,但运行时 tracker 会透传,
56
- // 故用断言保留该字段名供下游埋点消费
57
- sdkTracker.log(_objectSpread({
58
- code: code,
59
- msg: msg,
60
- merchant_id: _merchantId
61
- }, extra));
62
- } catch (_unused) {
63
- /* 埋点失败绝不影响主流程 */
64
- }
65
- };
66
-
67
56
  /**
68
57
  * 优先取 sessionData 解析出的 clientId;
69
58
  * 缺失时从容错角度回落到 extendInfo 中的 merchantId(URL 编码需解码)。
@@ -80,42 +69,22 @@ var resolveMerchantId = function resolveMerchantId(parseData) {
80
69
  return '';
81
70
  }
82
71
  return decodeURIComponent(merchantId);
83
- } catch (_unused2) {
72
+ } catch (_unused) {
84
73
  return '';
85
74
  }
86
75
  };
87
- var trackMount = function trackMount(msg) {
88
- var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
89
- return track('mount', msg, extra);
90
- };
91
- var trackHandshake = function trackHandshake(msg) {
92
- var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
93
- return track('handshake', msg, extra);
94
- };
95
- var trackElement = function trackElement(msg) {
96
- var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
97
- return track('element', msg, extra);
98
- };
99
- var trackError = function trackError(msg) {
100
- var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
101
- return track('error', msg, extra);
102
- };
103
- // ============================================================
104
- // 统一 API 终态上报(7982api):在 mount/submitPayment/validateFields
105
- // 每个出口(成功/失败/中断)捕获「返回给商户的完整结果」,一处包裹覆盖全部分支。
106
- // 与分散的 trackXxx 互补、不替换;merchantId 为关键字段,必带。
107
- // _merchantId 在 setup() 解析后填充,mount 首次调用在 resolve 时已就绪。
108
- // ============================================================
109
- var reportApiEnd = function reportApiEnd(api, durationMs) {
110
- var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
76
+ // reportApiEnd 留为模块级,merchant_id 改为显式参数(由 runApi 从实例传入),
77
+ // 避免原模块级 _merchantId 的多实例共享竞争。track/trackXxx 已改为实例方法读 this.merchantId。
78
+ var reportApiEnd = function reportApiEnd(api, durationMs, merchantId) {
79
+ var extra = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
111
80
  try {
112
81
  sdkTracker.log(_objectSpread({
113
82
  code: "".concat(TRACK_CODE_PREFIX, "api"),
114
83
  msg: api,
115
84
  m1: durationMs,
116
- merchant_id: _merchantId
85
+ merchant_id: merchantId
117
86
  }, extra));
118
- } catch (_unused3) {
87
+ } catch (_unused2) {
119
88
  /* 埋点失败绝不影响主流程 */
120
89
  }
121
90
  };
@@ -141,10 +110,37 @@ var normalizeApiResult = function normalizeApiResult(api, result) {
141
110
  return acc;
142
111
  };
143
112
 
113
+ // 入参埋点:按 API 入参字段直接落入 d6 起,与 normalizeApiResult(d1-d5)错开。
114
+ // 标量字段记实际值;shippingInfo 含姓名/电话/地址等 PII,仅记存在性。
115
+ // onBeforeConfirm 为函数不可序列化跳过。
116
+ // mount 仅取低基配置字段(type/notRedirectAfterComplete/theme/layout),忽略 appearance.variables 等高基数项。
117
+ var normalizeApiInput = function normalizeApiInput(api, params) {
118
+ var acc = {};
119
+ if (!params) return acc;
120
+ if (api === 'submitPayment') {
121
+ var _params$amount, _params$currency;
122
+ acc.d6 = String(!!params.handleActions);
123
+ acc.d7 = (_params$amount = params.amount) !== null && _params$amount !== void 0 ? _params$amount : '';
124
+ acc.d8 = (_params$currency = params.currency) !== null && _params$currency !== void 0 ? _params$currency : '';
125
+ acc.d9 = params.shippingInfo ? 'true' : 'false';
126
+ } else if (api === 'mount') {
127
+ var _params$renderOptions, _params$renderOptions2, _params$renderOptions3, _params$renderOptions4, _params$renderOptions5, _params$renderOptions6, _params$renderOptions7, _params$sdkSelector, _params$renderOptions8, _appoint$singleOption, _appoint$storedCard;
128
+ acc.d6 = (_params$renderOptions = (_params$renderOptions2 = params.renderOptions) === null || _params$renderOptions2 === void 0 ? void 0 : _params$renderOptions2.type) !== null && _params$renderOptions !== void 0 ? _params$renderOptions : '';
129
+ acc.d7 = String(!!((_params$renderOptions3 = params.renderOptions) !== null && _params$renderOptions3 !== void 0 && _params$renderOptions3.notRedirectAfterComplete));
130
+ acc.d8 = (_params$renderOptions4 = (_params$renderOptions5 = params.renderOptions) === null || _params$renderOptions5 === void 0 || (_params$renderOptions5 = _params$renderOptions5.appearance) === null || _params$renderOptions5 === void 0 ? void 0 : _params$renderOptions5.theme) !== null && _params$renderOptions4 !== void 0 ? _params$renderOptions4 : '';
131
+ acc.d9 = (_params$renderOptions6 = (_params$renderOptions7 = params.renderOptions) === null || _params$renderOptions7 === void 0 || (_params$renderOptions7 = _params$renderOptions7.appearance) === null || _params$renderOptions7 === void 0 || (_params$renderOptions7 = _params$renderOptions7.layout) === null || _params$renderOptions7 === void 0 ? void 0 : _params$renderOptions7.type) !== null && _params$renderOptions6 !== void 0 ? _params$renderOptions6 : '';
132
+ acc.d10 = (_params$sdkSelector = params.sdkSelector) !== null && _params$sdkSelector !== void 0 ? _params$sdkSelector : '';
133
+ var appoint = (_params$renderOptions8 = params.renderOptions) === null || _params$renderOptions8 === void 0 ? void 0 : _params$renderOptions8.merchantAppointParam;
134
+ acc.d11 = (_appoint$singleOption = appoint === null || appoint === void 0 ? void 0 : appoint.singleOption) !== null && _appoint$singleOption !== void 0 ? _appoint$singleOption : '';
135
+ acc.d12 = (appoint === null || appoint === void 0 || (_appoint$storedCard = appoint.storedCard) === null || _appoint$storedCard === void 0 ? void 0 : _appoint$storedCard.needCVV) != null ? String(appoint.storedCard.needCVV) : '';
136
+ }
137
+ return acc;
138
+ };
139
+
144
140
  // 统一包裹:捕获终态(resolve/reject)后上报,原值/原异常原样透传,不影响任何已有逻辑。
145
141
  // extraBuilder 供调用方注入实例上下文字段(如 paymentMethodType),其值覆盖 normalizeApiResult 结果。
146
142
  var runApi = /*#__PURE__*/function () {
147
- var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(api, fn, extraBuilder) {
143
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(api, fn, extraBuilder, inputExtra, merchantId) {
148
144
  var startedAt, result;
149
145
  return _regeneratorRuntime().wrap(function _callee$(_context) {
150
146
  while (1) switch (_context.prev = _context.next) {
@@ -155,12 +151,12 @@ var runApi = /*#__PURE__*/function () {
155
151
  return fn();
156
152
  case 4:
157
153
  result = _context.sent;
158
- reportApiEnd(api, Date.now() - startedAt, _objectSpread(_objectSpread({}, normalizeApiResult(api, result)), extraBuilder === null || extraBuilder === void 0 ? void 0 : extraBuilder(false)));
154
+ reportApiEnd(api, Date.now() - startedAt, merchantId, _objectSpread(_objectSpread(_objectSpread({}, inputExtra), normalizeApiResult(api, result)), extraBuilder === null || extraBuilder === void 0 ? void 0 : extraBuilder(false)));
159
155
  return _context.abrupt("return", result);
160
156
  case 9:
161
157
  _context.prev = 9;
162
158
  _context.t0 = _context["catch"](1);
163
- reportApiEnd(api, Date.now() - startedAt, _objectSpread({
159
+ reportApiEnd(api, Date.now() - startedAt, merchantId, _objectSpread(_objectSpread({}, inputExtra), {}, {
164
160
  d1: 'error',
165
161
  d2: (_context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.code) || 'UNKNOWN'
166
162
  }, extraBuilder === null || extraBuilder === void 0 ? void 0 : extraBuilder(true)));
@@ -171,17 +167,10 @@ var runApi = /*#__PURE__*/function () {
171
167
  }
172
168
  }, _callee, null, [[1, 9]]);
173
169
  }));
174
- return function runApi(_x, _x2, _x3) {
170
+ return function runApi(_x, _x2, _x3, _x4, _x5) {
175
171
  return _ref.apply(this, arguments);
176
172
  };
177
173
  }();
178
- import CallApp from "../../../../util/intl-callapp/es/main";
179
- import { getApplePayPaymentSession } from "../../../../service";
180
- import { BusManager, BusMessage } from "../../../bus";
181
- import { ApplePayActionEnum } from "../../../bus/interface";
182
- import { ERRORMESSAGE, PROMISE_CALLBACK_CODE } from "../../../../constant";
183
- import { LogConfig, Logger } from "../../../../util/logger";
184
- import { executeWithTimeout, BEFORE_CONFIRM_TIMEOUT_MS } from "../../../../util/beforeConfirm";
185
174
  var recoverSdkQueryBusinessResponse = function recoverSdkQueryBusinessResponse(error) {
186
175
  var response = error === null || error === void 0 ? void 0 : error.response;
187
176
  if ((response === null || response === void 0 ? void 0 : response.success) === false) {
@@ -306,6 +295,11 @@ export var ModernElementController = /*#__PURE__*/function () {
306
295
  _defineProperty(this, "currentPaymentMethodType", '');
307
296
  /** 提交进行中标志:submitPayment 执行期间为 true,用于拒绝并发重入,避免旧闭包串扰/重复拉起钱包 */
308
297
  _defineProperty(this, "isSubmitting", false);
298
+ /**
299
+ * 当前实例解析出的 merchantId,供 trackXxx / reportApiEnd 统一带上。
300
+ * 实例隔离:多实例并发 mount 时各自持有,避免原模块级 _merchantId 的共享竞争。
301
+ */
302
+ _defineProperty(this, "merchantId", '');
309
303
  this.options = options;
310
304
  this.onStatusChange = onStatusChange;
311
305
  if (options.sessionData) {
@@ -328,6 +322,47 @@ export var ModernElementController = /*#__PURE__*/function () {
328
322
  });
329
323
  }
330
324
  _createClass(ModernElementController, [{
325
+ key: "track",
326
+ value:
327
+ // ── 埋点 helper(实例方法,读 this.merchantId)────────────────────────
328
+ function track(phase, msg) {
329
+ var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
330
+ try {
331
+ var code = "".concat(TRACK_CODE_PREFIX).concat(phase === 'error' ? '' : phase);
332
+ sdkTracker.log(_objectSpread({
333
+ code: code,
334
+ msg: msg,
335
+ merchant_id: this.merchantId
336
+ }, extra));
337
+ } catch (_unused3) {
338
+ /* 埋点失败绝不影响主流程 */
339
+ }
340
+ }
341
+ }, {
342
+ key: "trackMount",
343
+ value: function trackMount(msg) {
344
+ var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
345
+ this.track('mount', msg, extra);
346
+ }
347
+ }, {
348
+ key: "trackHandshake",
349
+ value: function trackHandshake(msg) {
350
+ var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
351
+ this.track('handshake', msg, extra);
352
+ }
353
+ }, {
354
+ key: "trackElement",
355
+ value: function trackElement(msg) {
356
+ var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
357
+ this.track('element', msg, extra);
358
+ }
359
+ }, {
360
+ key: "trackError",
361
+ value: function trackError(msg) {
362
+ var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
363
+ this.track('error', msg, extra);
364
+ }
365
+ }, {
331
366
  key: "mount",
332
367
  value: function () {
333
368
  var _mount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(renderOptions, sdkSelector) {
@@ -335,16 +370,28 @@ export var ModernElementController = /*#__PURE__*/function () {
335
370
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
336
371
  while (1) switch (_context2.prev = _context2.next) {
337
372
  case 0:
373
+ // 解析 merchantId(唯一赋值点):早于 runApi 求值 this.merchantId 与 doMount,
374
+ // 使 mount_start / api_end 都能带上有值的 merchant_id。checkSessionData 在 sessionData
375
+ // 缺失/无效时会 throw,这里容错吞掉——失败的校验仍由后续 setup() 内的 checkSessionData
376
+ // 抛出、走 mount_error 统一上报,不改变错误时序。
377
+ try {
378
+ this.merchantId = resolveMerchantId(checkSessionData(this.options.sessionData, 'ELEMENT_PAYMENT'));
379
+ } catch (_unused4) {
380
+ /* setup 校验异常会统一上报 */
381
+ }
338
382
  return _context2.abrupt("return", runApi('mount', function () {
339
383
  return _this.doMount(renderOptions, sdkSelector);
340
- }));
341
- case 1:
384
+ }, undefined, normalizeApiInput('mount', {
385
+ renderOptions: renderOptions,
386
+ sdkSelector: sdkSelector
387
+ }), this.merchantId));
388
+ case 2:
342
389
  case "end":
343
390
  return _context2.stop();
344
391
  }
345
- }, _callee2);
392
+ }, _callee2, this);
346
393
  }));
347
- function mount(_x4, _x5) {
394
+ function mount(_x6, _x7) {
348
395
  return _mount.apply(this, arguments);
349
396
  }
350
397
  return mount;
@@ -358,7 +405,7 @@ export var ModernElementController = /*#__PURE__*/function () {
358
405
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
359
406
  while (1) switch (_context3.prev = _context3.next) {
360
407
  case 0:
361
- trackMount('mount_start', {
408
+ this.trackMount('mount_start', {
362
409
  d1: sdkSelector,
363
410
  d2: this.options.sessionData ? 'has_session' : 'no_session'
364
411
  });
@@ -367,7 +414,7 @@ export var ModernElementController = /*#__PURE__*/function () {
367
414
  _context3.next = 6;
368
415
  break;
369
416
  }
370
- trackError('selector_not_found', {
417
+ this.trackError('selector_not_found', {
371
418
  d1: sdkSelector
372
419
  });
373
420
  (_this$options = this.options) === null || _this$options === void 0 || (_this$options$onEvent = _this$options.onEventCallback) === null || _this$options$onEvent === void 0 || _this$options$onEvent.call(_this$options, {
@@ -398,7 +445,7 @@ export var ModernElementController = /*#__PURE__*/function () {
398
445
  if (iframeOrigin && iframeOrigin !== 'null') {
399
446
  this.bridge.setOrigin(iframeOrigin);
400
447
  }
401
- } catch (_unused4) {
448
+ } catch (_unused5) {
402
449
  // URL 解析失败时保持默认 origin
403
450
  }
404
451
  } else {
@@ -411,7 +458,7 @@ export var ModernElementController = /*#__PURE__*/function () {
411
458
  readyHandshakePromise = this.waitForReadyHandshake();
412
459
  this.iframe.src = iframeUrl;
413
460
  container.appendChild(this.iframe);
414
- trackMount('iframe_loaded', {
461
+ this.trackMount('iframe_loaded', {
415
462
  d1: iframeUrl
416
463
  });
417
464
 
@@ -431,7 +478,7 @@ export var ModernElementController = /*#__PURE__*/function () {
431
478
  dataStructError = this.validateRenderData(setupConfig.renderData, setupConfig.renderDataError);
432
479
  if (dataStructError) {
433
480
  setupConfig.renderDataError = dataStructError;
434
- trackError('render_data_invalid', {
481
+ this.trackError('render_data_invalid', {
435
482
  d1: dataStructError.code,
436
483
  d2: dataStructError.reason
437
484
  });
@@ -456,7 +503,7 @@ export var ModernElementController = /*#__PURE__*/function () {
456
503
  error: dataStructError
457
504
  });
458
505
  case 40:
459
- trackMount('mount_success', {
506
+ this.trackMount('mount_success', {
460
507
  m1: this._mountStartTime ? Date.now() - this._mountStartTime : 0
461
508
  });
462
509
  return _context3.abrupt("return", {});
@@ -472,7 +519,7 @@ export var ModernElementController = /*#__PURE__*/function () {
472
519
  error: _context3.t0
473
520
  });
474
521
  case 49:
475
- trackError('mount_error', {
522
+ this.trackError('mount_error', {
476
523
  d1: (_context3.t0 === null || _context3.t0 === void 0 ? void 0 : _context3.t0.code) || 'UNKNOWN',
477
524
  d2: (_context3.t0 === null || _context3.t0 === void 0 ? void 0 : _context3.t0.message) || ''
478
525
  });
@@ -491,7 +538,7 @@ export var ModernElementController = /*#__PURE__*/function () {
491
538
  }
492
539
  }, _callee3, this, [[8, 44]]);
493
540
  }));
494
- function doMount(_x6, _x7) {
541
+ function doMount(_x8, _x9) {
495
542
  return _doMount.apply(this, arguments);
496
543
  }
497
544
  return doMount;
@@ -519,7 +566,7 @@ export var ModernElementController = /*#__PURE__*/function () {
519
566
  while (1) switch (_context4.prev = _context4.next) {
520
567
  case 0:
521
568
  this._mountStartTime = Date.now();
522
- trackMount('setup_start');
569
+ this.trackMount('setup_start');
523
570
  // 缓存起来,submit时使用
524
571
  this.notRedirectAfterComplete = renderOptions.notRedirectAfterComplete || false;
525
572
  sessionData = this.options.sessionData; // checkSessionData 失败会 throw AntomSDKError(SESSION_DATA_INVALID),
@@ -527,9 +574,6 @@ export var ModernElementController = /*#__PURE__*/function () {
527
574
  parseData = checkSessionData(sessionData, 'ELEMENT_PAYMENT');
528
575
  lastEnv = this.options.environment === 'sandbox' ? 'sandbox' : 'prod';
529
576
  this.options.environment;
530
- // 解析 merchantId(优先 clientId,缺失时容错回落到 extendInfo.merchantId),
531
- // 缓存到模块级变量,使后续所有 trackXxx 埋点统一带上
532
- _merchantId = resolveMerchantId(parseData);
533
577
 
534
578
  // 初始化 request 全局配置,使 sdkQuery 能正确发起请求
535
579
  // tracker: sdkTracker —— 接入 HTTP 层自动埋点(B 套),上报每个请求的成败/RTT/错误码
@@ -538,7 +582,7 @@ export var ModernElementController = /*#__PURE__*/function () {
538
582
  hostSign: parseHostSign(sessionData),
539
583
  env: lastEnv
540
584
  }, getDevReqConfig()), {}, {
541
- sdkVersion: "0.0.1786071074-dev.0" || '',
585
+ sdkVersion: "0.0.1786071074-dev.2" || '',
542
586
  tracker: sdkTracker
543
587
  }));
544
588
  isConnect = !!(parseData !== null && parseData !== void 0 && (_parseData$connectFac = parseData.connectFactor) !== null && _parseData$connectFac !== void 0 && _parseData$connectFac.enableConnect);
@@ -579,21 +623,21 @@ export var ModernElementController = /*#__PURE__*/function () {
579
623
  });
580
624
  });
581
625
  queryPromise = Promise.all(promises);
582
- _context4.next = 20;
626
+ _context4.next = 19;
583
627
  return Promise.race([queryPromise, destroyPromise]).finally(cancelDestroyCallback);
584
- case 20:
628
+ case 19:
585
629
  _yield$Promise$race$f = _context4.sent;
586
630
  _yield$Promise$race$f2 = _slicedToArray(_yield$Promise$race$f, 2);
587
631
  sdkQueryResult = _yield$Promise$race$f2[0];
588
632
  oneAccountQueryResult = _yield$Promise$race$f2[1];
589
633
  if (sdkQueryResult.error) {
590
- trackHandshake('sdk_query_failed', {
634
+ this.trackHandshake('sdk_query_failed', {
591
635
  d1: ((_sdkQueryResult$error = sdkQueryResult.error) === null || _sdkQueryResult$error === void 0 ? void 0 : _sdkQueryResult$error.code) || '',
592
636
  d2: ((_sdkQueryResult$error2 = sdkQueryResult.error) === null || _sdkQueryResult$error2 === void 0 ? void 0 : _sdkQueryResult$error2.message) || ''
593
637
  });
594
638
  }
595
639
  if (shouldQueryOneAccountFlag && oneAccountQueryResult !== null && oneAccountQueryResult !== void 0 && oneAccountQueryResult.error) {
596
- trackHandshake('one_account_query_failed', {
640
+ this.trackHandshake('one_account_query_failed', {
597
641
  d1: ((_oneAccountQueryResul = oneAccountQueryResult.error) === null || _oneAccountQueryResul === void 0 ? void 0 : _oneAccountQueryResul.code) || '',
598
642
  d2: ((_oneAccountQueryResul2 = oneAccountQueryResult.error) === null || _oneAccountQueryResul2 === void 0 ? void 0 : _oneAccountQueryResul2.message) || ''
599
643
  });
@@ -628,7 +672,7 @@ export var ModernElementController = /*#__PURE__*/function () {
628
672
  paymentMethodCategoryType: paymentSessionConfig === null || paymentSessionConfig === void 0 ? void 0 : paymentSessionConfig.paymentMethodCategoryType,
629
673
  productSceneVersion: paymentSessionConfig === null || paymentSessionConfig === void 0 ? void 0 : paymentSessionConfig.productSceneVersion,
630
674
  trackId: parseTrackerId(sessionData),
631
- merchantId: _merchantId,
675
+ merchantId: this.merchantId,
632
676
  paymentMethodType: parseData === null || parseData === void 0 || (_parseData$paymentMet = parseData.paymentMethodInfoView) === null || _parseData$paymentMet === void 0 ? void 0 : _parseData$paymentMet.paymentMethodType
633
677
  },
634
678
  // 原老字段
@@ -636,7 +680,7 @@ export var ModernElementController = /*#__PURE__*/function () {
636
680
  // 新sdk字段
637
681
  locale: locale,
638
682
  // 新sdk字段
639
- sdkVersion: "0.0.1786071074-dev.0" || '',
683
+ sdkVersion: "0.0.1786071074-dev.2" || '',
640
684
  // 新sdk字段
641
685
  merchantId: (sdkQueryResult === null || sdkQueryResult === void 0 || (_sdkQueryResult$data = sdkQueryResult.data) === null || _sdkQueryResult$data === void 0 ? void 0 : _sdkQueryResult$data.merchantId) || '',
642
686
  // 新sdk字段
@@ -646,13 +690,13 @@ export var ModernElementController = /*#__PURE__*/function () {
646
690
  env: lastEnv
647
691
  }, getDevReqConfig())
648
692
  });
649
- case 30:
693
+ case 29:
650
694
  case "end":
651
695
  return _context4.stop();
652
696
  }
653
697
  }, _callee4, this);
654
698
  }));
655
- function setup(_x8) {
699
+ function setup(_x10) {
656
700
  return _setup.apply(this, arguments);
657
701
  }
658
702
  return setup;
@@ -771,7 +815,7 @@ export var ModernElementController = /*#__PURE__*/function () {
771
815
  schemaUrl = payload.schemaUrl,
772
816
  destroy = payload.destroy;
773
817
  // d1=mode(redirect/replace) d2=跳转类型 d3=兜底url d4=appLinkUrl d5=schemaUrl d6=是否销毁
774
- trackElement('redirect', {
818
+ _this3.trackElement('redirect', {
775
819
  d1: mode || 'redirect',
776
820
  d2: appLinkUrl ? 'app_link' : schemaUrl ? 'schema' : 'url',
777
821
  d3: url || '',
@@ -794,7 +838,7 @@ export var ModernElementController = /*#__PURE__*/function () {
794
838
  var app = new CallApp({
795
839
  resultJudgmentTime: 2000,
796
840
  fallback: function fallback() {
797
- trackElement('redirect_fallback', {
841
+ _this3.trackElement('redirect_fallback', {
798
842
  d1: 'callapp_failed',
799
843
  d2: url || ''
800
844
  });
@@ -809,7 +853,7 @@ export var ModernElementController = /*#__PURE__*/function () {
809
853
  fallbackJump();
810
854
  }
811
855
  } catch (error) {
812
- trackError('redirect_error', {
856
+ _this3.trackError('redirect_error', {
813
857
  d1: 'callapp_exception',
814
858
  d2: (error === null || error === void 0 ? void 0 : error.message) || '',
815
859
  d3: url || ''
@@ -867,14 +911,14 @@ export var ModernElementController = /*#__PURE__*/function () {
867
911
  sessionData = this.options.sessionData;
868
912
  applePayProps = payload === null || payload === void 0 || (_paymentMethod = payload.paymentMethod) === null || _paymentMethod === void 0 || (_paymentMethod = _paymentMethod.paymentMethodDetail) === null || _paymentMethod === void 0 ? void 0 : _paymentMethod.applePayProps;
869
913
  paymentRequest = applePayProps === null || applePayProps === void 0 ? void 0 : applePayProps.paymentRequest;
870
- trackElement('applepay_token_request', {
914
+ this.trackElement('applepay_token_request', {
871
915
  d1: paymentRequest ? 'has_payment_request' : 'no_payment_request'
872
916
  });
873
917
  if (paymentRequest) {
874
918
  _context7.next = 8;
875
919
  break;
876
920
  }
877
- trackError('applepay_token_missing_data', {
921
+ this.trackError('applepay_token_missing_data', {
878
922
  d1: 'MISSING_DATA'
879
923
  });
880
924
  this.bridge.send(AMSMessageType.GET_APPLE_PAY_TOKEN_REPLY, {
@@ -886,7 +930,7 @@ export var ModernElementController = /*#__PURE__*/function () {
886
930
  return _context7.abrupt("return");
887
931
  case 8:
888
932
  merchantCapabilities = paymentRequest.merchantCapabilities, merchantInfo = paymentRequest.merchantInfo, paymentAmount = paymentRequest.paymentAmount, supportedNetworks = paymentRequest.supportedNetworks, version = paymentRequest.version, requiredBillingContactFields = paymentRequest.requiredBillingContactFields, requiredShippingContactFields = paymentRequest.requiredShippingContactFields;
889
- finalAmount = (paymentAmount === null || paymentAmount === void 0 ? void 0 : paymentAmount.formattedValue) || (paymentAmount === null || paymentAmount === void 0 ? void 0 : paymentAmount.value);
933
+ finalAmount = paymentAmount === null || paymentAmount === void 0 ? void 0 : paymentAmount.value;
890
934
  finalCurrency = paymentAmount === null || paymentAmount === void 0 ? void 0 : paymentAmount.currency; // 商户 amount/currency 覆盖(优先级高于 iframe 传来的值,用于 Apple Pay 弹窗展示)
891
935
  if (this._merchantAmount) {
892
936
  finalAmount = this._merchantAmount;
@@ -931,7 +975,7 @@ export var ModernElementController = /*#__PURE__*/function () {
931
975
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
932
976
  while (1) switch (_context5.prev = _context5.next) {
933
977
  case 0:
934
- trackElement('applepay_validate_start', {
978
+ _this4.trackElement('applepay_validate_start', {
935
979
  d1: 'merchant_validate'
936
980
  });
937
981
  _context5.next = 3;
@@ -951,12 +995,12 @@ export var ModernElementController = /*#__PURE__*/function () {
951
995
  _context5.next = 7;
952
996
  break;
953
997
  }
954
- trackElement('applepay_validate_success', {
998
+ _this4.trackElement('applepay_validate_success', {
955
999
  d1: 'got_session'
956
1000
  });
957
1001
  return _context5.abrupt("return", typeof res.merchantSessionObject === 'string' ? JSON.parse(res.merchantSessionObject) : res.merchantSessionObject);
958
1002
  case 7:
959
- trackError('applepay_merchant_validate_failed', {
1003
+ _this4.trackError('applepay_merchant_validate_failed', {
960
1004
  d1: 'VALIDATION_FAILED',
961
1005
  d2: (res === null || res === void 0 ? void 0 : res.errorMessage) || 'Merchant validation failed'
962
1006
  });
@@ -969,20 +1013,20 @@ export var ModernElementController = /*#__PURE__*/function () {
969
1013
  }
970
1014
  }, _callee5);
971
1015
  }));
972
- function validateMerchant(_x11) {
1016
+ function validateMerchant(_x13) {
973
1017
  return _validateMerchant.apply(this, arguments);
974
1018
  }
975
1019
  return validateMerchant;
976
1020
  }(),
977
1021
  onAuthorized: function () {
978
1022
  var _onAuthorized = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(_ref4) {
979
- var token, billingContact, shippingContact, startTime, _yield$executeWithTim, rawResult, timedOut, shouldContinue;
1023
+ var token, billingContact, shippingContact, startTime, _yield$executeWithTim, rawResult, timedOut, isTimeout, shouldContinue;
980
1024
  return _regeneratorRuntime().wrap(function _callee6$(_context6) {
981
1025
  while (1) switch (_context6.prev = _context6.next) {
982
1026
  case 0:
983
1027
  token = _ref4.token, billingContact = _ref4.billingContact, shippingContact = _ref4.shippingContact;
984
1028
  if (!onBeforeConfirm) {
985
- _context6.next = 18;
1029
+ _context6.next = 19;
986
1030
  break;
987
1031
  }
988
1032
  _context6.prev = 2;
@@ -996,50 +1040,51 @@ export var ModernElementController = /*#__PURE__*/function () {
996
1040
  rawResult = _yield$executeWithTim.result;
997
1041
  timedOut = _yield$executeWithTim.timedOut;
998
1042
  // 双重校验:timedOut(Promise race)+ startTime(实际时间差),与老 ElementController 对齐
999
- shouldContinue = !timedOut && !!rawResult && Date.now() - startTime < BEFORE_CONFIRM_TIMEOUT_MS;
1000
- if (timedOut || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS) {
1001
- trackError('sdk_before_confirm_timeout', {
1043
+ isTimeout = timedOut || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS;
1044
+ shouldContinue = !isTimeout && !!rawResult;
1045
+ if (isTimeout) {
1046
+ _this4.trackError('sdk_before_confirm_timeout', {
1002
1047
  d1: 'applePay_chrome_modern'
1003
1048
  });
1004
1049
  }
1005
1050
  if (shouldContinue) {
1006
- _context6.next = 13;
1051
+ _context6.next = 14;
1007
1052
  break;
1008
1053
  }
1009
1054
  return _context6.abrupt("return", {
1010
1055
  success: false,
1011
- errorCode: 'MERCHANT_CONFIRM_ABORT'
1056
+ errorCode: isTimeout ? MERCHANT_CONFIRM_TIMEOUT_CODE : MERCHANT_CONFIRM_ABORT_CODE
1012
1057
  });
1013
- case 13:
1014
- _context6.next = 18;
1058
+ case 14:
1059
+ _context6.next = 19;
1015
1060
  break;
1016
- case 15:
1017
- _context6.prev = 15;
1061
+ case 16:
1062
+ _context6.prev = 16;
1018
1063
  _context6.t0 = _context6["catch"](2);
1019
1064
  return _context6.abrupt("return", {
1020
1065
  success: false,
1021
- errorCode: 'MERCHANT_CONFIRM_ABORT'
1066
+ errorCode: MERCHANT_CONFIRM_ABORT_CODE
1022
1067
  });
1023
- case 18:
1068
+ case 19:
1024
1069
  capturedResult = {
1025
1070
  token: token,
1026
1071
  billingContact: billingContact,
1027
1072
  shippingContact: shippingContact
1028
1073
  };
1029
- trackElement('applepay_authorized', {
1074
+ _this4.trackElement('applepay_authorized', {
1030
1075
  d1: token ? 'has_token' : 'no_token'
1031
1076
  });
1032
1077
  return _context6.abrupt("return", {
1033
1078
  success: true,
1034
1079
  result: capturedResult
1035
1080
  });
1036
- case 21:
1081
+ case 22:
1037
1082
  case "end":
1038
1083
  return _context6.stop();
1039
1084
  }
1040
- }, _callee6, null, [[2, 15]]);
1085
+ }, _callee6, null, [[2, 16]]);
1041
1086
  }));
1042
- function onAuthorized(_x12) {
1087
+ function onAuthorized(_x14) {
1043
1088
  return _onAuthorized.apply(this, arguments);
1044
1089
  }
1045
1090
  return onAuthorized;
@@ -1050,7 +1095,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1050
1095
  _context7.next = 18;
1051
1096
  return service.startPay();
1052
1097
  case 18:
1053
- trackElement('applepay_token_success', {
1098
+ this.trackElement('applepay_token_success', {
1054
1099
  d1: (_capturedResult = capturedResult) !== null && _capturedResult !== void 0 && _capturedResult.token ? 'has_token' : 'no_token'
1055
1100
  });
1056
1101
  this.bridge.send(AMSMessageType.GET_APPLE_PAY_TOKEN_REPLY, {
@@ -1066,11 +1111,11 @@ export var ModernElementController = /*#__PURE__*/function () {
1066
1111
  if ((_context7.t0 === null || _context7.t0 === void 0 ? void 0 : _context7.t0.errorCode) !== 'APPLE_PAY_PAYMENT_SESSION_REQUEST_FAILED') {
1067
1112
  errCode = (_context7.t0 === null || _context7.t0 === void 0 ? void 0 : _context7.t0.errorCode) || 'APPLE_PAY_NOT_SUPPORTED'; // 用户主动取消单独标记,便于区分取消与真实失败
1068
1113
  if (errCode === 'APPLE_PAY_CANCEL') {
1069
- trackElement('applepay_cancel', {
1114
+ this.trackElement('applepay_cancel', {
1070
1115
  d1: 'user_cancel'
1071
1116
  });
1072
1117
  } else {
1073
- trackError('applepay_token_failed', {
1118
+ this.trackError('applepay_token_failed', {
1074
1119
  d1: errCode,
1075
1120
  d2: (_context7.t0 === null || _context7.t0 === void 0 ? void 0 : _context7.t0.errorMessage) || ''
1076
1121
  });
@@ -1088,7 +1133,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1088
1133
  }
1089
1134
  }, _callee7, this, [[15, 22]]);
1090
1135
  }));
1091
- function handleGetApplePayToken(_x9, _x10) {
1136
+ function handleGetApplePayToken(_x11, _x12) {
1092
1137
  return _handleGetApplePayToken.apply(this, arguments);
1093
1138
  }
1094
1139
  return handleGetApplePayToken;
@@ -1121,12 +1166,12 @@ export var ModernElementController = /*#__PURE__*/function () {
1121
1166
  // 否则从 paymentMethodDetail.googlePayProps 取(兼容 v1 的数据结构)
1122
1167
  var environment = (data === null || data === void 0 ? void 0 : data.environment) || (googlePayProps === null || googlePayProps === void 0 ? void 0 : googlePayProps.environment) || 'TEST';
1123
1168
  var paymentRequest = (data === null || data === void 0 ? void 0 : data.paymentRequest) || (googlePayProps === null || googlePayProps === void 0 ? void 0 : googlePayProps.paymentRequest) || {};
1124
- trackElement('googlepay_token_request', {
1169
+ this.trackElement('googlepay_token_request', {
1125
1170
  d1: environment,
1126
1171
  d2: paymentRequest ? 'has_payment_request' : 'no_payment_request'
1127
1172
  });
1128
1173
  if (!paymentRequest || !Object.keys(paymentRequest).length) {
1129
- trackError('googlepay_token_missing_data', {
1174
+ this.trackError('googlepay_token_missing_data', {
1130
1175
  d1: 'MISSING_DATA'
1131
1176
  });
1132
1177
  this.bridge.send(AMSMessageType.GET_GOOGLE_PAY_TOKEN_REPLY, {
@@ -1157,7 +1202,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1157
1202
  };
1158
1203
  }).then(function (paymentData) {
1159
1204
  if (paymentData) {
1160
- trackElement('googlepay_token_success', {
1205
+ _this5.trackElement('googlepay_token_success', {
1161
1206
  d1: 'has_token'
1162
1207
  });
1163
1208
  _this5.bridge.send(AMSMessageType.GET_GOOGLE_PAY_TOKEN_REPLY, {
@@ -1168,11 +1213,11 @@ export var ModernElementController = /*#__PURE__*/function () {
1168
1213
  }).catch(function (err) {
1169
1214
  var statusCode = (err === null || err === void 0 ? void 0 : err.statusCode) || 'GOOGLE_PAY_PAYMENT_FAILED';
1170
1215
  if (statusCode === 'CANCELED') {
1171
- trackElement('googlepay_cancel', {
1216
+ _this5.trackElement('googlepay_cancel', {
1172
1217
  d1: 'user_cancel'
1173
1218
  });
1174
1219
  } else {
1175
- trackError('googlepay_token_failed', {
1220
+ _this5.trackError('googlepay_token_failed', {
1176
1221
  d1: statusCode,
1177
1222
  d2: (err === null || err === void 0 ? void 0 : err.statusMessage) || ''
1178
1223
  });
@@ -1209,7 +1254,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1209
1254
  loadAndPay();
1210
1255
  };
1211
1256
  script.onerror = function () {
1212
- trackError('googlepay_script_load_failed', {
1257
+ _this5.trackError('googlepay_script_load_failed', {
1213
1258
  d1: 'script_error'
1214
1259
  });
1215
1260
  _this5.bridge.send(AMSMessageType.GET_GOOGLE_PAY_TOKEN_REPLY, {
@@ -1232,11 +1277,11 @@ export var ModernElementController = /*#__PURE__*/function () {
1232
1277
  value: function handleHandlePayment() {
1233
1278
  var sessionData = this.options.sessionData;
1234
1279
  var parseData = getMetaData(sessionData);
1235
- trackElement('handle_payment', {
1280
+ this.trackElement('handle_payment', {
1236
1281
  d1: 'skipRender_applepay_publish'
1237
1282
  });
1238
1283
  if (!parseData) {
1239
- trackError('handle_payment_meta_failed', {
1284
+ this.trackError('handle_payment_meta_failed', {
1240
1285
  d1: 'meta_parse_failed'
1241
1286
  });
1242
1287
  }
@@ -1286,8 +1331,9 @@ export var ModernElementController = /*#__PURE__*/function () {
1286
1331
  var rawResult = _ref5.result,
1287
1332
  timedOut = _ref5.timedOut;
1288
1333
  // 双重校验:timedOut(Promise race)+ startTime(实际时间差),与老 ElementController 对齐
1289
- var shouldContinue = !timedOut && !!rawResult && Date.now() - startTime < BEFORE_CONFIRM_TIMEOUT_MS;
1290
- if (timedOut || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS) {
1334
+ var isTimeout = timedOut || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS;
1335
+ var shouldContinue = !isTimeout && !!rawResult;
1336
+ if (isTimeout) {
1291
1337
  logger.logError({
1292
1338
  title: 'sdk_before_confirm_timeout'
1293
1339
  });
@@ -1297,10 +1343,12 @@ export var ModernElementController = /*#__PURE__*/function () {
1297
1343
  }, {
1298
1344
  shouldContinue: shouldContinue
1299
1345
  });
1300
- _this6.bridge.send(AMSMessageType.BEFORE_CONFIRM_REPLY, {
1346
+ _this6.bridge.send(AMSMessageType.BEFORE_CONFIRM_REPLY, _objectSpread({
1301
1347
  success: true,
1302
1348
  result: !!shouldContinue
1303
- });
1349
+ }, isTimeout ? {
1350
+ isTimeout: true
1351
+ } : {}));
1304
1352
  }).catch(function (error) {
1305
1353
  logger.logError({
1306
1354
  title: 'sdk_before_confirm_error'
@@ -1327,7 +1375,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1327
1375
  var cancelDestroyCallback = function cancelDestroyCallback() {};
1328
1376
  var timer = setTimeout(function () {
1329
1377
  cancelDestroyCallback();
1330
- trackError('ready_handshake_timeout', {
1378
+ _this7.trackError('ready_handshake_timeout', {
1331
1379
  d1: String(MOUNT_TIMEOUT)
1332
1380
  });
1333
1381
  reject({
@@ -1344,7 +1392,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1344
1392
  clearTimeout(timer);
1345
1393
  cancelDestroyCallback();
1346
1394
  if (!((_this7$iframe = _this7.iframe) !== null && _this7$iframe !== void 0 && _this7$iframe.contentWindow)) {
1347
- trackError('iframe_contentwindow_unavailable', {
1395
+ _this7.trackError('iframe_contentwindow_unavailable', {
1348
1396
  d1: 'after_ready_handshake'
1349
1397
  });
1350
1398
  reject({
@@ -1354,7 +1402,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1354
1402
  return;
1355
1403
  }
1356
1404
  _this7.bridge.setTarget(_this7.iframe.contentWindow);
1357
- trackHandshake('ready_handshake_received', {
1405
+ _this7.trackHandshake('ready_handshake_received', {
1358
1406
  m1: _this7._mountStartTime ? Date.now() - _this7._mountStartTime : 0
1359
1407
  });
1360
1408
  resolve();
@@ -1369,7 +1417,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1369
1417
  key: "sendHandshake",
1370
1418
  value: function sendHandshake(setupConfig) {
1371
1419
  this.bridge.send(MessageType.HANDSHAKE, setupConfig);
1372
- trackHandshake('handshake_sent', {
1420
+ this.trackHandshake('handshake_sent', {
1373
1421
  d1: (setupConfig === null || setupConfig === void 0 ? void 0 : setupConfig.sdkVersion) || ''
1374
1422
  });
1375
1423
  }
@@ -1385,7 +1433,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1385
1433
  var cancelDestroyCallback = function cancelDestroyCallback() {};
1386
1434
  var timer = setTimeout(function () {
1387
1435
  cancelDestroyCallback();
1388
- trackError('handshake_ack_timeout', {
1436
+ _this8.trackError('handshake_ack_timeout', {
1389
1437
  d1: String(MOUNT_TIMEOUT)
1390
1438
  });
1391
1439
  reject({
@@ -1400,7 +1448,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1400
1448
  _this8.bridge.once(MessageType.HANDSHAKE_ACK, function () {
1401
1449
  clearTimeout(timer);
1402
1450
  cancelDestroyCallback();
1403
- trackHandshake('handshake_ack_received', {
1451
+ _this8.trackHandshake('handshake_ack_received', {
1404
1452
  m1: _this8._mountStartTime ? Date.now() - _this8._mountStartTime : 0
1405
1453
  });
1406
1454
  resolve();
@@ -1421,14 +1469,14 @@ export var ModernElementController = /*#__PURE__*/function () {
1421
1469
  return _this9.currentPaymentMethodType ? {
1422
1470
  d4: _this9.currentPaymentMethodType
1423
1471
  } : {};
1424
- }));
1472
+ }, normalizeApiInput('submitPayment', params), this.merchantId));
1425
1473
  case 1:
1426
1474
  case "end":
1427
1475
  return _context8.stop();
1428
1476
  }
1429
- }, _callee8);
1477
+ }, _callee8, this);
1430
1478
  }));
1431
- function submitPayment(_x13) {
1479
+ function submitPayment(_x15) {
1432
1480
  return _submitPayment.apply(this, arguments);
1433
1481
  }
1434
1482
  return submitPayment;
@@ -1438,7 +1486,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1438
1486
  value: function () {
1439
1487
  var _doSubmitPayment = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(params) {
1440
1488
  var _this10 = this;
1441
- var _this$options$loading7, _this$options$loading8, isApplePay, _ref6, onBeforeConfirm, serializableParams, startTime, _yield$executeWithTim2, shouldContinue, timedOut, hasBeforeConfirmForApplePay, hasAmount, hasCurrency, cleanups, _result$error5, resultPromise, result, _this$options$loading9, _this$options$loading10;
1489
+ var _this$options$loading7, _this$options$loading8, isApplePay, _ref6, onBeforeConfirm, serializableParams, startTime, _yield$executeWithTim2, shouldContinue, timedOut, isTimeout, hasBeforeConfirmForApplePay, hasAmount, hasCurrency, cleanups, _result$error5, resultPromise, result, _this$options$loading9, _this$options$loading10;
1442
1490
  return _regeneratorRuntime().wrap(function _callee9$(_context9) {
1443
1491
  while (1) switch (_context9.prev = _context9.next) {
1444
1492
  case 0:
@@ -1446,7 +1494,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1446
1494
  _context9.next = 3;
1447
1495
  break;
1448
1496
  }
1449
- trackError('submit_not_ready', {
1497
+ this.trackError('submit_not_ready', {
1450
1498
  d1: this.status
1451
1499
  });
1452
1500
  return _context9.abrupt("return", {
@@ -1461,7 +1509,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1461
1509
  _context9.next = 6;
1462
1510
  break;
1463
1511
  }
1464
- trackError('submit_in_progress', {});
1512
+ this.trackError('submit_in_progress', {});
1465
1513
  return _context9.abrupt("return", {
1466
1514
  status: 'FAIL',
1467
1515
  error: {
@@ -1475,7 +1523,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1475
1523
  isApplePay = this.currentPaymentMethodType === 'APPLEPAY'; // 剥除 onBeforeConfirm 函数,避免 postMessage 序列化报错
1476
1524
  _ref6 = params || {}, onBeforeConfirm = _ref6.onBeforeConfirm, serializableParams = _objectWithoutProperties(_ref6, _excluded2); // ── 非 Apple Pay:同步执行 onBeforeConfirm(submit 前拦截,对齐老 ElementController) ──
1477
1525
  if (!(onBeforeConfirm && !isApplePay)) {
1478
- _context9.next = 31;
1526
+ _context9.next = 32;
1479
1527
  break;
1480
1528
  }
1481
1529
  logger.logInfo({
@@ -1494,11 +1542,13 @@ export var ModernElementController = /*#__PURE__*/function () {
1494
1542
  _yield$executeWithTim2 = _context9.sent;
1495
1543
  shouldContinue = _yield$executeWithTim2.result;
1496
1544
  timedOut = _yield$executeWithTim2.timedOut;
1497
- if (!(timedOut || !shouldContinue || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS)) {
1498
- _context9.next = 22;
1545
+ // 双重校验:timedOut(Promise race)+ startTime(实际时间差),防止竞态误判
1546
+ isTimeout = timedOut || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS;
1547
+ if (!(isTimeout || !shouldContinue)) {
1548
+ _context9.next = 23;
1499
1549
  break;
1500
1550
  }
1501
- if (timedOut) {
1551
+ if (isTimeout) {
1502
1552
  logger.logError({
1503
1553
  title: 'sdk_before_confirm_timeout'
1504
1554
  }, {
@@ -1516,21 +1566,22 @@ export var ModernElementController = /*#__PURE__*/function () {
1516
1566
  return _context9.abrupt("return", {
1517
1567
  status: 'FAIL',
1518
1568
  error: {
1519
- code: 'MERCHANT_CONFIRM_ABORT',
1520
- message: 'Merchant canceled payment.'
1569
+ code: isTimeout ? MERCHANT_CONFIRM_TIMEOUT_CODE : MERCHANT_CONFIRM_ABORT_CODE,
1570
+ message: isTimeout ? 'Merchant confirmation timed out.' : 'Merchant canceled payment.',
1571
+ needChangeSessionForRetry: false
1521
1572
  }
1522
1573
  });
1523
- case 22:
1574
+ case 23:
1524
1575
  logger.logInfo({
1525
1576
  title: 'sdk_before_confirm_success'
1526
1577
  }, {
1527
1578
  paymentMethodType: this.currentPaymentMethodType || 'UNKNOWN',
1528
1579
  path: 'nonApplePay_sync'
1529
1580
  });
1530
- _context9.next = 29;
1581
+ _context9.next = 30;
1531
1582
  break;
1532
- case 25:
1533
- _context9.prev = 25;
1583
+ case 26:
1584
+ _context9.prev = 26;
1534
1585
  _context9.t0 = _context9["catch"](12);
1535
1586
  logger.logError({
1536
1587
  title: 'sdk_before_confirm_error'
@@ -1542,14 +1593,15 @@ export var ModernElementController = /*#__PURE__*/function () {
1542
1593
  return _context9.abrupt("return", {
1543
1594
  status: 'FAIL',
1544
1595
  error: {
1545
- code: 'MERCHANT_CONFIRM_ABORT',
1546
- message: 'Merchant canceled payment.'
1596
+ code: MERCHANT_CONFIRM_ABORT_CODE,
1597
+ message: 'Merchant canceled payment.',
1598
+ needChangeSessionForRetry: false
1547
1599
  }
1548
1600
  });
1549
- case 29:
1550
- _context9.next = 32;
1601
+ case 30:
1602
+ _context9.next = 33;
1551
1603
  break;
1552
- case 31:
1604
+ case 32:
1553
1605
  if (!onBeforeConfirm) {
1554
1606
  logger.logInfo({
1555
1607
  title: 'sdk_before_confirm_skip'
@@ -1558,7 +1610,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1558
1610
  path: isApplePay ? 'applePay_eventBridge' : 'nonApplePay_sync'
1559
1611
  });
1560
1612
  }
1561
- case 32:
1613
+ case 33:
1562
1614
  // Apple Pay: 标记是否有 beforeConfirm,供 SUBMIT 消息的 hasBeforeConfirm 字段使用
1563
1615
  hasBeforeConfirmForApplePay = isApplePay && !!onBeforeConfirm; // ── amount/currency 校验 + 缓存(对齐老 ElementController 逻辑) ──
1564
1616
  hasAmount = !!(serializableParams !== null && serializableParams !== void 0 && serializableParams.amount);
@@ -1575,14 +1627,14 @@ export var ModernElementController = /*#__PURE__*/function () {
1575
1627
  this._merchantAmount = hasAmount && hasCurrency ? serializableParams.amount : null;
1576
1628
  this._merchantCurrency = hasAmount && hasCurrency ? serializableParams.currency : null;
1577
1629
  (_this$options$loading7 = this.options.loading) === null || _this$options$loading7 === void 0 || (_this$options$loading8 = _this$options$loading7.onStartLoading) === null || _this$options$loading8 === void 0 || _this$options$loading8.call(_this$options$loading7);
1578
- trackElement('submit_start', {
1630
+ this.trackElement('submit_start', {
1579
1631
  d1: this.notRedirectAfterComplete ? 'if_required' : 'always'
1580
1632
  });
1581
1633
  // 收集本轮 once 监听的 cleanup:submitPayment 每次注册四类监听,但一轮只会命中部分,
1582
1634
  // 未命中的 once wrapper 绑着旧闭包(旧 onBeforeConfirm / 旧 resolve)会残留并串扰后续提交,
1583
1635
  // 在 submit 终态统一释放(二次 off 幂等,已命中的 once 已自行 off)。
1584
1636
  cleanups = [];
1585
- _context9.prev = 41;
1637
+ _context9.prev = 42;
1586
1638
  resultPromise = new Promise(function (resolve) {
1587
1639
  // 先注册事件监听,再发送 SUBMIT,避免 webapp 快速响应导致消息丢失
1588
1640
  // PC 非 Safari:webapp 委托 SDK 拉起 Apple Pay 拿 token
@@ -1608,45 +1660,45 @@ export var ModernElementController = /*#__PURE__*/function () {
1608
1660
  amount: serializableParams.amount,
1609
1661
  currency: serializableParams.currency
1610
1662
  } : {}));
1611
- _context9.next = 46;
1663
+ _context9.next = 47;
1612
1664
  return resultPromise;
1613
- case 46:
1665
+ case 47:
1614
1666
  result = _context9.sent;
1615
- trackElement('submit_reply', {
1667
+ this.trackElement('submit_reply', {
1616
1668
  d1: (result === null || result === void 0 ? void 0 : result.status) || '',
1617
1669
  d2: (result === null || result === void 0 || (_result$error5 = result.error) === null || _result$error5 === void 0 ? void 0 : _result$error5.code) || ''
1618
1670
  });
1619
1671
  return _context9.abrupt("return", adaptSubmitResult(result));
1620
- case 51:
1621
- _context9.prev = 51;
1622
- _context9.t1 = _context9["catch"](41);
1623
- trackError('submit_error', {
1672
+ case 52:
1673
+ _context9.prev = 52;
1674
+ _context9.t1 = _context9["catch"](42);
1675
+ this.trackError('submit_error', {
1624
1676
  d1: (_context9.t1 === null || _context9.t1 === void 0 ? void 0 : _context9.t1.code) || 'UNKNOWN',
1625
1677
  d2: (_context9.t1 === null || _context9.t1 === void 0 ? void 0 : _context9.t1.message) || ''
1626
1678
  });
1627
1679
  throw _context9.t1;
1628
- case 55:
1629
- _context9.prev = 55;
1680
+ case 56:
1681
+ _context9.prev = 56;
1630
1682
  cleanups.forEach(function (fn) {
1631
1683
  try {
1632
1684
  fn();
1633
- } catch (_unused6) {
1685
+ } catch (_unused7) {
1634
1686
  /* ignore cleanup error */
1635
1687
  }
1636
1688
  });
1637
1689
  (_this$options$loading9 = this.options.loading) === null || _this$options$loading9 === void 0 || (_this$options$loading10 = _this$options$loading9.onEndLoading) === null || _this$options$loading10 === void 0 || _this$options$loading10.call(_this$options$loading9);
1638
- return _context9.finish(55);
1639
- case 59:
1640
- _context9.prev = 59;
1690
+ return _context9.finish(56);
1691
+ case 60:
1692
+ _context9.prev = 60;
1641
1693
  this.isSubmitting = false;
1642
- return _context9.finish(59);
1643
- case 62:
1694
+ return _context9.finish(60);
1695
+ case 63:
1644
1696
  case "end":
1645
1697
  return _context9.stop();
1646
1698
  }
1647
- }, _callee9, this, [[7,, 59, 62], [12, 25], [41, 51, 55, 59]]);
1699
+ }, _callee9, this, [[7,, 60, 63], [12, 26], [42, 52, 56, 60]]);
1648
1700
  }));
1649
- function doSubmitPayment(_x14) {
1701
+ function doSubmitPayment(_x16) {
1650
1702
  return _doSubmitPayment.apply(this, arguments);
1651
1703
  }
1652
1704
  return doSubmitPayment;
@@ -1661,12 +1713,12 @@ export var ModernElementController = /*#__PURE__*/function () {
1661
1713
  case 0:
1662
1714
  return _context10.abrupt("return", runApi('validateFields', function () {
1663
1715
  return _this11.doValidateFields();
1664
- }));
1716
+ }, undefined, undefined, this.merchantId));
1665
1717
  case 1:
1666
1718
  case "end":
1667
1719
  return _context10.stop();
1668
1720
  }
1669
- }, _callee10);
1721
+ }, _callee10, this);
1670
1722
  }));
1671
1723
  function validateFields() {
1672
1724
  return _validateFields.apply(this, arguments);
@@ -1685,7 +1737,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1685
1737
  _context11.next = 3;
1686
1738
  break;
1687
1739
  }
1688
- trackError('validate_not_ready', {
1740
+ this.trackError('validate_not_ready', {
1689
1741
  d1: this.status
1690
1742
  });
1691
1743
  return _context11.abrupt("return", {
@@ -1695,7 +1747,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1695
1747
  this.send(AMSMessageType.VALIDATE);
1696
1748
  return _context11.abrupt("return", new Promise(function (resolve) {
1697
1749
  var timer = setTimeout(function () {
1698
- trackError('validate_fields_timeout', {
1750
+ _this12.trackError('validate_fields_timeout', {
1699
1751
  d1: '15000'
1700
1752
  });
1701
1753
  resolve({
@@ -1705,7 +1757,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1705
1757
  _this12.bridge.once(AMSMessageType.VALIDATE_REPLY, function (payload) {
1706
1758
  clearTimeout(timer);
1707
1759
  var isValid = !!(payload !== null && payload !== void 0 && payload.isValid);
1708
- trackElement('validate_result', {
1760
+ _this12.trackElement('validate_result', {
1709
1761
  d1: isValid ? 'valid' : 'invalid'
1710
1762
  });
1711
1763
  resolve(payload || {
@@ -1738,7 +1790,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1738
1790
  }
1739
1791
  }, _callee12);
1740
1792
  }));
1741
- function updatePayment(_x15) {
1793
+ function updatePayment(_x17) {
1742
1794
  return _updatePayment.apply(this, arguments);
1743
1795
  }
1744
1796
  return updatePayment;
@@ -1752,7 +1804,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1752
1804
  key: "destroy",
1753
1805
  value: function destroy() {
1754
1806
  var _this$iframe;
1755
- trackElement('destroy', {
1807
+ this.trackElement('destroy', {
1756
1808
  d1: this.status
1757
1809
  });
1758
1810
  if (this.status === 'initialized' || this.status === 'destroyed') {
@@ -1869,7 +1921,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1869
1921
  // 清理已存在的 modal
1870
1922
  this.handleCloseModal();
1871
1923
  var mode = device.isMobile ? 'mobile' : 'desktop';
1872
- trackElement('open_modal', {
1924
+ this.trackElement('open_modal', {
1873
1925
  d1: mode,
1874
1926
  d2: (payload === null || payload === void 0 ? void 0 : payload.modalId) || ''
1875
1927
  });
@@ -1881,7 +1933,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1881
1933
  payload.url = url.toString();
1882
1934
  } catch (e) {
1883
1935
  var error = new OpenSDKError('Invalid URL', 'INVALID_MODAL_URL', 'APP_RUNTIME');
1884
- trackError('open_modal_invalid_url', {
1936
+ this.trackError('open_modal_invalid_url', {
1885
1937
  d1: 'INVALID_MODAL_URL',
1886
1938
  d2: (payload === null || payload === void 0 ? void 0 : payload.url) || ''
1887
1939
  });
@@ -1899,9 +1951,10 @@ export var ModernElementController = /*#__PURE__*/function () {
1899
1951
  // 从 appearance 提取主题信息,组装 loadingConfig(对齐 antom.ts openModal 的处理逻辑)
1900
1952
  var appearanceTheme = (payload === null || payload === void 0 || (_payload$appearance = payload.appearance) === null || _payload$appearance === void 0 ? void 0 : _payload$appearance.theme) || 'default';
1901
1953
  var themeConfig = (_themeColorMap$appear = themeColorMap[appearanceTheme]) !== null && _themeColorMap$appear !== void 0 ? _themeColorMap$appear : themeColorMap.default;
1954
+ var appearanceVariables = payload === null || payload === void 0 || (_payload$appearance2 = payload.appearance) === null || _payload$appearance2 === void 0 ? void 0 : _payload$appearance2.variables;
1902
1955
  var loadingConfig = {
1903
1956
  theme: themeConfig.theme,
1904
- backgroundColor: (payload === null || payload === void 0 || (_payload$appearance2 = payload.appearance) === null || _payload$appearance2 === void 0 || (_payload$appearance2 = _payload$appearance2.variables) === null || _payload$appearance2 === void 0 ? void 0 : _payload$appearance2['background-primary']) || themeConfig.backgroundColor
1957
+ backgroundColor: (appearanceVariables === null || appearanceVariables === void 0 ? void 0 : appearanceVariables['color-background-primary']) || (appearanceVariables === null || appearanceVariables === void 0 ? void 0 : appearanceVariables['background-primary']) || themeConfig.backgroundColor
1905
1958
  };
1906
1959
 
1907
1960
  // 调用 openModal 工具函数创建 DOM(overlay + modal + iframe + 动画 + close icon + loading)
@@ -1920,7 +1973,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1920
1973
  destroy = _openModal.destroy;
1921
1974
  var offReady = modalBridge.once(MessageType.MODAL_TRANSFER_READY, function (_payload, _ports, meta) {
1922
1975
  if (meta && meta.source !== iframe.contentWindow) return;
1923
- trackElement('modal_loaded', {
1976
+ _this15.trackElement('modal_loaded', {
1924
1977
  d1: payload.url
1925
1978
  });
1926
1979
  // 确保 target 已设置(如果 load 事件尚未触发,在此设置)
@@ -1931,7 +1984,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1931
1984
  if (iframeOrigin && iframeOrigin !== 'null') {
1932
1985
  modalBridge.setOrigin(iframeOrigin);
1933
1986
  }
1934
- } catch (_unused7) {
1987
+ } catch (_unused8) {
1935
1988
  // URL 解析失败时保持默认 origin
1936
1989
  }
1937
1990
  // 如果 payload 有 appearance,通过 TRANSFER_MODAL_APPEARANCE 消息发送给 modal
@@ -1949,7 +2002,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1949
2002
  this.modalIframe = iframe;
1950
2003
  this.modalDestroy = function () {
1951
2004
  if (payload.closeConfirm) {
1952
- trackElement('modal_close_confirm', {
2005
+ _this15.trackElement('modal_close_confirm', {
1953
2006
  d1: 'confirm_resolved'
1954
2007
  });
1955
2008
  }
@@ -1966,7 +2019,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1966
2019
  key: "handleCloseModal",
1967
2020
  value: function handleCloseModal() {
1968
2021
  // 如果有等待中的 closeConfirm,resolve 它
1969
- trackElement('modal_closed', {
2022
+ this.trackElement('modal_closed', {
1970
2023
  d1: this.modalBridge ? 'with_bridge' : 'no_bridge'
1971
2024
  });
1972
2025
  if (this.modalBridge) {