@alipay/ams-checkout 0.0.1784542444-dev.2 → 0.0.1784542444-dev.4

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.
@@ -30,7 +30,7 @@ export var v2AppMarmotMap = {
30
30
  light_sandbox: 'https://checkout.antom.com',
31
31
  prod: 'https://checkout.antom.com'
32
32
  };
33
- export var sdkVersion = "0.0.1784542444-dev.2";
33
+ export var sdkVersion = "0.0.1784542444-dev.4";
34
34
 
35
35
  /**
36
36
  * @description: 目前应用层分为v1和v2,会存在两个应用版本号不是同步发布的情况。所以需要把默认的应用版本号配置抽离出来。
@@ -29,10 +29,11 @@ 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, sdkQuery, getLocaleFromRenderData, getDevReqConfig, getMetaData, buildPageUrl, debugError, debug, MessageType, request, parseHostSign, SDKBridge, parseTrackerId, oneAccountQuery, OpenSDKError, awaitWrap, themeColorMap, ApplePayHostService, checkSessionData, sdkTracker } from "../../../../modern/tools";
32
+ import { openModal, showToast, sdkQuery, getLocaleFromRenderData, getDevReqConfig, getMetaData, buildPageUrl, debugError, debug, MessageType, request, parseHostSign, SDKBridge, parseTrackerId, oneAccountQuery, OpenSDKError, awaitWrap, themeColorMap, ApplePayHostService, buildRecurringPaymentRequest, checkSessionData, sdkTracker } from "../../../../modern/tools";
33
33
  import { device } from "../../../../util";
34
34
  import { EventCallbackCode } from "../type";
35
35
  import { adaptSubmitResult, adaptAppearance } from "./adapter";
36
+ import { safeParse } from "../util";
36
37
  import { v4 as uuid } from 'uuid';
37
38
 
38
39
  // ============================================================
@@ -43,18 +44,45 @@ import { v4 as uuid } from 'uuid';
43
44
  // ============================================================
44
45
 
45
46
  var TRACK_CODE_PREFIX = '7982';
47
+
48
+ // 缓存解析出的 merchantId,供埋点 helper 在任意阶段统一带上
49
+ var _merchantId = '';
46
50
  var track = function track(phase, msg) {
47
51
  var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
48
52
  try {
49
53
  var code = "".concat(TRACK_CODE_PREFIX).concat(phase === 'error' ? '' : phase);
54
+ // LogItem 类型未暴露 merchant_id 字段,但运行时 tracker 会透传,
55
+ // 故用断言保留该字段名供下游埋点消费
50
56
  sdkTracker.log(_objectSpread({
51
57
  code: code,
52
- msg: msg
58
+ msg: msg,
59
+ merchant_id: _merchantId
53
60
  }, extra));
54
61
  } catch (_unused) {
55
62
  /* 埋点失败绝不影响主流程 */
56
63
  }
57
64
  };
65
+
66
+ /**
67
+ * 优先取 sessionData 解析出的 clientId;
68
+ * 缺失时从容错角度回落到 extendInfo 中的 merchantId(URL 编码需解码)。
69
+ * 全程容错:任一步骤缺失/解析失败都返回空串,绝不抛异常。
70
+ */
71
+ var resolveMerchantId = function resolveMerchantId(parseData) {
72
+ if (parseData !== null && parseData !== void 0 && parseData.clientId) {
73
+ return parseData.clientId;
74
+ }
75
+ try {
76
+ var info = safeParse(parseData === null || parseData === void 0 ? void 0 : parseData.extendInfo, {});
77
+ var merchantId = info === null || info === void 0 ? void 0 : info.merchantId;
78
+ if (!merchantId || typeof merchantId !== 'string') {
79
+ return '';
80
+ }
81
+ return decodeURIComponent(merchantId);
82
+ } catch (_unused2) {
83
+ return '';
84
+ }
85
+ };
58
86
  var trackMount = function trackMount(msg) {
59
87
  var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
60
88
  return track('mount', msg, extra);
@@ -88,6 +116,9 @@ var recoverSdkQueryBusinessResponse = function recoverSdkQueryBusinessResponse(e
88
116
  var MOUNT_TIMEOUT = 16000;
89
117
  var logger = new Logger(LogConfig, true);
90
118
  var ELEMENT_DESTROYED_MESSAGE = 'Element already destroyed';
119
+ // 订阅/分期场景 ApplePaySession 版本:recurringPaymentRequest 需 v12+。
120
+ // 对齐老链路 plugin/applepay/interface.ts 的 APPLE_PAY_RECURRING_VERSION = 14。
121
+ var APPLE_PAY_RECURRING_VERSION = 14;
91
122
  var getDestroyedError = function getDestroyedError() {
92
123
  return {
93
124
  code: ERRORMESSAGE.UI_STATE_ERROR.code,
@@ -142,6 +173,7 @@ var HostSDKBridge = /*#__PURE__*/function (_SDKBridge) {
142
173
  var AMSMessageType = {
143
174
  VALIDATE: 'OPENSDK@VALIDATE',
144
175
  VALIDATE_REPLY: 'OPENSDK@VALIDATE_REPLY',
176
+ SHOWTOAST: 'OPENSDK@SHOWTOAST',
145
177
  GET_APPLE_PAY_TOKEN: 'OPENSDK@GET_APPLE_PAY_TOKEN',
146
178
  GET_APPLE_PAY_TOKEN_REPLY: 'OPENSDK@GET_APPLE_PAY_TOKEN_REPLY',
147
179
  // Web element GP:iframe 委托 SDK/父 frame 调 loadPaymentData(解决跨域 iframe 二次 show() 被拒问题)
@@ -269,7 +301,7 @@ export var ModernElementController = /*#__PURE__*/function () {
269
301
  if (iframeOrigin && iframeOrigin !== 'null') {
270
302
  this.bridge.setOrigin(iframeOrigin);
271
303
  }
272
- } catch (_unused2) {
304
+ } catch (_unused3) {
273
305
  // URL 解析失败时保持默认 origin
274
306
  }
275
307
  } else {
@@ -385,7 +417,7 @@ export var ModernElementController = /*#__PURE__*/function () {
385
417
  _this = this,
386
418
  _parseData$paymentMet,
387
419
  _sdkQueryResult$data;
388
- var sessionData, parseData, isConnect, paymentSessionConfig, genSdkQueryPromise, genOneAccountQueryPromise, promises, cancelDestroyCallback, destroyPromise, queryPromise, _yield$Promise$race$f, _yield$Promise$race$f2, sdkQueryResult, oneAccountQueryResult, _sdkQueryResult$error, _sdkQueryResult$error2, _oneAccountQueryResul, _oneAccountQueryResul2, preferredLocale, locale, renderDataError;
420
+ var sessionData, parseData, lastEnv, isConnect, paymentSessionConfig, genSdkQueryPromise, genOneAccountQueryPromise, promises, cancelDestroyCallback, destroyPromise, queryPromise, _yield$Promise$race$f, _yield$Promise$race$f2, sdkQueryResult, oneAccountQueryResult, _sdkQueryResult$error, _sdkQueryResult$error2, _oneAccountQueryResul, _oneAccountQueryResul2, preferredLocale, locale, renderDataError;
389
421
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
390
422
  while (1) switch (_context2.prev = _context2.next) {
391
423
  case 0:
@@ -395,15 +427,23 @@ export var ModernElementController = /*#__PURE__*/function () {
395
427
  this.notRedirectAfterComplete = renderOptions.notRedirectAfterComplete || false;
396
428
  sessionData = this.options.sessionData; // checkSessionData 失败会 throw AntomSDKError(SESSION_DATA_INVALID),
397
429
  // 冒泡到 mount 的 catch 由 mount_error 统一上报,此处无需额外处理
398
- parseData = checkSessionData(sessionData, 'ELEMENT_PAYMENT'); // 初始化 request 全局配置,使 sdkQuery 能正确发起请求
430
+ parseData = checkSessionData(sessionData, 'ELEMENT_PAYMENT');
431
+ lastEnv = this.options.environment === 'sandbox' ? 'sandbox' : 'prod';
432
+ this.options.environment;
433
+ // 解析 merchantId(优先 clientId,缺失时容错回落到 extendInfo.merchantId),
434
+ // 缓存到模块级变量,使后续所有 trackXxx 埋点统一带上
435
+ _merchantId = resolveMerchantId(parseData);
436
+
437
+ // 初始化 request 全局配置,使 sdkQuery 能正确发起请求
399
438
  // tracker: sdkTracker —— 接入 HTTP 层自动埋点(B 套),上报每个请求的成败/RTT/错误码
400
439
  // 与 antom.ts 入口对齐;不传则 sdkQuery/submitPay/inquiry 等网络细节不可观测
401
- request.setGlobalOptions({
440
+ request.setGlobalOptions(_objectSpread(_objectSpread({
402
441
  hostSign: parseHostSign(sessionData),
403
- env: this.options.environment,
404
- sdkVersion: "0.0.1784542444-dev.2" || '',
442
+ env: lastEnv
443
+ }, getDevReqConfig()), {}, {
444
+ sdkVersion: "0.0.1784542444-dev.4" || '',
405
445
  tracker: sdkTracker
406
- });
446
+ }));
407
447
  isConnect = !!(parseData !== null && parseData !== void 0 && (_parseData$connectFac = parseData.connectFactor) !== null && _parseData$connectFac !== void 0 && _parseData$connectFac.enableConnect);
408
448
  paymentSessionConfig = parseData === null || parseData === void 0 ? void 0 : parseData.paymentSessionConfig;
409
449
  genSdkQueryPromise = function genSdkQueryPromise() {
@@ -441,9 +481,9 @@ export var ModernElementController = /*#__PURE__*/function () {
441
481
  });
442
482
  });
443
483
  queryPromise = Promise.all(promises);
444
- _context2.next = 16;
484
+ _context2.next = 19;
445
485
  return Promise.race([queryPromise, destroyPromise]).finally(cancelDestroyCallback);
446
- case 16:
486
+ case 19:
447
487
  _yield$Promise$race$f = _context2.sent;
448
488
  _yield$Promise$race$f2 = _slicedToArray(_yield$Promise$race$f, 2);
449
489
  sdkQueryResult = _yield$Promise$race$f2[0];
@@ -482,6 +522,7 @@ export var ModernElementController = /*#__PURE__*/function () {
482
522
  sessionMetaData: parseData,
483
523
  // 更新字段,对应老的doMain
484
524
  merchantDomain: window.location.hostname,
525
+ doMain: window.location.hostname,
485
526
  // 更新字段,对应老的appearance,结构按新的来
486
527
  appearance: adaptAppearance((renderOptions === null || renderOptions === void 0 ? void 0 : renderOptions.appearance) || this.options.appearance, renderOptions.merchantAppointParam),
487
528
  // 原老字段
@@ -489,7 +530,7 @@ export var ModernElementController = /*#__PURE__*/function () {
489
530
  paymentMethodCategoryType: paymentSessionConfig === null || paymentSessionConfig === void 0 ? void 0 : paymentSessionConfig.paymentMethodCategoryType,
490
531
  productSceneVersion: paymentSessionConfig === null || paymentSessionConfig === void 0 ? void 0 : paymentSessionConfig.productSceneVersion,
491
532
  trackId: parseTrackerId(sessionData),
492
- merchantId: parseData === null || parseData === void 0 ? void 0 : parseData.clientId,
533
+ merchantId: _merchantId,
493
534
  paymentMethodType: parseData === null || parseData === void 0 || (_parseData$paymentMet = parseData.paymentMethodInfoView) === null || _parseData$paymentMet === void 0 ? void 0 : _parseData$paymentMet.paymentMethodType
494
535
  },
495
536
  // 原老字段
@@ -497,17 +538,17 @@ export var ModernElementController = /*#__PURE__*/function () {
497
538
  // 新sdk字段
498
539
  locale: locale,
499
540
  // 新sdk字段
500
- sdkVersion: "0.0.1784542444-dev.2" || '',
541
+ sdkVersion: "0.0.1784542444-dev.4" || '',
501
542
  // 新sdk字段
502
543
  merchantId: (sdkQueryResult === null || sdkQueryResult === void 0 || (_sdkQueryResult$data = sdkQueryResult.data) === null || _sdkQueryResult$data === void 0 ? void 0 : _sdkQueryResult$data.merchantId) || '',
503
544
  // 新sdk字段
504
- env: this.options.environment === 'sandbox' ? 'sandbox' : 'prod',
545
+ env: lastEnv,
505
546
  // 新sdk字段,开发环境调试使用
506
547
  _requestConfig: _objectSpread({
507
- env: this.options.environment === 'sandbox' ? 'sandbox' : 'prod'
548
+ env: lastEnv
508
549
  }, getDevReqConfig())
509
550
  });
510
- case 26:
551
+ case 29:
511
552
  case "end":
512
553
  return _context2.stop();
513
554
  }
@@ -614,11 +655,18 @@ export var ModernElementController = /*#__PURE__*/function () {
614
655
  this.bridge.on(MessageType.HEIGHT_UPDATE, function (height) {
615
656
  if (_this2.iframe) _this2.iframe.style.height = "".concat(height, "px");
616
657
  });
617
- this.bridge.on(MessageType.REDIRECT, function (payload, _ports, meta) {
658
+ this.bridge.on(AMSMessageType.SHOWTOAST, function (payload, _ports, meta) {
618
659
  var _this2$iframe, _this2$modalIframe;
619
660
  if (meta && meta.source !== ((_this2$iframe = _this2.iframe) === null || _this2$iframe === void 0 ? void 0 : _this2$iframe.contentWindow) && meta.source !== ((_this2$modalIframe = _this2.modalIframe) === null || _this2$modalIframe === void 0 ? void 0 : _this2$modalIframe.contentWindow)) {
620
661
  return;
621
662
  }
663
+ showToast(payload);
664
+ });
665
+ this.bridge.on(MessageType.REDIRECT, function (payload, _ports, meta) {
666
+ var _this2$iframe2, _this2$modalIframe2;
667
+ if (meta && meta.source !== ((_this2$iframe2 = _this2.iframe) === null || _this2$iframe2 === void 0 ? void 0 : _this2$iframe2.contentWindow) && meta.source !== ((_this2$modalIframe2 = _this2.modalIframe) === null || _this2$modalIframe2 === void 0 ? void 0 : _this2$modalIframe2.contentWindow)) {
668
+ return;
669
+ }
622
670
  var url = payload.url,
623
671
  mode = payload.mode,
624
672
  appLinkUrl = payload.appLinkUrl,
@@ -672,8 +720,8 @@ export var ModernElementController = /*#__PURE__*/function () {
672
720
  }
673
721
  });
674
722
  this.bridge.on(MessageType.OPEN_MODAL, function (payload, _ports, meta) {
675
- var _this2$iframe2;
676
- if (meta && meta.source !== ((_this2$iframe2 = _this2.iframe) === null || _this2$iframe2 === void 0 ? void 0 : _this2$iframe2.contentWindow)) {
723
+ var _this2$iframe3;
724
+ if (meta && meta.source !== ((_this2$iframe3 = _this2.iframe) === null || _this2$iframe3 === void 0 ? void 0 : _this2$iframe3.contentWindow)) {
677
725
  return;
678
726
  }
679
727
  _this2.handleOpenModal(payload);
@@ -682,8 +730,8 @@ export var ModernElementController = /*#__PURE__*/function () {
682
730
  });
683
731
  });
684
732
  this.bridge.on(MessageType.DESTROY_ELEMENT, function (_payload, _ports, meta) {
685
- var _this2$iframe3;
686
- if (meta && meta.source !== ((_this2$iframe3 = _this2.iframe) === null || _this2$iframe3 === void 0 ? void 0 : _this2$iframe3.contentWindow)) {
733
+ var _this2$iframe4;
734
+ if (meta && meta.source !== ((_this2$iframe4 = _this2.iframe) === null || _this2$iframe4 === void 0 ? void 0 : _this2$iframe4.contentWindow)) {
687
735
  return;
688
736
  }
689
737
  _this2.destroy();
@@ -714,7 +762,7 @@ export var ModernElementController = /*#__PURE__*/function () {
714
762
  var _handleGetApplePayToken = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(payload, onBeforeConfirm) {
715
763
  var _paymentMethod,
716
764
  _this3 = this;
717
- var sessionData, applePayProps, paymentRequest, merchantCapabilities, merchantInfo, paymentAmount, supportedNetworks, version, requiredBillingContactFields, requiredShippingContactFields, finalAmount, finalCurrency, capturedResult, service, _capturedResult, errCode;
765
+ var sessionData, applePayProps, paymentRequest, merchantCapabilities, merchantInfo, paymentAmount, supportedNetworks, version, requiredBillingContactFields, requiredShippingContactFields, finalAmount, finalCurrency, capturedResult, recurringRequest, service, _capturedResult, errCode;
718
766
  return _regeneratorRuntime().wrap(function _callee5$(_context5) {
719
767
  while (1) switch (_context5.prev = _context5.next) {
720
768
  case 0:
@@ -748,21 +796,35 @@ export var ModernElementController = /*#__PURE__*/function () {
748
796
  if (this._merchantCurrency) {
749
797
  finalCurrency = this._merchantCurrency;
750
798
  }
799
+ // 订阅场景:从 sessionData 提取 recurringInfo 构造 recurringPaymentRequest。
800
+ // 对齐老 ApplePaySdk 链路(parseData.paymentSessionFactor.recurringInfo)与
801
+ // Express 链路(applePayHostToken.ts),否则 Chrome 非 Safari 会降级为普通支付弹窗。
802
+ recurringRequest = buildRecurringPaymentRequest(sessionData, merchantInfo, {
803
+ value: finalAmount,
804
+ currency: finalCurrency
805
+ });
751
806
  service = new ApplePayHostService({
752
- paymentRequest: {
807
+ paymentRequest: _objectSpread({
753
808
  countryCode: merchantInfo === null || merchantInfo === void 0 ? void 0 : merchantInfo.countryCode,
754
809
  currencyCode: finalCurrency,
755
810
  merchantCapabilities: merchantCapabilities,
756
811
  supportedNetworks: supportedNetworks,
757
812
  requiredBillingContactFields: requiredBillingContactFields,
758
813
  requiredShippingContactFields: requiredShippingContactFields,
759
- total: {
814
+ total: recurringRequest ? {
815
+ type: 'final',
816
+ label: recurringRequest.regularBilling.label,
817
+ amount: finalAmount
818
+ } : {
760
819
  type: 'final',
761
820
  label: (merchantInfo === null || merchantInfo === void 0 ? void 0 : merchantInfo.merchantName) || 'Payment',
762
821
  amount: finalAmount
763
822
  },
764
- version: version
765
- },
823
+ version: recurringRequest ? APPLE_PAY_RECURRING_VERSION : version
824
+ }, recurringRequest ? {
825
+ lineItems: [recurringRequest.regularBilling],
826
+ recurringPaymentRequest: recurringRequest
827
+ } : {}),
766
828
  enableModalCloseListener: true,
767
829
  callbacks: {
768
830
  validateMerchant: function () {
@@ -886,10 +948,10 @@ export var ModernElementController = /*#__PURE__*/function () {
886
948
  }()
887
949
  }
888
950
  });
889
- _context5.prev = 14;
890
- _context5.next = 17;
951
+ _context5.prev = 15;
952
+ _context5.next = 18;
891
953
  return service.startPay();
892
- case 17:
954
+ case 18:
893
955
  trackElement('applepay_token_success', {
894
956
  d1: (_capturedResult = capturedResult) !== null && _capturedResult !== void 0 && _capturedResult.token ? 'has_token' : 'no_token'
895
957
  });
@@ -897,11 +959,11 @@ export var ModernElementController = /*#__PURE__*/function () {
897
959
  success: true,
898
960
  result: capturedResult
899
961
  });
900
- _context5.next = 25;
962
+ _context5.next = 26;
901
963
  break;
902
- case 21:
903
- _context5.prev = 21;
904
- _context5.t0 = _context5["catch"](14);
964
+ case 22:
965
+ _context5.prev = 22;
966
+ _context5.t0 = _context5["catch"](15);
905
967
  // 商户验证失败已在 validateMerchant 内单独埋点(applepay_merchant_validate_failed),此处跳过避免重复
906
968
  if ((_context5.t0 === null || _context5.t0 === void 0 ? void 0 : _context5.t0.errorCode) !== 'APPLE_PAY_PAYMENT_SESSION_REQUEST_FAILED') {
907
969
  errCode = (_context5.t0 === null || _context5.t0 === void 0 ? void 0 : _context5.t0.errorCode) || 'APPLE_PAY_NOT_SUPPORTED'; // 用户主动取消单独标记,便于区分取消与真实失败
@@ -922,11 +984,11 @@ export var ModernElementController = /*#__PURE__*/function () {
922
984
  errorCode: (_context5.t0 === null || _context5.t0 === void 0 ? void 0 : _context5.t0.errorCode) || 'APPLE_PAY_NOT_SUPPORTED'
923
985
  }
924
986
  });
925
- case 25:
987
+ case 26:
926
988
  case "end":
927
989
  return _context5.stop();
928
990
  }
929
- }, _callee5, this, [[14, 21]]);
991
+ }, _callee5, this, [[15, 22]]);
930
992
  }));
931
993
  function handleGetApplePayToken(_x4, _x5) {
932
994
  return _handleGetApplePayToken.apply(this, arguments);
@@ -1036,7 +1098,15 @@ export var ModernElementController = /*#__PURE__*/function () {
1036
1098
  var script = document.createElement('script');
1037
1099
  script.src = 'https://pay.google.com/gp/p/js/pay.js';
1038
1100
  script.async = true;
1039
- document.body.appendChild(script);
1101
+
1102
+ // 当判断条件成立时,代表 document.body.appendChild 方法已被劫持
1103
+ if (document.body.appendChild !== Node.prototype.appendChild) {
1104
+ // 使用原生 appendChild 避免微前端沙箱(如 qiankun)将动态 <script> 劫持为 fetch 加载,
1105
+ // 导致不支持 CORS 的第三方脚本(如 pay.google.com)加载失败
1106
+ Node.prototype.appendChild.call(document.body, script);
1107
+ } else {
1108
+ document.body.appendChild(script);
1109
+ }
1040
1110
  script.onload = function () {
1041
1111
  loadAndPay();
1042
1112
  };
@@ -1436,7 +1506,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1436
1506
  cleanups.forEach(function (fn) {
1437
1507
  try {
1438
1508
  fn();
1439
- } catch (_unused4) {
1509
+ } catch (_unused5) {
1440
1510
  /* ignore cleanup error */
1441
1511
  }
1442
1512
  });
@@ -1714,7 +1784,7 @@ export var ModernElementController = /*#__PURE__*/function () {
1714
1784
  if (iframeOrigin && iframeOrigin !== 'null') {
1715
1785
  modalBridge.setOrigin(iframeOrigin);
1716
1786
  }
1717
- } catch (_unused5) {
1787
+ } catch (_unused6) {
1718
1788
  // URL 解析失败时保持默认 origin
1719
1789
  }
1720
1790
  // 如果 payload 有 appearance,通过 TRANSFER_MODAL_APPEARANCE 消息发送给 modal