@alipay/ams-checkout 0.0.1783323899-dev.2 → 0.0.1783403875-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.
- package/ams-checkout.js +3 -4
- package/dist/ams-checkout.min.js +1 -2
- package/esm/config/index.d.ts +0 -7
- package/esm/config/index.js +2 -2
- package/esm/constant/element.d.ts +1 -2
- package/esm/constant/element.js +0 -1
- package/esm/core/component/ckp/index.d.ts +1 -1
- package/esm/core/component/ckp/index.js +5 -2
- package/esm/core/component/element/elementController/index.d.ts +3 -3
- package/esm/core/component/element/elementController/index.js +59 -42
- package/esm/core/component/element/elementProcessor/baseElementProcessor.d.ts +1 -0
- package/esm/core/component/element/elementProcessor/baseElementProcessor.js +1 -0
- package/esm/core/component/element/elementProcessor/convertPaymentMethods.d.ts +22 -0
- package/esm/core/component/element/elementProcessor/convertPaymentMethods.js +159 -0
- package/esm/core/component/element/elementProcessor/paymentProcessor.d.ts +5 -0
- package/esm/core/component/element/elementProcessor/paymentProcessor.js +105 -34
- package/esm/core/component/element/index.d.ts +1 -4
- package/esm/core/component/element/index.js +4 -19
- package/esm/core/component/element/mock.js +1 -1
- package/esm/core/component/element/type.d.ts +77 -16
- package/esm/core/component/element/util.d.ts +9 -2
- package/esm/core/component/element/util.js +3 -2
- package/esm/foundation/service/event-center.js +10 -13
- package/esm/modern/index.d.ts +1 -5
- package/esm/modern/index.js +51 -1
- package/esm/modern/stageName.d.ts +3 -0
- package/esm/modern/stageName.js +1 -0
- package/esm/plugin/component/channel.d.ts +2 -2
- package/esm/plugin/component/channel.js +18 -18
- package/esm/types/index.d.ts +4 -2
- package/esm/util/beforeConfirm.d.ts +4 -2
- package/esm/util/beforeConfirm.js +15 -14
- package/esm/util/logger.js +2 -1
- package/package.json +9 -18
- package/types.d.ts +94 -784
- package/types.untrimmed.d.ts +108 -931
- package/dist/ams-checkout.min.js.map +0 -1
- package/esm/core/component/element/modernElementController/adapter.d.ts +0 -19
- package/esm/core/component/element/modernElementController/adapter.js +0 -73
- package/esm/core/component/element/modernElementController/index.d.ts +0 -149
- package/esm/core/component/element/modernElementController/index.js +0 -1673
- package/esm/modern/global.d.ts +0 -3
- package/esm/modern/tools.js +0 -1
|
@@ -1,1673 +0,0 @@
|
|
|
1
|
-
var _excluded = ["onStatusChange"],
|
|
2
|
-
_excluded2 = ["onBeforeConfirm"];
|
|
3
|
-
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
-
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
5
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
8
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
9
|
-
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
10
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
11
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
12
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
13
|
-
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
14
|
-
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
15
|
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
16
|
-
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
17
|
-
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
18
|
-
function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get.bind(); } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
|
|
19
|
-
function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
|
|
20
|
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
|
|
21
|
-
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
22
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
|
|
23
|
-
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
|
|
24
|
-
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
|
|
25
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
26
|
-
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
|
|
27
|
-
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
28
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
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
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
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";
|
|
33
|
-
import { device } from "../../../../util";
|
|
34
|
-
import { EventCallbackCode } from "../type";
|
|
35
|
-
import { adaptSubmitResult, adaptAppearance } from "./adapter";
|
|
36
|
-
import { v4 as uuid } from 'uuid';
|
|
37
|
-
|
|
38
|
-
// ============================================================
|
|
39
|
-
// 埋点 helper(不改 opensdk 源码,复用 sdkTracker 单例,trackId 已自动注入)
|
|
40
|
-
// code 规约:7982 + 阶段后缀,与 opensdk internalTracker 对齐
|
|
41
|
-
// 7982mount / 7982handshake / 7982element / 7982(异常无后缀)
|
|
42
|
-
// 只插入调用,不影响任何运行逻辑
|
|
43
|
-
// ============================================================
|
|
44
|
-
|
|
45
|
-
var TRACK_CODE_PREFIX = '7982';
|
|
46
|
-
var track = function track(phase, msg) {
|
|
47
|
-
var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
48
|
-
try {
|
|
49
|
-
var code = "".concat(TRACK_CODE_PREFIX).concat(phase === 'error' ? '' : phase);
|
|
50
|
-
sdkTracker.log(_objectSpread({
|
|
51
|
-
code: code,
|
|
52
|
-
msg: msg
|
|
53
|
-
}, extra));
|
|
54
|
-
} catch (_unused) {
|
|
55
|
-
/* 埋点失败绝不影响主流程 */
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
var trackMount = function trackMount(msg) {
|
|
59
|
-
var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
60
|
-
return track('mount', msg, extra);
|
|
61
|
-
};
|
|
62
|
-
var trackHandshake = function trackHandshake(msg) {
|
|
63
|
-
var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
64
|
-
return track('handshake', msg, extra);
|
|
65
|
-
};
|
|
66
|
-
var trackElement = function trackElement(msg) {
|
|
67
|
-
var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
68
|
-
return track('element', msg, extra);
|
|
69
|
-
};
|
|
70
|
-
var trackError = function trackError(msg) {
|
|
71
|
-
var extra = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
72
|
-
return track('error', msg, extra);
|
|
73
|
-
};
|
|
74
|
-
import CallApp from "../../../../util/intl-callapp/es/main";
|
|
75
|
-
import { getApplePayPaymentSession } from "../../../../service";
|
|
76
|
-
import { BusManager, BusMessage } from "../../../bus";
|
|
77
|
-
import { ApplePayActionEnum } from "../../../bus/interface";
|
|
78
|
-
import { ERRORMESSAGE, PROMISE_CALLBACK_CODE } from "../../../../constant";
|
|
79
|
-
import { LogConfig, Logger } from "../../../../util/logger";
|
|
80
|
-
import { executeWithTimeout, BEFORE_CONFIRM_TIMEOUT_MS } from "../../../../util/beforeConfirm";
|
|
81
|
-
var recoverSdkQueryBusinessResponse = function recoverSdkQueryBusinessResponse(error) {
|
|
82
|
-
var response = error === null || error === void 0 ? void 0 : error.response;
|
|
83
|
-
if ((response === null || response === void 0 ? void 0 : response.success) === false) {
|
|
84
|
-
return response;
|
|
85
|
-
}
|
|
86
|
-
throw error;
|
|
87
|
-
};
|
|
88
|
-
var MOUNT_TIMEOUT = 16000;
|
|
89
|
-
var logger = new Logger(LogConfig, true);
|
|
90
|
-
/**
|
|
91
|
-
* HostSDKBridge 扩展 SDKBridge,暴露 setTarget 方法供 HOST 模式使用
|
|
92
|
-
*/
|
|
93
|
-
var HostSDKBridge = /*#__PURE__*/function (_SDKBridge) {
|
|
94
|
-
_inherits(HostSDKBridge, _SDKBridge);
|
|
95
|
-
var _super = _createSuper(HostSDKBridge);
|
|
96
|
-
function HostSDKBridge(mode, scope) {
|
|
97
|
-
_classCallCheck(this, HostSDKBridge);
|
|
98
|
-
return _super.call(this, mode, scope);
|
|
99
|
-
}
|
|
100
|
-
_createClass(HostSDKBridge, [{
|
|
101
|
-
key: "setTarget",
|
|
102
|
-
value:
|
|
103
|
-
// 暴露 protected 的 setTarget 方法
|
|
104
|
-
function setTarget(window) {
|
|
105
|
-
_get(_getPrototypeOf(HostSDKBridge.prototype), "setTarget", this).call(this, window);
|
|
106
|
-
}
|
|
107
|
-
}, {
|
|
108
|
-
key: "setDebugCallback",
|
|
109
|
-
value: function setDebugCallback() {
|
|
110
|
-
var _get2;
|
|
111
|
-
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
112
|
-
args[_key] = arguments[_key];
|
|
113
|
-
}
|
|
114
|
-
(_get2 = _get(_getPrototypeOf(HostSDKBridge.prototype), "setDebugCallback", this)).call.apply(_get2, [this].concat(args));
|
|
115
|
-
}
|
|
116
|
-
}], [{
|
|
117
|
-
key: "getGlobalBridge",
|
|
118
|
-
value: function getGlobalBridge(mode) {
|
|
119
|
-
return _get(_getPrototypeOf(HostSDKBridge), "getGlobalBridge", this).call(this, mode);
|
|
120
|
-
}
|
|
121
|
-
}]);
|
|
122
|
-
return HostSDKBridge;
|
|
123
|
-
}(SDKBridge);
|
|
124
|
-
/**
|
|
125
|
-
* AMSElement 特有的消息类型(非标准 MessageType,webapp 需配合实现)
|
|
126
|
-
* 使用索引签名兼容,避免 as any
|
|
127
|
-
*
|
|
128
|
-
* GET_APPLE_PAY_TOKEN / REPLY:PC 非 Safari Apple Pay 委托给 SDK 域处理的桥协议。
|
|
129
|
-
* webapp 发 REQUEST → SDK 跑 ApplePaySdk.startPay 弹 Apple modal → REPLY 回传结果。
|
|
130
|
-
*/
|
|
131
|
-
var AMSMessageType = {
|
|
132
|
-
VALIDATE: 'OPENSDK@VALIDATE',
|
|
133
|
-
VALIDATE_REPLY: 'OPENSDK@VALIDATE_REPLY',
|
|
134
|
-
GET_APPLE_PAY_TOKEN: 'OPENSDK@GET_APPLE_PAY_TOKEN',
|
|
135
|
-
GET_APPLE_PAY_TOKEN_REPLY: 'OPENSDK@GET_APPLE_PAY_TOKEN_REPLY',
|
|
136
|
-
// Web element GP:iframe 委托 SDK/父 frame 调 loadPaymentData(解决跨域 iframe 二次 show() 被拒问题)
|
|
137
|
-
GET_GOOGLE_PAY_TOKEN: 'OPENSDK@GET_GOOGLE_PAY_TOKEN',
|
|
138
|
-
GET_GOOGLE_PAY_TOKEN_REPLY: 'OPENSDK@GET_GOOGLE_PAY_TOKEN_REPLY',
|
|
139
|
-
// skipRenderPaymentMethod 场景:webapp 委托 SDK 全权拉起 ApplePay,fire-and-forget
|
|
140
|
-
// SDK 收到后走 BusManager.publish(ApplePayActionEnum.createComponent) → plugin/applepay 标准链路
|
|
141
|
-
// (含 onEventCallback 商户通知,不需要 reply 给 webapp)
|
|
142
|
-
HANDLE_PAYMENT: 'OPENSDK@HANDLE_PAYMENT',
|
|
143
|
-
// Apple Pay 授权后、扣款前:iframe 请求 SDK 执行商户 onBeforeConfirm 回调,
|
|
144
|
-
// SDK 执行后回复 BEFORE_CONFIRM_REPLY 告知继续/中止
|
|
145
|
-
BEFORE_CONFIRM: 'OPENSDK@BEFORE_CONFIRM',
|
|
146
|
-
BEFORE_CONFIRM_REPLY: 'OPENSDK@BEFORE_CONFIRM_REPLY',
|
|
147
|
-
// iframe 通知 SDK 当前选中的支付方式类型变化(与 elements2 的 bridge.send('paymentMethodChanged') 对齐)
|
|
148
|
-
PAYMENT_METHOD_CHANGED: 'paymentMethodChanged'
|
|
149
|
-
};
|
|
150
|
-
/**
|
|
151
|
-
* ModernElementController 使用 opensdk-core 的 HostBridge 实现新架构通信。
|
|
152
|
-
*
|
|
153
|
-
* Mount 流程(正确):
|
|
154
|
-
* 1. setup() — 解析 sessionData 获取 metaData,准备 HANDSHAKE 配置
|
|
155
|
-
* 2. 创建 iframe(先不设置 src,避免提前触发加载)
|
|
156
|
-
* 3. 先注册所有事件监听,再设置 iframe.src 和 appendChild 触发加载
|
|
157
|
-
* 4. setup() 与 waitForReadyHandshake() 并行执行
|
|
158
|
-
* 5. 两者都完成后,sendHandshake() 发送 HANDSHAKE 配置
|
|
159
|
-
* 6. 等待 HANDSHAKE_ACK → 设置 status = 'ready'
|
|
160
|
-
* 7. ready 后发送缓存的消息
|
|
161
|
-
*/
|
|
162
|
-
export var ModernElementController = /*#__PURE__*/function () {
|
|
163
|
-
function ModernElementController(_ref) {
|
|
164
|
-
var onStatusChange = _ref.onStatusChange,
|
|
165
|
-
options = _objectWithoutProperties(_ref, _excluded);
|
|
166
|
-
_classCallCheck(this, ModernElementController);
|
|
167
|
-
_defineProperty(this, "options", void 0);
|
|
168
|
-
_defineProperty(this, "onStatusChange", void 0);
|
|
169
|
-
_defineProperty(this, "scopeId", "payment_".concat(uuid().replace(/-/g, '').slice(0, 6)));
|
|
170
|
-
_defineProperty(this, "bridge", void 0);
|
|
171
|
-
_defineProperty(this, "iframe", null);
|
|
172
|
-
_defineProperty(this, "status", 'initialized');
|
|
173
|
-
_defineProperty(this, "cachedSend", []);
|
|
174
|
-
// Modal 相关资源
|
|
175
|
-
_defineProperty(this, "modalBridge", null);
|
|
176
|
-
_defineProperty(this, "modalDestroy", null);
|
|
177
|
-
_defineProperty(this, "_closeConfirmResolve", null);
|
|
178
|
-
_defineProperty(this, "notRedirectAfterComplete", false);
|
|
179
|
-
_defineProperty(this, "_sdkInitTime", Date.now());
|
|
180
|
-
_defineProperty(this, "_mountStartTime", 0);
|
|
181
|
-
/** 商户传入的金额覆盖(Apple Pay 弹窗展示用,实际扣款由服务端控制) */
|
|
182
|
-
_defineProperty(this, "_merchantAmount", null);
|
|
183
|
-
/** 商户传入的币种覆盖(Apple Pay 弹窗展示用) */
|
|
184
|
-
_defineProperty(this, "_merchantCurrency", null);
|
|
185
|
-
/** 当前选中的支付方式类型(如 'APPLEPAY', 'CARD'),通过 paymentMethodChanged 事件更新 */
|
|
186
|
-
_defineProperty(this, "currentPaymentMethodType", '');
|
|
187
|
-
this.options = options;
|
|
188
|
-
this.onStatusChange = onStatusChange;
|
|
189
|
-
if (options.sessionData) {
|
|
190
|
-
var trackId = parseTrackerId(options.sessionData);
|
|
191
|
-
sdkTracker.setTrackId(trackId);
|
|
192
|
-
}
|
|
193
|
-
this.bridge = new HostSDKBridge('HOST', this.scopeId);
|
|
194
|
-
this.bridge.setDebugCallback(function (msg, direction) {
|
|
195
|
-
if (msg.type.endsWith(MessageType.UPDATE_CONFIG) || msg.type.endsWith(MessageType.HEIGHT_UPDATE)) {
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
if (msg.type.endsWith(MessageType.MESSAGE)) {
|
|
199
|
-
var _msg$payload, _msg$payload2;
|
|
200
|
-
debug((_msg$payload = msg.payload) === null || _msg$payload === void 0 ? void 0 : _msg$payload.type, 'APP_RUNTIME', msg.type, (_msg$payload2 = msg.payload) === null || _msg$payload2 === void 0 ? void 0 : _msg$payload2.message);
|
|
201
|
-
} else if (msg.type.endsWith(MessageType.ERROR) && direction === 'IN') {
|
|
202
|
-
debugError(msg.payload);
|
|
203
|
-
} else {
|
|
204
|
-
debug('INFO', direction === 'OUT' ? 'SDK_INTERNAL' : 'APP_RUNTIME', msg.type, msg.payload);
|
|
205
|
-
}
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
_createClass(ModernElementController, [{
|
|
209
|
-
key: "mount",
|
|
210
|
-
value: function () {
|
|
211
|
-
var _mount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(renderOptions, sdkSelector) {
|
|
212
|
-
var _this$options$loading, _this$options$loading2;
|
|
213
|
-
var container, _this$options, _this$options$onEvent, _this$options$loading3, _this$options$loading4, iframeUrl, iframeOrigin, readyHandshakePromise, _yield$Promise$all, _yield$Promise$all2, setupConfig, dataStructError, _this$options$loading5, _this$options$loading6, _this$options2, _this$options2$onEven, errorResult;
|
|
214
|
-
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
215
|
-
while (1) switch (_context.prev = _context.next) {
|
|
216
|
-
case 0:
|
|
217
|
-
trackMount('mount_start', {
|
|
218
|
-
d1: sdkSelector,
|
|
219
|
-
d2: this.options.sessionData ? 'has_session' : 'no_session'
|
|
220
|
-
});
|
|
221
|
-
container = document.querySelector(sdkSelector);
|
|
222
|
-
if (container) {
|
|
223
|
-
_context.next = 6;
|
|
224
|
-
break;
|
|
225
|
-
}
|
|
226
|
-
trackError('selector_not_found', {
|
|
227
|
-
d1: sdkSelector
|
|
228
|
-
});
|
|
229
|
-
(_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, {
|
|
230
|
-
code: EventCallbackCode.SDK_CREATE_COMPONENT_ERROR,
|
|
231
|
-
message: "Element with selector ".concat(sdkSelector, " not found.")
|
|
232
|
-
});
|
|
233
|
-
return _context.abrupt("return", {
|
|
234
|
-
error: {
|
|
235
|
-
code: 'PARAM_INVALID',
|
|
236
|
-
message: "selector not found"
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
case 6:
|
|
240
|
-
(_this$options$loading = this.options.loading) === null || _this$options$loading === void 0 || (_this$options$loading2 = _this$options$loading.onStartLoading) === null || _this$options$loading2 === void 0 || _this$options$loading2.call(_this$options$loading);
|
|
241
|
-
this.setStatus('mounting');
|
|
242
|
-
_context.prev = 8;
|
|
243
|
-
// 1. 创建 iframe(先不设置 src,避免提前触发加载)
|
|
244
|
-
iframeUrl = this.buildIframeUrl();
|
|
245
|
-
this.iframe = document.createElement('iframe');
|
|
246
|
-
this.iframe.style.width = '100%';
|
|
247
|
-
this.iframe.style.border = 'none';
|
|
248
|
-
this.iframe.style.height = '0';
|
|
249
|
-
this.iframe.style.transition = 'height 0.3s ease';
|
|
250
|
-
this.iframe.allow = 'payment';
|
|
251
|
-
if ("DEV" && true) {
|
|
252
|
-
try {
|
|
253
|
-
iframeOrigin = new URL(iframeUrl).origin;
|
|
254
|
-
if (iframeOrigin && iframeOrigin !== 'null') {
|
|
255
|
-
this.bridge.setOrigin(iframeOrigin);
|
|
256
|
-
}
|
|
257
|
-
} catch (_unused2) {
|
|
258
|
-
// URL 解析失败时保持默认 origin
|
|
259
|
-
}
|
|
260
|
-
} else {
|
|
261
|
-
this.bridge.setOrigin('https://checkout.antom.com');
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// 2. 先注册所有事件监听(包括 READY_HANDSHAKE),再设置 src 和 appendChild 触发加载,
|
|
265
|
-
// 避免 iframe 快速加载时丢失早期消息
|
|
266
|
-
this.bindBridgeEvents();
|
|
267
|
-
readyHandshakePromise = this.waitForReadyHandshake();
|
|
268
|
-
this.iframe.src = iframeUrl;
|
|
269
|
-
container.appendChild(this.iframe);
|
|
270
|
-
trackMount('iframe_loaded', {
|
|
271
|
-
d1: iframeUrl
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
// 3. setup()(网络请求)与 waitForReadyHandshake()(等待 iframe 加载)并行执行
|
|
275
|
-
_context.next = 24;
|
|
276
|
-
return Promise.all([this.setup(renderOptions), readyHandshakePromise]);
|
|
277
|
-
case 24:
|
|
278
|
-
_yield$Promise$all = _context.sent;
|
|
279
|
-
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 1);
|
|
280
|
-
setupConfig = _yield$Promise$all2[0];
|
|
281
|
-
dataStructError = this.validateRenderData(setupConfig.renderData, setupConfig.renderDataError);
|
|
282
|
-
if (dataStructError) {
|
|
283
|
-
setupConfig.renderDataError = dataStructError;
|
|
284
|
-
trackError('render_data_invalid', {
|
|
285
|
-
d1: dataStructError.code,
|
|
286
|
-
d2: dataStructError.reason
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
this.setStatus('mounted');
|
|
290
|
-
|
|
291
|
-
// 4. 两者都完成后,发送 HANDSHAKE 配置
|
|
292
|
-
this.sendHandshake(setupConfig);
|
|
293
|
-
|
|
294
|
-
// 5. 等待 HANDSHAKE_ACK
|
|
295
|
-
_context.next = 33;
|
|
296
|
-
return this.waitForHandshakeAck();
|
|
297
|
-
case 33:
|
|
298
|
-
this.setStatus('ready');
|
|
299
|
-
this.flushCachedMessages();
|
|
300
|
-
(_this$options$loading3 = this.options.loading) === null || _this$options$loading3 === void 0 || (_this$options$loading4 = _this$options$loading3.onEndLoading) === null || _this$options$loading4 === void 0 || _this$options$loading4.call(_this$options$loading3);
|
|
301
|
-
if (!dataStructError) {
|
|
302
|
-
_context.next = 38;
|
|
303
|
-
break;
|
|
304
|
-
}
|
|
305
|
-
return _context.abrupt("return", {
|
|
306
|
-
error: dataStructError
|
|
307
|
-
});
|
|
308
|
-
case 38:
|
|
309
|
-
trackMount('mount_success', {
|
|
310
|
-
m1: this._mountStartTime ? Date.now() - this._mountStartTime : 0
|
|
311
|
-
});
|
|
312
|
-
return _context.abrupt("return", {});
|
|
313
|
-
case 42:
|
|
314
|
-
_context.prev = 42;
|
|
315
|
-
_context.t0 = _context["catch"](8);
|
|
316
|
-
trackError('mount_error', {
|
|
317
|
-
d1: (_context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.code) || 'UNKNOWN',
|
|
318
|
-
d2: (_context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.message) || ''
|
|
319
|
-
});
|
|
320
|
-
(_this$options$loading5 = this.options.loading) === null || _this$options$loading5 === void 0 || (_this$options$loading6 = _this$options$loading5.onEndLoading) === null || _this$options$loading6 === void 0 || _this$options$loading6.call(_this$options$loading5);
|
|
321
|
-
this.cleanup();
|
|
322
|
-
errorResult = {
|
|
323
|
-
code: _context.t0.code || 'UNKNOWN',
|
|
324
|
-
message: _context.t0.message || ''
|
|
325
|
-
};
|
|
326
|
-
(_this$options2 = this.options) === null || _this$options2 === void 0 || (_this$options2$onEven = _this$options2.onEventCallback) === null || _this$options2$onEven === void 0 || _this$options2$onEven.call(_this$options2, errorResult);
|
|
327
|
-
return _context.abrupt("return", {
|
|
328
|
-
error: errorResult
|
|
329
|
-
});
|
|
330
|
-
case 50:
|
|
331
|
-
case "end":
|
|
332
|
-
return _context.stop();
|
|
333
|
-
}
|
|
334
|
-
}, _callee, this, [[8, 42]]);
|
|
335
|
-
}));
|
|
336
|
-
function mount(_x, _x2) {
|
|
337
|
-
return _mount.apply(this, arguments);
|
|
338
|
-
}
|
|
339
|
-
return mount;
|
|
340
|
-
}()
|
|
341
|
-
/**
|
|
342
|
-
* setup() — 解析 sessionData 获取 metaData,发起 sdkQuery 获取渲染数据,准备 HANDSHAKE 配置
|
|
343
|
-
*
|
|
344
|
-
* 完整实现:
|
|
345
|
-
* 1. 解析 sessionData 获取 paymentSessionConfig
|
|
346
|
-
* 2. 初始化 request 全局配置(hostSign, env, sdkVersion)
|
|
347
|
-
* 3. 调用 sdkQuery 获取 renderData
|
|
348
|
-
* 4. 处理请求错误,将错误信息放入 renderDataError(不阻塞 mount 流程)
|
|
349
|
-
* 5. 从 renderData 中提取 preferredLocale
|
|
350
|
-
*/
|
|
351
|
-
}, {
|
|
352
|
-
key: "setup",
|
|
353
|
-
value: (function () {
|
|
354
|
-
var _setup = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(renderOptions) {
|
|
355
|
-
var _parseData$connectFac,
|
|
356
|
-
_this = this,
|
|
357
|
-
_parseData$paymentMet,
|
|
358
|
-
_sdkQueryResult$data;
|
|
359
|
-
var sessionData, parseData, isConnect, extendInfo, onlyIntegrateCardElementConnectMerchantFlag, _JSON$parse, shouldQueryOneAccount, paymentSessionConfig, genSdkQueryPromise, genOneAccountQueryPromise, promises, _ref2, _ref3, sdkQueryResult, oneAccountQueryResult, _sdkQueryResult$error, _sdkQueryResult$error2, _oneAccountQueryResul, _oneAccountQueryResul2, preferredLocale, locale, renderDataError;
|
|
360
|
-
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
361
|
-
while (1) switch (_context2.prev = _context2.next) {
|
|
362
|
-
case 0:
|
|
363
|
-
this._mountStartTime = Date.now();
|
|
364
|
-
trackMount('setup_start');
|
|
365
|
-
// 缓存起来,submit时使用
|
|
366
|
-
this.notRedirectAfterComplete = renderOptions.notRedirectAfterComplete || false;
|
|
367
|
-
sessionData = this.options.sessionData; // checkSessionData 失败会 throw AntomSDKError(SESSION_DATA_INVALID),
|
|
368
|
-
// 冒泡到 mount 的 catch 由 mount_error 统一上报,此处无需额外处理
|
|
369
|
-
parseData = checkSessionData(sessionData, 'ELEMENT_PAYMENT'); // 初始化 request 全局配置,使 sdkQuery 能正确发起请求
|
|
370
|
-
// tracker: sdkTracker —— 接入 HTTP 层自动埋点(B 套),上报每个请求的成败/RTT/错误码
|
|
371
|
-
// 与 antom.ts 入口对齐;不传则 sdkQuery/submitPay/inquiry 等网络细节不可观测
|
|
372
|
-
request.setGlobalOptions({
|
|
373
|
-
hostSign: parseHostSign(sessionData),
|
|
374
|
-
env: this.options.environment,
|
|
375
|
-
sdkVersion: "0.0.1783323899-dev.2" || '',
|
|
376
|
-
tracker: sdkTracker
|
|
377
|
-
});
|
|
378
|
-
isConnect = !!(parseData !== null && parseData !== void 0 && (_parseData$connectFac = parseData.connectFactor) !== null && _parseData$connectFac !== void 0 && _parseData$connectFac.enableConnect);
|
|
379
|
-
extendInfo = (parseData === null || parseData === void 0 ? void 0 : parseData.extendInfo) || '';
|
|
380
|
-
try {
|
|
381
|
-
onlyIntegrateCardElementConnectMerchantFlag = (_JSON$parse = JSON.parse(extendInfo)) === null || _JSON$parse === void 0 ? void 0 : _JSON$parse.onlyIntegrateCardElementConnectMerchantFlag;
|
|
382
|
-
} catch (_unused3) {
|
|
383
|
-
onlyIntegrateCardElementConnectMerchantFlag = undefined;
|
|
384
|
-
}
|
|
385
|
-
shouldQueryOneAccount = isConnect && onlyIntegrateCardElementConnectMerchantFlag !== 'true';
|
|
386
|
-
paymentSessionConfig = parseData === null || parseData === void 0 ? void 0 : parseData.paymentSessionConfig;
|
|
387
|
-
genSdkQueryPromise = function genSdkQueryPromise() {
|
|
388
|
-
var _renderOptions$mercha;
|
|
389
|
-
return awaitWrap(sdkQuery({
|
|
390
|
-
extParams: {
|
|
391
|
-
isUserPreferredLocale: true
|
|
392
|
-
},
|
|
393
|
-
merchantAppointParam: (_renderOptions$mercha = renderOptions.merchantAppointParam) !== null && _renderOptions$mercha !== void 0 && _renderOptions$mercha.storedCard ? renderOptions.merchantAppointParam : undefined,
|
|
394
|
-
notRedirectAfterComplete: _this.notRedirectAfterComplete,
|
|
395
|
-
// sdk需要传入该字段
|
|
396
|
-
paymentSessionConfig: parseData === null || parseData === void 0 ? void 0 : parseData.paymentSessionConfig,
|
|
397
|
-
paymentSessionData: sessionData
|
|
398
|
-
}, {
|
|
399
|
-
// 传商户初始化的 locale,服务端据此返回对应语言(缺失则回落用户偏好/en_US)
|
|
400
|
-
envInfo: {
|
|
401
|
-
locale: _this.options.locale
|
|
402
|
-
}
|
|
403
|
-
}).catch(recoverSdkQueryBusinessResponse));
|
|
404
|
-
};
|
|
405
|
-
genOneAccountQueryPromise = function genOneAccountQueryPromise() {
|
|
406
|
-
return awaitWrap(oneAccountQuery({
|
|
407
|
-
paymentSessionConfig: paymentSessionConfig,
|
|
408
|
-
paymentSessionData: sessionData,
|
|
409
|
-
accountInfo: {
|
|
410
|
-
email: ''
|
|
411
|
-
}
|
|
412
|
-
}));
|
|
413
|
-
};
|
|
414
|
-
promises = shouldQueryOneAccount ? [genSdkQueryPromise(), genOneAccountQueryPromise()] : [genSdkQueryPromise(), undefined];
|
|
415
|
-
_context2.next = 16;
|
|
416
|
-
return Promise.all(promises);
|
|
417
|
-
case 16:
|
|
418
|
-
_ref2 = _context2.sent;
|
|
419
|
-
_ref3 = _slicedToArray(_ref2, 2);
|
|
420
|
-
sdkQueryResult = _ref3[0];
|
|
421
|
-
oneAccountQueryResult = _ref3[1];
|
|
422
|
-
if (sdkQueryResult.error) {
|
|
423
|
-
trackHandshake('sdk_query_failed', {
|
|
424
|
-
d1: ((_sdkQueryResult$error = sdkQueryResult.error) === null || _sdkQueryResult$error === void 0 ? void 0 : _sdkQueryResult$error.code) || '',
|
|
425
|
-
d2: ((_sdkQueryResult$error2 = sdkQueryResult.error) === null || _sdkQueryResult$error2 === void 0 ? void 0 : _sdkQueryResult$error2.message) || ''
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
if (shouldQueryOneAccount && oneAccountQueryResult !== null && oneAccountQueryResult !== void 0 && oneAccountQueryResult.error) {
|
|
429
|
-
trackHandshake('one_account_query_failed', {
|
|
430
|
-
d1: ((_oneAccountQueryResul = oneAccountQueryResult.error) === null || _oneAccountQueryResul === void 0 ? void 0 : _oneAccountQueryResul.code) || '',
|
|
431
|
-
d2: ((_oneAccountQueryResul2 = oneAccountQueryResult.error) === null || _oneAccountQueryResul2 === void 0 ? void 0 : _oneAccountQueryResul2.message) || ''
|
|
432
|
-
});
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
// 从 renderData 中提取 preferredLocale
|
|
436
|
-
preferredLocale = getLocaleFromRenderData(sdkQueryResult.data);
|
|
437
|
-
locale = preferredLocale || this.options.locale; // 优先使用请求错误,其次使用数据结构校验错误
|
|
438
|
-
renderDataError = sdkQueryResult.error || (oneAccountQueryResult === null || oneAccountQueryResult === void 0 ? void 0 : oneAccountQueryResult.error);
|
|
439
|
-
return _context2.abrupt("return", {
|
|
440
|
-
sdkTiming: {
|
|
441
|
-
sdkInitTime: this._sdkInitTime,
|
|
442
|
-
mountStartTime: this._mountStartTime
|
|
443
|
-
},
|
|
444
|
-
// 更新字段,对应老的paymentSessionData
|
|
445
|
-
sessionData: sessionData,
|
|
446
|
-
// 新增字段,对应老的queryResult成功时
|
|
447
|
-
renderData: sdkQueryResult.data,
|
|
448
|
-
// 新增字段,对应老的queryResult失败时及 oneAccountQueryResult 失败时
|
|
449
|
-
renderDataError: renderDataError,
|
|
450
|
-
// 更新字段,对应老的oneAccountQueryResult成功时
|
|
451
|
-
connectAccount: oneAccountQueryResult === null || oneAccountQueryResult === void 0 ? void 0 : oneAccountQueryResult.data,
|
|
452
|
-
// 更新字段,对应老的sessionResult
|
|
453
|
-
sessionMetaData: parseData,
|
|
454
|
-
// 更新字段,对应老的doMain
|
|
455
|
-
merchantDomain: window.location.hostname,
|
|
456
|
-
// 更新字段,对应老的appearance,结构按新的来
|
|
457
|
-
appearance: adaptAppearance((renderOptions === null || renderOptions === void 0 ? void 0 : renderOptions.appearance) || this.options.appearance, renderOptions.merchantAppointParam),
|
|
458
|
-
// 原老字段
|
|
459
|
-
logMetaData: {
|
|
460
|
-
paymentMethodCategoryType: paymentSessionConfig === null || paymentSessionConfig === void 0 ? void 0 : paymentSessionConfig.paymentMethodCategoryType,
|
|
461
|
-
productSceneVersion: paymentSessionConfig === null || paymentSessionConfig === void 0 ? void 0 : paymentSessionConfig.productSceneVersion,
|
|
462
|
-
trackId: parseTrackerId(sessionData),
|
|
463
|
-
merchantId: parseData === null || parseData === void 0 ? void 0 : parseData.clientId,
|
|
464
|
-
paymentMethodType: parseData === null || parseData === void 0 || (_parseData$paymentMet = parseData.paymentMethodInfoView) === null || _parseData$paymentMet === void 0 ? void 0 : _parseData$paymentMet.paymentMethodType
|
|
465
|
-
},
|
|
466
|
-
// 原老字段
|
|
467
|
-
heightOfVisible: Math.max(window.changingPageHeight, window.innerHeight),
|
|
468
|
-
// 新sdk字段
|
|
469
|
-
locale: locale,
|
|
470
|
-
// 新sdk字段
|
|
471
|
-
sdkVersion: "0.0.1783323899-dev.2" || '',
|
|
472
|
-
// 新sdk字段
|
|
473
|
-
merchantId: (sdkQueryResult === null || sdkQueryResult === void 0 || (_sdkQueryResult$data = sdkQueryResult.data) === null || _sdkQueryResult$data === void 0 ? void 0 : _sdkQueryResult$data.merchantId) || '',
|
|
474
|
-
// 新sdk字段
|
|
475
|
-
env: this.options.environment === 'sandbox' ? 'sandbox' : 'prod',
|
|
476
|
-
// 新sdk字段,开发环境调试使用
|
|
477
|
-
_requestConfig: _objectSpread({
|
|
478
|
-
env: this.options.environment === 'sandbox' ? 'sandbox' : 'prod'
|
|
479
|
-
}, getDevReqConfig())
|
|
480
|
-
});
|
|
481
|
-
case 26:
|
|
482
|
-
case "end":
|
|
483
|
-
return _context2.stop();
|
|
484
|
-
}
|
|
485
|
-
}, _callee2, this);
|
|
486
|
-
}));
|
|
487
|
-
function setup(_x3) {
|
|
488
|
-
return _setup.apply(this, arguments);
|
|
489
|
-
}
|
|
490
|
-
return setup;
|
|
491
|
-
}()
|
|
492
|
-
/**
|
|
493
|
-
* 校验 renderData 数据格式,参照老逻辑 isLoadErrorPage 的三个校验维度:
|
|
494
|
-
* 1. success 字段 — 接口是否返回业务成功
|
|
495
|
-
* 2. 支付方式 — paymentMethods 或 savedPaymentMethods 必须存在且为非空数组
|
|
496
|
-
* 3. 金额视图 — orderAmountView 和 paymentAmountView 必须同时存在
|
|
497
|
-
*
|
|
498
|
-
* 当数据结构异常时,构造 ERR_DATA_STRUCT_UNRECOGNIZED 错误
|
|
499
|
-
*/
|
|
500
|
-
)
|
|
501
|
-
}, {
|
|
502
|
-
key: "getLegacySdkQueryError",
|
|
503
|
-
value: function getLegacySdkQueryError(errorInfo) {
|
|
504
|
-
var errorCode = errorInfo.errorCode,
|
|
505
|
-
errorMessage = errorInfo.errorMessage,
|
|
506
|
-
traceId = errorInfo.traceId,
|
|
507
|
-
reason = errorInfo.reason;
|
|
508
|
-
if (!errorCode) {
|
|
509
|
-
var fallbackError = {
|
|
510
|
-
source: 'SDK_INTERNAL',
|
|
511
|
-
code: ERRORMESSAGE.ERR_DATA_STRUCT_UNRECOGNIZED.code,
|
|
512
|
-
message: ERRORMESSAGE.ERR_DATA_STRUCT_UNRECOGNIZED.message,
|
|
513
|
-
reason: reason,
|
|
514
|
-
traceId: traceId !== null && traceId !== void 0 ? traceId : ''
|
|
515
|
-
};
|
|
516
|
-
return fallbackError;
|
|
517
|
-
}
|
|
518
|
-
var mappedError = PROMISE_CALLBACK_CODE[errorCode];
|
|
519
|
-
var legacyError = {
|
|
520
|
-
source: 'SDK_INTERNAL',
|
|
521
|
-
code: (mappedError === null || mappedError === void 0 ? void 0 : mappedError.code) || errorCode,
|
|
522
|
-
message: (mappedError === null || mappedError === void 0 ? void 0 : mappedError.message) || errorMessage || ERRORMESSAGE.ERR_DATA_STRUCT_UNRECOGNIZED.message,
|
|
523
|
-
reason: reason,
|
|
524
|
-
traceId: traceId !== null && traceId !== void 0 ? traceId : ''
|
|
525
|
-
};
|
|
526
|
-
return legacyError;
|
|
527
|
-
}
|
|
528
|
-
}, {
|
|
529
|
-
key: "validateRenderData",
|
|
530
|
-
value: function validateRenderData(renderData, renderDataError) {
|
|
531
|
-
if (renderDataError || !renderData) {
|
|
532
|
-
var _renderDataError$trac;
|
|
533
|
-
return {
|
|
534
|
-
source: 'SDK_INTERNAL',
|
|
535
|
-
code: ERRORMESSAGE.INITIALIZE_TIMEOUT.API.code,
|
|
536
|
-
message: ERRORMESSAGE.INITIALIZE_TIMEOUT.API.message,
|
|
537
|
-
reason: renderDataError ? "query request failed: errorCode=".concat(renderDataError.code) : 'renderData is empty',
|
|
538
|
-
traceId: (_renderDataError$trac = renderDataError === null || renderDataError === void 0 ? void 0 : renderDataError.traceId) !== null && _renderDataError$trac !== void 0 ? _renderDataError$trac : ''
|
|
539
|
-
};
|
|
540
|
-
}
|
|
541
|
-
var success = renderData.success,
|
|
542
|
-
paymentMethods = renderData.paymentMethods,
|
|
543
|
-
savedPaymentMethods = renderData.savedPaymentMethods,
|
|
544
|
-
orderAmountView = renderData.orderAmountView,
|
|
545
|
-
paymentAmountView = renderData.paymentAmountView;
|
|
546
|
-
|
|
547
|
-
// 校验是否存在有效支付方式
|
|
548
|
-
var hasValidPaymentMethods = Boolean(paymentMethods && Array.isArray(paymentMethods) && paymentMethods.length > 0 || savedPaymentMethods && Array.isArray(savedPaymentMethods) && savedPaymentMethods.length > 0);
|
|
549
|
-
|
|
550
|
-
// 金额存在性校验
|
|
551
|
-
var hasAmountViews = !!orderAmountView && !!paymentAmountView;
|
|
552
|
-
if (!success) {
|
|
553
|
-
var _ref4 = renderData,
|
|
554
|
-
traceId = _ref4.traceId,
|
|
555
|
-
errorCode = _ref4.errorCode,
|
|
556
|
-
errorMessage = _ref4.errorMessage;
|
|
557
|
-
return this.getLegacySdkQueryError({
|
|
558
|
-
errorCode: errorCode,
|
|
559
|
-
errorMessage: errorMessage,
|
|
560
|
-
traceId: traceId,
|
|
561
|
-
reason: errorCode ? "sdkAction.query failed: errorCode=".concat(errorCode) : 'sdkAction.query failed without errorCode'
|
|
562
|
-
});
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
// success=true 时,缺少支付方式或金额视图仍按老架构的数据结构异常处理
|
|
566
|
-
if (!hasValidPaymentMethods || !hasAmountViews) {
|
|
567
|
-
return {
|
|
568
|
-
source: 'SDK_INTERNAL',
|
|
569
|
-
code: ERRORMESSAGE.ERR_DATA_STRUCT_UNRECOGNIZED.code,
|
|
570
|
-
message: ERRORMESSAGE.ERR_DATA_STRUCT_UNRECOGNIZED.message,
|
|
571
|
-
reason: "Data structure validation failed: success=".concat(success, ", hasValidPaymentMethods=").concat(hasValidPaymentMethods, ", hasAmountViews=").concat(hasAmountViews),
|
|
572
|
-
traceId: ''
|
|
573
|
-
};
|
|
574
|
-
}
|
|
575
|
-
return undefined;
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
/**
|
|
579
|
-
* 注册所有 bridge 事件监听(必须在 iframe 加载前调用,避免丢失早期消息)
|
|
580
|
-
*/
|
|
581
|
-
}, {
|
|
582
|
-
key: "bindBridgeEvents",
|
|
583
|
-
value: function bindBridgeEvents() {
|
|
584
|
-
var _this2 = this;
|
|
585
|
-
this.bridge.on(MessageType.HEIGHT_UPDATE, function (height) {
|
|
586
|
-
if (_this2.iframe) _this2.iframe.style.height = "".concat(height, "px");
|
|
587
|
-
});
|
|
588
|
-
this.bridge.on(MessageType.REDIRECT, function (payload, ports, event) {
|
|
589
|
-
var _this2$iframe;
|
|
590
|
-
// 只能由 iframe 发起 REDIRECT,避免和新的sdk有冲突
|
|
591
|
-
if ((event === null || event === void 0 ? void 0 : event.source) !== ((_this2$iframe = _this2.iframe) === null || _this2$iframe === void 0 ? void 0 : _this2$iframe.contentWindow)) {
|
|
592
|
-
return;
|
|
593
|
-
}
|
|
594
|
-
var url = payload.url,
|
|
595
|
-
mode = payload.mode,
|
|
596
|
-
appLinkUrl = payload.appLinkUrl,
|
|
597
|
-
schemaUrl = payload.schemaUrl,
|
|
598
|
-
destroy = payload.destroy;
|
|
599
|
-
// d1=mode(redirect/replace) d2=跳转类型 d3=兜底url d4=appLinkUrl d5=schemaUrl d6=是否销毁
|
|
600
|
-
trackElement('redirect', {
|
|
601
|
-
d1: mode || 'redirect',
|
|
602
|
-
d2: appLinkUrl ? 'app_link' : schemaUrl ? 'schema' : 'url',
|
|
603
|
-
d3: url || '',
|
|
604
|
-
d4: appLinkUrl || '',
|
|
605
|
-
d5: schemaUrl || '',
|
|
606
|
-
d6: destroy ? '1' : '0'
|
|
607
|
-
});
|
|
608
|
-
if (destroy) {
|
|
609
|
-
_this2.destroy();
|
|
610
|
-
}
|
|
611
|
-
function fallbackJump() {
|
|
612
|
-
if (mode === 'replace') {
|
|
613
|
-
window.location.replace(url);
|
|
614
|
-
} else {
|
|
615
|
-
window.location.href = url;
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
try {
|
|
619
|
-
if (appLinkUrl || schemaUrl) {
|
|
620
|
-
var app = new CallApp({
|
|
621
|
-
resultJudgmentTime: 2000,
|
|
622
|
-
fallback: function fallback() {
|
|
623
|
-
trackElement('redirect_fallback', {
|
|
624
|
-
d1: 'callapp_failed',
|
|
625
|
-
d2: url || ''
|
|
626
|
-
});
|
|
627
|
-
fallbackJump();
|
|
628
|
-
}
|
|
629
|
-
});
|
|
630
|
-
app.open({
|
|
631
|
-
scheme: schemaUrl,
|
|
632
|
-
link: appLinkUrl
|
|
633
|
-
});
|
|
634
|
-
} else {
|
|
635
|
-
fallbackJump();
|
|
636
|
-
}
|
|
637
|
-
} catch (error) {
|
|
638
|
-
trackError('redirect_error', {
|
|
639
|
-
d1: 'callapp_exception',
|
|
640
|
-
d2: (error === null || error === void 0 ? void 0 : error.message) || '',
|
|
641
|
-
d3: url || ''
|
|
642
|
-
});
|
|
643
|
-
fallbackJump();
|
|
644
|
-
}
|
|
645
|
-
});
|
|
646
|
-
this.bridge.on(MessageType.OPEN_MODAL, function (payload, ports, event) {
|
|
647
|
-
var _this2$iframe2;
|
|
648
|
-
// 只能由 iframe 发起 OPEN_MODAL,避免和新的sdk有冲突
|
|
649
|
-
if ((event === null || event === void 0 ? void 0 : event.source) !== ((_this2$iframe2 = _this2.iframe) === null || _this2$iframe2 === void 0 ? void 0 : _this2$iframe2.contentWindow)) {
|
|
650
|
-
return;
|
|
651
|
-
}
|
|
652
|
-
_this2.handleOpenModal(payload);
|
|
653
|
-
_this2.bridge.on(MessageType.CLOSE_MODAL, function () {
|
|
654
|
-
_this2.handleCloseModal();
|
|
655
|
-
});
|
|
656
|
-
});
|
|
657
|
-
this.bridge.on(MessageType.DESTROY_ELEMENT, function (_payload, _ports, event) {
|
|
658
|
-
var _this2$iframe3;
|
|
659
|
-
// 只能由 iframe 发起 DESTROY_ELEMENT,避免和新的sdk有冲突
|
|
660
|
-
if ((event === null || event === void 0 ? void 0 : event.source) !== ((_this2$iframe3 = _this2.iframe) === null || _this2$iframe3 === void 0 ? void 0 : _this2$iframe3.contentWindow)) {
|
|
661
|
-
return;
|
|
662
|
-
}
|
|
663
|
-
_this2.destroy();
|
|
664
|
-
});
|
|
665
|
-
|
|
666
|
-
// skipRenderPaymentMethod 场景:webapp 委托 SDK 全权拉起 ApplePay,fire-and-forget
|
|
667
|
-
// 走 plugin/applepay 标准链路(onEventCallback 自动通知商户)
|
|
668
|
-
this.bridge.on(AMSMessageType.HANDLE_PAYMENT, function () {
|
|
669
|
-
_this2.handleHandlePayment();
|
|
670
|
-
});
|
|
671
|
-
|
|
672
|
-
// Apple Pay beforeConfirm:在 submitPayment 内通过 bridge.once 监听,此处不再注册
|
|
673
|
-
|
|
674
|
-
// 支付方式变化:iframe 通知 SDK 当前选中的支付方式类型
|
|
675
|
-
this.bridge.on(AMSMessageType.PAYMENT_METHOD_CHANGED, function (payload) {
|
|
676
|
-
_this2.currentPaymentMethodType = (payload === null || payload === void 0 ? void 0 : payload.type) || '';
|
|
677
|
-
});
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
/**
|
|
681
|
-
* 处理 webapp 委托的 Apple Pay token 请求。
|
|
682
|
-
* Chrome 等非 Safari 浏览器内 iframe 无法拉起 Apple 二维码 modal(jsapi 注入需父域),
|
|
683
|
-
* 改由 SDK 域 new ApplePaySdk().startPay() 拉起 Apple modal,结果通过 bridge 回传。
|
|
684
|
-
*/
|
|
685
|
-
}, {
|
|
686
|
-
key: "handleGetApplePayToken",
|
|
687
|
-
value: (function () {
|
|
688
|
-
var _handleGetApplePayToken = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(payload, onBeforeConfirm) {
|
|
689
|
-
var _paymentMethod,
|
|
690
|
-
_this3 = this;
|
|
691
|
-
var sessionData, applePayProps, paymentRequest, merchantCapabilities, merchantInfo, paymentAmount, supportedNetworks, version, requiredBillingContactFields, requiredShippingContactFields, finalAmount, finalCurrency, capturedResult, service, _capturedResult, errCode;
|
|
692
|
-
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
|
|
693
|
-
while (1) switch (_context5.prev = _context5.next) {
|
|
694
|
-
case 0:
|
|
695
|
-
sessionData = this.options.sessionData;
|
|
696
|
-
applePayProps = payload === null || payload === void 0 || (_paymentMethod = payload.paymentMethod) === null || _paymentMethod === void 0 || (_paymentMethod = _paymentMethod.paymentMethodDetail) === null || _paymentMethod === void 0 ? void 0 : _paymentMethod.applePayProps;
|
|
697
|
-
paymentRequest = applePayProps === null || applePayProps === void 0 ? void 0 : applePayProps.paymentRequest;
|
|
698
|
-
trackElement('applepay_token_request', {
|
|
699
|
-
d1: paymentRequest ? 'has_payment_request' : 'no_payment_request'
|
|
700
|
-
});
|
|
701
|
-
if (paymentRequest) {
|
|
702
|
-
_context5.next = 8;
|
|
703
|
-
break;
|
|
704
|
-
}
|
|
705
|
-
trackError('applepay_token_missing_data', {
|
|
706
|
-
d1: 'MISSING_DATA'
|
|
707
|
-
});
|
|
708
|
-
this.bridge.send(AMSMessageType.GET_APPLE_PAY_TOKEN_REPLY, {
|
|
709
|
-
success: false,
|
|
710
|
-
result: {
|
|
711
|
-
errorCode: 'APPLE_PAY_MISSING_DATA'
|
|
712
|
-
}
|
|
713
|
-
});
|
|
714
|
-
return _context5.abrupt("return");
|
|
715
|
-
case 8:
|
|
716
|
-
merchantCapabilities = paymentRequest.merchantCapabilities, merchantInfo = paymentRequest.merchantInfo, paymentAmount = paymentRequest.paymentAmount, supportedNetworks = paymentRequest.supportedNetworks, version = paymentRequest.version, requiredBillingContactFields = paymentRequest.requiredBillingContactFields, requiredShippingContactFields = paymentRequest.requiredShippingContactFields;
|
|
717
|
-
finalAmount = (paymentAmount === null || paymentAmount === void 0 ? void 0 : paymentAmount.formattedValue) || (paymentAmount === null || paymentAmount === void 0 ? void 0 : paymentAmount.value);
|
|
718
|
-
finalCurrency = paymentAmount === null || paymentAmount === void 0 ? void 0 : paymentAmount.currency; // 商户 amount/currency 覆盖(优先级高于 iframe 传来的值,用于 Apple Pay 弹窗展示)
|
|
719
|
-
if (this._merchantAmount) {
|
|
720
|
-
finalAmount = this._merchantAmount;
|
|
721
|
-
}
|
|
722
|
-
if (this._merchantCurrency) {
|
|
723
|
-
finalCurrency = this._merchantCurrency;
|
|
724
|
-
}
|
|
725
|
-
service = new ApplePayHostService({
|
|
726
|
-
paymentRequest: {
|
|
727
|
-
countryCode: merchantInfo === null || merchantInfo === void 0 ? void 0 : merchantInfo.countryCode,
|
|
728
|
-
currencyCode: finalCurrency,
|
|
729
|
-
merchantCapabilities: merchantCapabilities,
|
|
730
|
-
supportedNetworks: supportedNetworks,
|
|
731
|
-
requiredBillingContactFields: requiredBillingContactFields,
|
|
732
|
-
requiredShippingContactFields: requiredShippingContactFields,
|
|
733
|
-
total: {
|
|
734
|
-
type: 'final',
|
|
735
|
-
label: (merchantInfo === null || merchantInfo === void 0 ? void 0 : merchantInfo.merchantName) || 'Payment',
|
|
736
|
-
amount: finalAmount
|
|
737
|
-
},
|
|
738
|
-
version: version
|
|
739
|
-
},
|
|
740
|
-
enableModalCloseListener: true,
|
|
741
|
-
callbacks: {
|
|
742
|
-
validateMerchant: function () {
|
|
743
|
-
var _validateMerchant = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(validationURL) {
|
|
744
|
-
var res;
|
|
745
|
-
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
746
|
-
while (1) switch (_context3.prev = _context3.next) {
|
|
747
|
-
case 0:
|
|
748
|
-
trackElement('applepay_validate_start', {
|
|
749
|
-
d1: 'merchant_validate'
|
|
750
|
-
});
|
|
751
|
-
_context3.next = 3;
|
|
752
|
-
return getApplePayPaymentSession(sessionData, {
|
|
753
|
-
validateUrl: validationURL,
|
|
754
|
-
paymentSessionData: sessionData,
|
|
755
|
-
merchantDomain: window.location.hostname
|
|
756
|
-
}, {
|
|
757
|
-
env: _this3.options.environment,
|
|
758
|
-
envInfo: {
|
|
759
|
-
deviceId: ''
|
|
760
|
-
}
|
|
761
|
-
}, logger);
|
|
762
|
-
case 3:
|
|
763
|
-
res = _context3.sent;
|
|
764
|
-
if (!(res !== null && res !== void 0 && res.success && res.merchantSessionObject)) {
|
|
765
|
-
_context3.next = 7;
|
|
766
|
-
break;
|
|
767
|
-
}
|
|
768
|
-
trackElement('applepay_validate_success', {
|
|
769
|
-
d1: 'got_session'
|
|
770
|
-
});
|
|
771
|
-
return _context3.abrupt("return", typeof res.merchantSessionObject === 'string' ? JSON.parse(res.merchantSessionObject) : res.merchantSessionObject);
|
|
772
|
-
case 7:
|
|
773
|
-
trackError('applepay_merchant_validate_failed', {
|
|
774
|
-
d1: 'VALIDATION_FAILED',
|
|
775
|
-
d2: (res === null || res === void 0 ? void 0 : res.errorMessage) || 'Merchant validation failed'
|
|
776
|
-
});
|
|
777
|
-
throw {
|
|
778
|
-
errorCode: 'APPLE_PAY_PAYMENT_SESSION_REQUEST_FAILED'
|
|
779
|
-
};
|
|
780
|
-
case 9:
|
|
781
|
-
case "end":
|
|
782
|
-
return _context3.stop();
|
|
783
|
-
}
|
|
784
|
-
}, _callee3);
|
|
785
|
-
}));
|
|
786
|
-
function validateMerchant(_x6) {
|
|
787
|
-
return _validateMerchant.apply(this, arguments);
|
|
788
|
-
}
|
|
789
|
-
return validateMerchant;
|
|
790
|
-
}(),
|
|
791
|
-
onAuthorized: function () {
|
|
792
|
-
var _onAuthorized = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(_ref5) {
|
|
793
|
-
var token, billingContact, shippingContact, _yield$executeWithTim, rawResult, timedOut;
|
|
794
|
-
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
795
|
-
while (1) switch (_context4.prev = _context4.next) {
|
|
796
|
-
case 0:
|
|
797
|
-
token = _ref5.token, billingContact = _ref5.billingContact, shippingContact = _ref5.shippingContact;
|
|
798
|
-
if (!onBeforeConfirm) {
|
|
799
|
-
_context4.next = 15;
|
|
800
|
-
break;
|
|
801
|
-
}
|
|
802
|
-
_context4.prev = 2;
|
|
803
|
-
_context4.next = 5;
|
|
804
|
-
return executeWithTimeout(function () {
|
|
805
|
-
return onBeforeConfirm();
|
|
806
|
-
});
|
|
807
|
-
case 5:
|
|
808
|
-
_yield$executeWithTim = _context4.sent;
|
|
809
|
-
rawResult = _yield$executeWithTim.result;
|
|
810
|
-
timedOut = _yield$executeWithTim.timedOut;
|
|
811
|
-
if (!(timedOut ? false : !rawResult)) {
|
|
812
|
-
_context4.next = 10;
|
|
813
|
-
break;
|
|
814
|
-
}
|
|
815
|
-
return _context4.abrupt("return", {
|
|
816
|
-
success: false,
|
|
817
|
-
errorCode: 'MERCHANT_CONFIRM_ABORT'
|
|
818
|
-
});
|
|
819
|
-
case 10:
|
|
820
|
-
_context4.next = 15;
|
|
821
|
-
break;
|
|
822
|
-
case 12:
|
|
823
|
-
_context4.prev = 12;
|
|
824
|
-
_context4.t0 = _context4["catch"](2);
|
|
825
|
-
return _context4.abrupt("return", {
|
|
826
|
-
success: false,
|
|
827
|
-
errorCode: 'MERCHANT_CONFIRM_ABORT'
|
|
828
|
-
});
|
|
829
|
-
case 15:
|
|
830
|
-
capturedResult = {
|
|
831
|
-
token: token,
|
|
832
|
-
billingContact: billingContact,
|
|
833
|
-
shippingContact: shippingContact
|
|
834
|
-
};
|
|
835
|
-
trackElement('applepay_authorized', {
|
|
836
|
-
d1: token ? 'has_token' : 'no_token'
|
|
837
|
-
});
|
|
838
|
-
return _context4.abrupt("return", {
|
|
839
|
-
success: true,
|
|
840
|
-
result: capturedResult
|
|
841
|
-
});
|
|
842
|
-
case 18:
|
|
843
|
-
case "end":
|
|
844
|
-
return _context4.stop();
|
|
845
|
-
}
|
|
846
|
-
}, _callee4, null, [[2, 12]]);
|
|
847
|
-
}));
|
|
848
|
-
function onAuthorized(_x7) {
|
|
849
|
-
return _onAuthorized.apply(this, arguments);
|
|
850
|
-
}
|
|
851
|
-
return onAuthorized;
|
|
852
|
-
}()
|
|
853
|
-
}
|
|
854
|
-
});
|
|
855
|
-
_context5.prev = 14;
|
|
856
|
-
_context5.next = 17;
|
|
857
|
-
return service.startPay();
|
|
858
|
-
case 17:
|
|
859
|
-
trackElement('applepay_token_success', {
|
|
860
|
-
d1: (_capturedResult = capturedResult) !== null && _capturedResult !== void 0 && _capturedResult.token ? 'has_token' : 'no_token'
|
|
861
|
-
});
|
|
862
|
-
this.bridge.send(AMSMessageType.GET_APPLE_PAY_TOKEN_REPLY, {
|
|
863
|
-
success: true,
|
|
864
|
-
result: capturedResult
|
|
865
|
-
});
|
|
866
|
-
_context5.next = 25;
|
|
867
|
-
break;
|
|
868
|
-
case 21:
|
|
869
|
-
_context5.prev = 21;
|
|
870
|
-
_context5.t0 = _context5["catch"](14);
|
|
871
|
-
// 商户验证失败已在 validateMerchant 内单独埋点(applepay_merchant_validate_failed),此处跳过避免重复
|
|
872
|
-
if ((_context5.t0 === null || _context5.t0 === void 0 ? void 0 : _context5.t0.errorCode) !== 'APPLE_PAY_PAYMENT_SESSION_REQUEST_FAILED') {
|
|
873
|
-
errCode = (_context5.t0 === null || _context5.t0 === void 0 ? void 0 : _context5.t0.errorCode) || 'APPLE_PAY_NOT_SUPPORTED'; // 用户主动取消单独标记,便于区分取消与真实失败
|
|
874
|
-
if (errCode === 'APPLE_PAY_CANCEL') {
|
|
875
|
-
trackElement('applepay_cancel', {
|
|
876
|
-
d1: 'user_cancel'
|
|
877
|
-
});
|
|
878
|
-
} else {
|
|
879
|
-
trackError('applepay_token_failed', {
|
|
880
|
-
d1: errCode,
|
|
881
|
-
d2: (_context5.t0 === null || _context5.t0 === void 0 ? void 0 : _context5.t0.errorMessage) || ''
|
|
882
|
-
});
|
|
883
|
-
}
|
|
884
|
-
}
|
|
885
|
-
this.bridge.send(AMSMessageType.GET_APPLE_PAY_TOKEN_REPLY, {
|
|
886
|
-
success: false,
|
|
887
|
-
result: {
|
|
888
|
-
errorCode: (_context5.t0 === null || _context5.t0 === void 0 ? void 0 : _context5.t0.errorCode) || 'APPLE_PAY_NOT_SUPPORTED'
|
|
889
|
-
}
|
|
890
|
-
});
|
|
891
|
-
case 25:
|
|
892
|
-
case "end":
|
|
893
|
-
return _context5.stop();
|
|
894
|
-
}
|
|
895
|
-
}, _callee5, this, [[14, 21]]);
|
|
896
|
-
}));
|
|
897
|
-
function handleGetApplePayToken(_x4, _x5) {
|
|
898
|
-
return _handleGetApplePayToken.apply(this, arguments);
|
|
899
|
-
}
|
|
900
|
-
return handleGetApplePayToken;
|
|
901
|
-
}()
|
|
902
|
-
/**
|
|
903
|
-
* 处理 webapp 委托的 Google Pay token 请求。
|
|
904
|
-
*
|
|
905
|
-
* 背景:Web element 场景下,GP 按钮在跨域 iframe 中隐藏,商户通过 SDK submitPay 触发。
|
|
906
|
-
* 跨域 iframe 中 btn.click() 是编程式点击(isTrusted=false),第二次 PaymentRequest.show()
|
|
907
|
-
* 需要 transient user activation,iframe 内无法满足。因此委托 SDK/父 frame 调 loadPaymentData。
|
|
908
|
-
*
|
|
909
|
-
* 流程(对齐 v1 GooglePayLaunchSpecificPaymentMethodHandler.clickWebViewButton):
|
|
910
|
-
* 1. 从 payload 中提取 environment + paymentRequest
|
|
911
|
-
* 2. 动态加载 Google Pay SDK 脚本
|
|
912
|
-
* 3. 创建 PaymentsClient + isReadyToPay + loadPaymentData
|
|
913
|
-
* 4. 成功 → GET_GOOGLE_PAY_TOKEN_REPLY { success: true, result }
|
|
914
|
-
* 5. 取消 → GET_GOOGLE_PAY_TOKEN_REPLY { success: false, err: { statusCode: 'CANCELED' } }
|
|
915
|
-
* 6. 失败 → GET_GOOGLE_PAY_TOKEN_REPLY { success: false, err: { statusCode } }
|
|
916
|
-
*/
|
|
917
|
-
)
|
|
918
|
-
}, {
|
|
919
|
-
key: "handleGetGooglePayToken",
|
|
920
|
-
value: function handleGetGooglePayToken(payload) {
|
|
921
|
-
var _data$paymentMethodDe,
|
|
922
|
-
_this4 = this,
|
|
923
|
-
_google;
|
|
924
|
-
var data = payload === null || payload === void 0 ? void 0 : payload.data;
|
|
925
|
-
var googlePayProps = data === null || data === void 0 || (_data$paymentMethodDe = data.paymentMethodDetail) === null || _data$paymentMethodDe === void 0 ? void 0 : _data$paymentMethodDe.googlePayProps;
|
|
926
|
-
// 优先从 data 顶层取(elements2 的 requestTokenViaSdk 直接传了 environment/paymentRequest),
|
|
927
|
-
// 否则从 paymentMethodDetail.googlePayProps 取(兼容 v1 的数据结构)
|
|
928
|
-
var environment = (data === null || data === void 0 ? void 0 : data.environment) || (googlePayProps === null || googlePayProps === void 0 ? void 0 : googlePayProps.environment) || 'TEST';
|
|
929
|
-
var paymentRequest = (data === null || data === void 0 ? void 0 : data.paymentRequest) || (googlePayProps === null || googlePayProps === void 0 ? void 0 : googlePayProps.paymentRequest) || {};
|
|
930
|
-
trackElement('googlepay_token_request', {
|
|
931
|
-
d1: environment,
|
|
932
|
-
d2: paymentRequest ? 'has_payment_request' : 'no_payment_request'
|
|
933
|
-
});
|
|
934
|
-
if (!paymentRequest || !Object.keys(paymentRequest).length) {
|
|
935
|
-
trackError('googlepay_token_missing_data', {
|
|
936
|
-
d1: 'MISSING_DATA'
|
|
937
|
-
});
|
|
938
|
-
this.bridge.send(AMSMessageType.GET_GOOGLE_PAY_TOKEN_REPLY, {
|
|
939
|
-
success: false,
|
|
940
|
-
err: {
|
|
941
|
-
statusCode: 'GOOGLE_PAY_PAYMENT_FAILED'
|
|
942
|
-
}
|
|
943
|
-
});
|
|
944
|
-
return;
|
|
945
|
-
}
|
|
946
|
-
var loadAndPay = function loadAndPay() {
|
|
947
|
-
var paymentsClient = new window.google.payments.api.PaymentsClient({
|
|
948
|
-
environment: environment,
|
|
949
|
-
paymentDataCallbacks: {
|
|
950
|
-
onPaymentAuthorized: function onPaymentAuthorized() {
|
|
951
|
-
return {
|
|
952
|
-
transactionState: 'SUCCESS'
|
|
953
|
-
};
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
});
|
|
957
|
-
paymentsClient.isReadyToPay(paymentRequest).then(function (response) {
|
|
958
|
-
if (response.result) {
|
|
959
|
-
return paymentsClient.loadPaymentData(paymentRequest);
|
|
960
|
-
}
|
|
961
|
-
throw {
|
|
962
|
-
statusCode: 'GOOGLE_PAY_NOT_SUPPORTED'
|
|
963
|
-
};
|
|
964
|
-
}).then(function (paymentData) {
|
|
965
|
-
if (paymentData) {
|
|
966
|
-
trackElement('googlepay_token_success', {
|
|
967
|
-
d1: 'has_token'
|
|
968
|
-
});
|
|
969
|
-
_this4.bridge.send(AMSMessageType.GET_GOOGLE_PAY_TOKEN_REPLY, {
|
|
970
|
-
success: true,
|
|
971
|
-
result: paymentData
|
|
972
|
-
});
|
|
973
|
-
}
|
|
974
|
-
}).catch(function (err) {
|
|
975
|
-
var statusCode = (err === null || err === void 0 ? void 0 : err.statusCode) || 'GOOGLE_PAY_PAYMENT_FAILED';
|
|
976
|
-
if (statusCode === 'CANCELED') {
|
|
977
|
-
trackElement('googlepay_cancel', {
|
|
978
|
-
d1: 'user_cancel'
|
|
979
|
-
});
|
|
980
|
-
} else {
|
|
981
|
-
trackError('googlepay_token_failed', {
|
|
982
|
-
d1: statusCode,
|
|
983
|
-
d2: (err === null || err === void 0 ? void 0 : err.statusMessage) || ''
|
|
984
|
-
});
|
|
985
|
-
}
|
|
986
|
-
_this4.bridge.send(AMSMessageType.GET_GOOGLE_PAY_TOKEN_REPLY, {
|
|
987
|
-
success: false,
|
|
988
|
-
err: _objectSpread({
|
|
989
|
-
statusCode: statusCode
|
|
990
|
-
}, err)
|
|
991
|
-
});
|
|
992
|
-
});
|
|
993
|
-
};
|
|
994
|
-
|
|
995
|
-
// 如果 GP SDK 已经加载过(iframe 或其他渠道已加载),直接用
|
|
996
|
-
if ((_google = window.google) !== null && _google !== void 0 && (_google = _google.payments) !== null && _google !== void 0 && (_google = _google.api) !== null && _google !== void 0 && _google.PaymentsClient) {
|
|
997
|
-
loadAndPay();
|
|
998
|
-
return;
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
// 否则动态加载 GP SDK 脚本
|
|
1002
|
-
var script = document.createElement('script');
|
|
1003
|
-
script.src = 'https://pay.google.com/gp/p/js/pay.js';
|
|
1004
|
-
script.async = true;
|
|
1005
|
-
document.body.appendChild(script);
|
|
1006
|
-
script.onload = function () {
|
|
1007
|
-
loadAndPay();
|
|
1008
|
-
};
|
|
1009
|
-
script.onerror = function () {
|
|
1010
|
-
trackError('googlepay_script_load_failed', {
|
|
1011
|
-
d1: 'script_error'
|
|
1012
|
-
});
|
|
1013
|
-
_this4.bridge.send(AMSMessageType.GET_GOOGLE_PAY_TOKEN_REPLY, {
|
|
1014
|
-
success: false,
|
|
1015
|
-
err: {
|
|
1016
|
-
statusCode: 'GOOGLE_PAY_NOT_SUPPORTED'
|
|
1017
|
-
}
|
|
1018
|
-
});
|
|
1019
|
-
};
|
|
1020
|
-
}
|
|
1021
|
-
|
|
1022
|
-
/**
|
|
1023
|
-
* 处理 webapp 委托的 skipRenderPaymentMethod 拉起请求(fire-and-forget)。
|
|
1024
|
-
* 走 plugin/applepay 标准链路:ApplePayBusSubscriber.onCreateComponent 自动注入
|
|
1025
|
-
* onEventCallback,通过 BusManager.publish(SDKCallbackActionEnum.onEventCallback)
|
|
1026
|
-
* 通知商户。SDK 端不需要 reply 给 webapp。
|
|
1027
|
-
*/
|
|
1028
|
-
}, {
|
|
1029
|
-
key: "handleHandlePayment",
|
|
1030
|
-
value: function handleHandlePayment() {
|
|
1031
|
-
var sessionData = this.options.sessionData;
|
|
1032
|
-
var parseData = getMetaData(sessionData);
|
|
1033
|
-
trackElement('handle_payment', {
|
|
1034
|
-
d1: 'skipRender_applepay_publish'
|
|
1035
|
-
});
|
|
1036
|
-
if (!parseData) {
|
|
1037
|
-
trackError('handle_payment_meta_failed', {
|
|
1038
|
-
d1: 'meta_parse_failed'
|
|
1039
|
-
});
|
|
1040
|
-
}
|
|
1041
|
-
BusManager.publish(new BusMessage(ApplePayActionEnum.createComponent, JSON.stringify({
|
|
1042
|
-
appendParams: {
|
|
1043
|
-
iframeNodesParams: {
|
|
1044
|
-
sessionData: sessionData,
|
|
1045
|
-
paymentSessionMetaData: parseData
|
|
1046
|
-
}
|
|
1047
|
-
},
|
|
1048
|
-
options: {
|
|
1049
|
-
environment: this.options.environment,
|
|
1050
|
-
locale: this.options.locale
|
|
1051
|
-
}
|
|
1052
|
-
})));
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
/**
|
|
1056
|
-
* 处理来自 webapp 的 beforeConfirm 请求(Apple Pay 授权后、扣款前)。
|
|
1057
|
-
* onBeforeConfirm 由 submitPayment 闭包传入,不需要从 this 读取。
|
|
1058
|
-
*/
|
|
1059
|
-
}, {
|
|
1060
|
-
key: "handleBeforeConfirmInternal",
|
|
1061
|
-
value: function handleBeforeConfirmInternal(onBeforeConfirm) {
|
|
1062
|
-
var _this5 = this;
|
|
1063
|
-
if (!onBeforeConfirm) {
|
|
1064
|
-
logger.logInfo({
|
|
1065
|
-
title: 'sdk_before_confirm_skip'
|
|
1066
|
-
}, {
|
|
1067
|
-
path: 'modernController_bridge'
|
|
1068
|
-
});
|
|
1069
|
-
this.bridge.send(AMSMessageType.BEFORE_CONFIRM_REPLY, {
|
|
1070
|
-
success: true,
|
|
1071
|
-
result: true
|
|
1072
|
-
});
|
|
1073
|
-
return;
|
|
1074
|
-
}
|
|
1075
|
-
logger.logInfo({
|
|
1076
|
-
title: 'sdk_before_confirm_start'
|
|
1077
|
-
}, {
|
|
1078
|
-
path: 'modernController_bridge'
|
|
1079
|
-
});
|
|
1080
|
-
executeWithTimeout(function () {
|
|
1081
|
-
return onBeforeConfirm();
|
|
1082
|
-
}).then(function (_ref6) {
|
|
1083
|
-
var rawResult = _ref6.result,
|
|
1084
|
-
timedOut = _ref6.timedOut;
|
|
1085
|
-
var shouldContinue = timedOut ? false : !!rawResult;
|
|
1086
|
-
if (timedOut) {
|
|
1087
|
-
logger.logError({
|
|
1088
|
-
title: 'sdk_before_confirm_timeout'
|
|
1089
|
-
});
|
|
1090
|
-
}
|
|
1091
|
-
logger.logInfo({
|
|
1092
|
-
title: 'sdk_element_beforeConfirm_callback_result'
|
|
1093
|
-
}, {
|
|
1094
|
-
shouldContinue: shouldContinue
|
|
1095
|
-
});
|
|
1096
|
-
_this5.bridge.send(AMSMessageType.BEFORE_CONFIRM_REPLY, {
|
|
1097
|
-
success: true,
|
|
1098
|
-
result: !!shouldContinue
|
|
1099
|
-
});
|
|
1100
|
-
}).catch(function (error) {
|
|
1101
|
-
logger.logError({
|
|
1102
|
-
title: 'sdk_before_confirm_error'
|
|
1103
|
-
}, {
|
|
1104
|
-
errorMessage: String((error === null || error === void 0 ? void 0 : error.message) || error).slice(0, 200),
|
|
1105
|
-
path: 'modernController_bridge'
|
|
1106
|
-
});
|
|
1107
|
-
_this5.bridge.send(AMSMessageType.BEFORE_CONFIRM_REPLY, {
|
|
1108
|
-
success: false,
|
|
1109
|
-
result: false
|
|
1110
|
-
});
|
|
1111
|
-
});
|
|
1112
|
-
}
|
|
1113
|
-
|
|
1114
|
-
/**
|
|
1115
|
-
* 等待 webapp 发送 READY_HANDSHAKE(表示 iframe 已加载并准备好握手),
|
|
1116
|
-
* 收到后设置 bridge target 和安全源
|
|
1117
|
-
*/
|
|
1118
|
-
}, {
|
|
1119
|
-
key: "waitForReadyHandshake",
|
|
1120
|
-
value: function waitForReadyHandshake() {
|
|
1121
|
-
var _this6 = this;
|
|
1122
|
-
return new Promise(function (resolve, reject) {
|
|
1123
|
-
var timer = setTimeout(function () {
|
|
1124
|
-
trackError('ready_handshake_timeout', {
|
|
1125
|
-
d1: String(MOUNT_TIMEOUT)
|
|
1126
|
-
});
|
|
1127
|
-
reject({
|
|
1128
|
-
code: 'INITIALIZE_WEB_TIMEOUT',
|
|
1129
|
-
message: 'An error occurred; the transaction cannot be initiated.'
|
|
1130
|
-
});
|
|
1131
|
-
}, MOUNT_TIMEOUT);
|
|
1132
|
-
_this6.bridge.once(MessageType.READY_HANDSHAKE, function () {
|
|
1133
|
-
var _this6$iframe;
|
|
1134
|
-
clearTimeout(timer);
|
|
1135
|
-
if (!((_this6$iframe = _this6.iframe) !== null && _this6$iframe !== void 0 && _this6$iframe.contentWindow)) {
|
|
1136
|
-
trackError('iframe_contentwindow_unavailable', {
|
|
1137
|
-
d1: 'after_ready_handshake'
|
|
1138
|
-
});
|
|
1139
|
-
reject({
|
|
1140
|
-
code: 'SDK_LAUNCH_PAYMENT_APP_ERROR',
|
|
1141
|
-
message: 'Iframe contentWindow not available'
|
|
1142
|
-
});
|
|
1143
|
-
return;
|
|
1144
|
-
}
|
|
1145
|
-
_this6.bridge.setTarget(_this6.iframe.contentWindow);
|
|
1146
|
-
trackHandshake('ready_handshake_received', {
|
|
1147
|
-
m1: _this6._mountStartTime ? Date.now() - _this6._mountStartTime : 0
|
|
1148
|
-
});
|
|
1149
|
-
resolve();
|
|
1150
|
-
});
|
|
1151
|
-
});
|
|
1152
|
-
}
|
|
1153
|
-
|
|
1154
|
-
/**
|
|
1155
|
-
* 发送 HANDSHAKE 配置给 webapp(setup 和 READY_HANDSHAKE 都完成后调用)
|
|
1156
|
-
*/
|
|
1157
|
-
}, {
|
|
1158
|
-
key: "sendHandshake",
|
|
1159
|
-
value: function sendHandshake(setupConfig) {
|
|
1160
|
-
this.bridge.send(MessageType.HANDSHAKE, setupConfig);
|
|
1161
|
-
trackHandshake('handshake_sent', {
|
|
1162
|
-
d1: (setupConfig === null || setupConfig === void 0 ? void 0 : setupConfig.sdkVersion) || ''
|
|
1163
|
-
});
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
/**
|
|
1167
|
-
* 等待 webapp 返回 HANDSHAKE_ACK(确认握手完成)
|
|
1168
|
-
*/
|
|
1169
|
-
}, {
|
|
1170
|
-
key: "waitForHandshakeAck",
|
|
1171
|
-
value: function waitForHandshakeAck() {
|
|
1172
|
-
var _this7 = this;
|
|
1173
|
-
return new Promise(function (resolve, reject) {
|
|
1174
|
-
var timer = setTimeout(function () {
|
|
1175
|
-
trackError('handshake_ack_timeout', {
|
|
1176
|
-
d1: String(MOUNT_TIMEOUT)
|
|
1177
|
-
});
|
|
1178
|
-
reject({
|
|
1179
|
-
code: 'INITIALIZE_WEB_TIMEOUT',
|
|
1180
|
-
message: 'An error occurred; the transaction cannot be initiated.'
|
|
1181
|
-
});
|
|
1182
|
-
}, MOUNT_TIMEOUT);
|
|
1183
|
-
_this7.bridge.once(MessageType.HANDSHAKE_ACK, function () {
|
|
1184
|
-
clearTimeout(timer);
|
|
1185
|
-
trackHandshake('handshake_ack_received', {
|
|
1186
|
-
m1: _this7._mountStartTime ? Date.now() - _this7._mountStartTime : 0
|
|
1187
|
-
});
|
|
1188
|
-
resolve();
|
|
1189
|
-
});
|
|
1190
|
-
});
|
|
1191
|
-
}
|
|
1192
|
-
}, {
|
|
1193
|
-
key: "submitPayment",
|
|
1194
|
-
value: function () {
|
|
1195
|
-
var _submitPayment = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(params) {
|
|
1196
|
-
var _this$options$loading7,
|
|
1197
|
-
_this$options$loading8,
|
|
1198
|
-
_this8 = this;
|
|
1199
|
-
var isApplePay, _ref7, onBeforeConfirm, serializableParams, startTime, _yield$executeWithTim2, shouldContinue, timedOut, hasBeforeConfirmForApplePay, hasAmount, hasCurrency, _result$error, resultPromise, result, _this$options$loading9, _this$options$loading10;
|
|
1200
|
-
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
|
|
1201
|
-
while (1) switch (_context6.prev = _context6.next) {
|
|
1202
|
-
case 0:
|
|
1203
|
-
if (!(this.status !== 'ready')) {
|
|
1204
|
-
_context6.next = 3;
|
|
1205
|
-
break;
|
|
1206
|
-
}
|
|
1207
|
-
trackError('submit_not_ready', {
|
|
1208
|
-
d1: this.status
|
|
1209
|
-
});
|
|
1210
|
-
return _context6.abrupt("return", {
|
|
1211
|
-
status: 'FAIL',
|
|
1212
|
-
error: {
|
|
1213
|
-
code: 'UI_STATE_ERROR',
|
|
1214
|
-
message: 'not ready'
|
|
1215
|
-
}
|
|
1216
|
-
});
|
|
1217
|
-
case 3:
|
|
1218
|
-
isApplePay = this.currentPaymentMethodType === 'APPLEPAY'; // 剥除 onBeforeConfirm 函数,避免 postMessage 序列化报错
|
|
1219
|
-
_ref7 = params || {}, onBeforeConfirm = _ref7.onBeforeConfirm, serializableParams = _objectWithoutProperties(_ref7, _excluded2); // ── 非 Apple Pay:同步执行 onBeforeConfirm(submit 前拦截,对齐老 ElementController) ──
|
|
1220
|
-
if (!(onBeforeConfirm && !isApplePay)) {
|
|
1221
|
-
_context6.next = 26;
|
|
1222
|
-
break;
|
|
1223
|
-
}
|
|
1224
|
-
logger.logInfo({
|
|
1225
|
-
title: 'sdk_before_confirm_start'
|
|
1226
|
-
}, {
|
|
1227
|
-
paymentMethodType: this.currentPaymentMethodType || 'UNKNOWN',
|
|
1228
|
-
path: 'nonApplePay_sync'
|
|
1229
|
-
});
|
|
1230
|
-
_context6.prev = 7;
|
|
1231
|
-
startTime = Date.now();
|
|
1232
|
-
_context6.next = 11;
|
|
1233
|
-
return executeWithTimeout(function () {
|
|
1234
|
-
return onBeforeConfirm();
|
|
1235
|
-
});
|
|
1236
|
-
case 11:
|
|
1237
|
-
_yield$executeWithTim2 = _context6.sent;
|
|
1238
|
-
shouldContinue = _yield$executeWithTim2.result;
|
|
1239
|
-
timedOut = _yield$executeWithTim2.timedOut;
|
|
1240
|
-
if (!(timedOut || !shouldContinue || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS)) {
|
|
1241
|
-
_context6.next = 17;
|
|
1242
|
-
break;
|
|
1243
|
-
}
|
|
1244
|
-
if (timedOut) {
|
|
1245
|
-
logger.logError({
|
|
1246
|
-
title: 'sdk_before_confirm_timeout'
|
|
1247
|
-
}, {
|
|
1248
|
-
paymentMethodType: this.currentPaymentMethodType || 'UNKNOWN',
|
|
1249
|
-
path: 'nonApplePay_sync'
|
|
1250
|
-
});
|
|
1251
|
-
} else {
|
|
1252
|
-
logger.logInfo({
|
|
1253
|
-
title: 'sdk_before_confirm_abort'
|
|
1254
|
-
}, {
|
|
1255
|
-
paymentMethodType: this.currentPaymentMethodType || 'UNKNOWN',
|
|
1256
|
-
path: 'nonApplePay_sync'
|
|
1257
|
-
});
|
|
1258
|
-
}
|
|
1259
|
-
return _context6.abrupt("return", {
|
|
1260
|
-
status: 'FAIL',
|
|
1261
|
-
error: {
|
|
1262
|
-
code: 'MERCHANT_CONFIRM_ABORT',
|
|
1263
|
-
message: 'Merchant canceled payment.'
|
|
1264
|
-
}
|
|
1265
|
-
});
|
|
1266
|
-
case 17:
|
|
1267
|
-
logger.logInfo({
|
|
1268
|
-
title: 'sdk_before_confirm_success'
|
|
1269
|
-
}, {
|
|
1270
|
-
paymentMethodType: this.currentPaymentMethodType || 'UNKNOWN',
|
|
1271
|
-
path: 'nonApplePay_sync'
|
|
1272
|
-
});
|
|
1273
|
-
_context6.next = 24;
|
|
1274
|
-
break;
|
|
1275
|
-
case 20:
|
|
1276
|
-
_context6.prev = 20;
|
|
1277
|
-
_context6.t0 = _context6["catch"](7);
|
|
1278
|
-
logger.logError({
|
|
1279
|
-
title: 'sdk_before_confirm_error'
|
|
1280
|
-
}, {
|
|
1281
|
-
paymentMethodType: this.currentPaymentMethodType || 'UNKNOWN',
|
|
1282
|
-
errorMessage: String((_context6.t0 === null || _context6.t0 === void 0 ? void 0 : _context6.t0.message) || _context6.t0).slice(0, 200),
|
|
1283
|
-
path: 'nonApplePay_sync'
|
|
1284
|
-
});
|
|
1285
|
-
return _context6.abrupt("return", {
|
|
1286
|
-
status: 'FAIL',
|
|
1287
|
-
error: {
|
|
1288
|
-
code: 'MERCHANT_CONFIRM_ABORT',
|
|
1289
|
-
message: 'Merchant canceled payment.'
|
|
1290
|
-
}
|
|
1291
|
-
});
|
|
1292
|
-
case 24:
|
|
1293
|
-
_context6.next = 27;
|
|
1294
|
-
break;
|
|
1295
|
-
case 26:
|
|
1296
|
-
if (!onBeforeConfirm) {
|
|
1297
|
-
logger.logInfo({
|
|
1298
|
-
title: 'sdk_before_confirm_skip'
|
|
1299
|
-
}, {
|
|
1300
|
-
paymentMethodType: this.currentPaymentMethodType || 'UNKNOWN',
|
|
1301
|
-
path: isApplePay ? 'applePay_eventBridge' : 'nonApplePay_sync'
|
|
1302
|
-
});
|
|
1303
|
-
}
|
|
1304
|
-
case 27:
|
|
1305
|
-
// Apple Pay: 标记是否有 beforeConfirm,供 SUBMIT 消息的 hasBeforeConfirm 字段使用
|
|
1306
|
-
hasBeforeConfirmForApplePay = isApplePay && !!onBeforeConfirm; // ── amount/currency 校验 + 缓存(对齐老 ElementController 逻辑) ──
|
|
1307
|
-
hasAmount = !!(serializableParams !== null && serializableParams !== void 0 && serializableParams.amount);
|
|
1308
|
-
hasCurrency = !!(serializableParams !== null && serializableParams !== void 0 && serializableParams.currency);
|
|
1309
|
-
if ((hasAmount || hasCurrency) && !(hasAmount && hasCurrency)) {
|
|
1310
|
-
logger.logError({
|
|
1311
|
-
title: 'sdk_element_submitPayment_amountCurrencyMismatch'
|
|
1312
|
-
}, {
|
|
1313
|
-
amount: serializableParams === null || serializableParams === void 0 ? void 0 : serializableParams.amount,
|
|
1314
|
-
currency: serializableParams === null || serializableParams === void 0 ? void 0 : serializableParams.currency,
|
|
1315
|
-
reason: 'amount and currency must be provided together, both ignored'
|
|
1316
|
-
});
|
|
1317
|
-
}
|
|
1318
|
-
this._merchantAmount = hasAmount && hasCurrency ? serializableParams.amount : null;
|
|
1319
|
-
this._merchantCurrency = hasAmount && hasCurrency ? serializableParams.currency : null;
|
|
1320
|
-
(_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);
|
|
1321
|
-
trackElement('submit_start', {
|
|
1322
|
-
d1: this.notRedirectAfterComplete ? 'if_required' : 'always'
|
|
1323
|
-
});
|
|
1324
|
-
_context6.prev = 35;
|
|
1325
|
-
resultPromise = new Promise(function (resolve) {
|
|
1326
|
-
// 先注册事件监听,再发送 SUBMIT,避免 webapp 快速响应导致消息丢失
|
|
1327
|
-
// PC 非 Safari:webapp 委托 SDK 拉起 Apple Pay 拿 token
|
|
1328
|
-
_this8.bridge.once(AMSMessageType.GET_APPLE_PAY_TOKEN, function (payload) {
|
|
1329
|
-
_this8.handleGetApplePayToken(payload, onBeforeConfirm).then(function () {
|
|
1330
|
-
// token 已回传 webapp,继续等 SUBMIT_REPLY
|
|
1331
|
-
});
|
|
1332
|
-
});
|
|
1333
|
-
// Web element GP:webapp 委托 SDK/父 frame 调 loadPaymentData 拿 token
|
|
1334
|
-
_this8.bridge.once(AMSMessageType.GET_GOOGLE_PAY_TOKEN, function (payload) {
|
|
1335
|
-
_this8.handleGetGooglePayToken(payload);
|
|
1336
|
-
});
|
|
1337
|
-
// Safari:webapp 请求执行商户 onBeforeConfirm 回调
|
|
1338
|
-
_this8.bridge.once(AMSMessageType.BEFORE_CONFIRM, function () {
|
|
1339
|
-
_this8.handleBeforeConfirmInternal(onBeforeConfirm || null);
|
|
1340
|
-
});
|
|
1341
|
-
_this8.bridge.once(MessageType.SUBMIT_REPLY, resolve);
|
|
1342
|
-
}); // 监听注册完成后再发送 SUBMIT,确保不会遗漏快速响应
|
|
1343
|
-
this.send(MessageType.SUBMIT, _objectSpread(_objectSpread({}, serializableParams), {}, {
|
|
1344
|
-
redirect: this.notRedirectAfterComplete ? 'if_required' : 'always',
|
|
1345
|
-
hasBeforeConfirm: hasBeforeConfirmForApplePay
|
|
1346
|
-
}, hasAmount && hasCurrency ? {
|
|
1347
|
-
amount: serializableParams.amount,
|
|
1348
|
-
currency: serializableParams.currency
|
|
1349
|
-
} : {}));
|
|
1350
|
-
_context6.next = 40;
|
|
1351
|
-
return resultPromise;
|
|
1352
|
-
case 40:
|
|
1353
|
-
result = _context6.sent;
|
|
1354
|
-
trackElement('submit_reply', {
|
|
1355
|
-
d1: (result === null || result === void 0 ? void 0 : result.status) || '',
|
|
1356
|
-
d2: (result === null || result === void 0 || (_result$error = result.error) === null || _result$error === void 0 ? void 0 : _result$error.code) || ''
|
|
1357
|
-
});
|
|
1358
|
-
return _context6.abrupt("return", adaptSubmitResult(result));
|
|
1359
|
-
case 45:
|
|
1360
|
-
_context6.prev = 45;
|
|
1361
|
-
_context6.t1 = _context6["catch"](35);
|
|
1362
|
-
trackError('submit_error', {
|
|
1363
|
-
d1: (_context6.t1 === null || _context6.t1 === void 0 ? void 0 : _context6.t1.code) || 'UNKNOWN',
|
|
1364
|
-
d2: (_context6.t1 === null || _context6.t1 === void 0 ? void 0 : _context6.t1.message) || ''
|
|
1365
|
-
});
|
|
1366
|
-
throw _context6.t1;
|
|
1367
|
-
case 49:
|
|
1368
|
-
_context6.prev = 49;
|
|
1369
|
-
(_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);
|
|
1370
|
-
return _context6.finish(49);
|
|
1371
|
-
case 52:
|
|
1372
|
-
case "end":
|
|
1373
|
-
return _context6.stop();
|
|
1374
|
-
}
|
|
1375
|
-
}, _callee6, this, [[7, 20], [35, 45, 49, 52]]);
|
|
1376
|
-
}));
|
|
1377
|
-
function submitPayment(_x8) {
|
|
1378
|
-
return _submitPayment.apply(this, arguments);
|
|
1379
|
-
}
|
|
1380
|
-
return submitPayment;
|
|
1381
|
-
}()
|
|
1382
|
-
}, {
|
|
1383
|
-
key: "validateFields",
|
|
1384
|
-
value: function () {
|
|
1385
|
-
var _validateFields = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
|
|
1386
|
-
var _this9 = this;
|
|
1387
|
-
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
|
|
1388
|
-
while (1) switch (_context7.prev = _context7.next) {
|
|
1389
|
-
case 0:
|
|
1390
|
-
if (!(this.status !== 'ready')) {
|
|
1391
|
-
_context7.next = 3;
|
|
1392
|
-
break;
|
|
1393
|
-
}
|
|
1394
|
-
trackError('validate_not_ready', {
|
|
1395
|
-
d1: this.status
|
|
1396
|
-
});
|
|
1397
|
-
return _context7.abrupt("return", {
|
|
1398
|
-
isValid: false
|
|
1399
|
-
});
|
|
1400
|
-
case 3:
|
|
1401
|
-
this.send(AMSMessageType.VALIDATE);
|
|
1402
|
-
return _context7.abrupt("return", new Promise(function (resolve) {
|
|
1403
|
-
var timer = setTimeout(function () {
|
|
1404
|
-
trackError('validate_fields_timeout', {
|
|
1405
|
-
d1: '15000'
|
|
1406
|
-
});
|
|
1407
|
-
resolve({
|
|
1408
|
-
isValid: false
|
|
1409
|
-
});
|
|
1410
|
-
}, 15000);
|
|
1411
|
-
_this9.bridge.once(AMSMessageType.VALIDATE_REPLY, function (payload) {
|
|
1412
|
-
clearTimeout(timer);
|
|
1413
|
-
var isValid = !!(payload !== null && payload !== void 0 && payload.isValid);
|
|
1414
|
-
trackElement('validate_result', {
|
|
1415
|
-
d1: isValid ? 'valid' : 'invalid'
|
|
1416
|
-
});
|
|
1417
|
-
resolve(payload || {
|
|
1418
|
-
isValid: false
|
|
1419
|
-
});
|
|
1420
|
-
});
|
|
1421
|
-
}));
|
|
1422
|
-
case 5:
|
|
1423
|
-
case "end":
|
|
1424
|
-
return _context7.stop();
|
|
1425
|
-
}
|
|
1426
|
-
}, _callee7, this);
|
|
1427
|
-
}));
|
|
1428
|
-
function validateFields() {
|
|
1429
|
-
return _validateFields.apply(this, arguments);
|
|
1430
|
-
}
|
|
1431
|
-
return validateFields;
|
|
1432
|
-
}() // eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1433
|
-
}, {
|
|
1434
|
-
key: "updatePayment",
|
|
1435
|
-
value: function () {
|
|
1436
|
-
var _updatePayment = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(paymentSessionData) {
|
|
1437
|
-
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
|
|
1438
|
-
while (1) switch (_context8.prev = _context8.next) {
|
|
1439
|
-
case 0:
|
|
1440
|
-
return _context8.abrupt("return", false);
|
|
1441
|
-
case 1:
|
|
1442
|
-
case "end":
|
|
1443
|
-
return _context8.stop();
|
|
1444
|
-
}
|
|
1445
|
-
}, _callee8);
|
|
1446
|
-
}));
|
|
1447
|
-
function updatePayment(_x9) {
|
|
1448
|
-
return _updatePayment.apply(this, arguments);
|
|
1449
|
-
}
|
|
1450
|
-
return updatePayment;
|
|
1451
|
-
}()
|
|
1452
|
-
}, {
|
|
1453
|
-
key: "on",
|
|
1454
|
-
value: function on(event, callback) {
|
|
1455
|
-
this.bridge.on(event, callback);
|
|
1456
|
-
}
|
|
1457
|
-
}, {
|
|
1458
|
-
key: "destroy",
|
|
1459
|
-
value: function destroy() {
|
|
1460
|
-
var _this$iframe;
|
|
1461
|
-
trackElement('destroy', {
|
|
1462
|
-
d1: this.status
|
|
1463
|
-
});
|
|
1464
|
-
if (this.status !== 'ready' && this.status !== 'mounted') {
|
|
1465
|
-
debug('INFO', 'SDK_USAGE', 'destroy', "destroy called when status is ".concat(this.status, ", cannot destroy, only destroy when status is 'ready' or 'mounted'"));
|
|
1466
|
-
return;
|
|
1467
|
-
}
|
|
1468
|
-
this.handleCloseModal();
|
|
1469
|
-
this.bridge.destroy();
|
|
1470
|
-
if ((_this$iframe = this.iframe) !== null && _this$iframe !== void 0 && _this$iframe.parentNode) this.iframe.parentNode.removeChild(this.iframe);
|
|
1471
|
-
this.iframe = null;
|
|
1472
|
-
this.setStatus('destroyed');
|
|
1473
|
-
this.cachedSend = [];
|
|
1474
|
-
}
|
|
1475
|
-
}, {
|
|
1476
|
-
key: "cleanup",
|
|
1477
|
-
value: function cleanup() {
|
|
1478
|
-
var _this$iframe2;
|
|
1479
|
-
if ((_this$iframe2 = this.iframe) !== null && _this$iframe2 !== void 0 && _this$iframe2.parentNode) this.iframe.parentNode.removeChild(this.iframe);
|
|
1480
|
-
this.iframe = null;
|
|
1481
|
-
this.setStatus('initialized');
|
|
1482
|
-
this.cachedSend = [];
|
|
1483
|
-
}
|
|
1484
|
-
}, {
|
|
1485
|
-
key: "setStatus",
|
|
1486
|
-
value: function setStatus(status) {
|
|
1487
|
-
var _this$onStatusChange;
|
|
1488
|
-
if (status === this.status) return;
|
|
1489
|
-
var previousStatus = this.status;
|
|
1490
|
-
this.status = status;
|
|
1491
|
-
(_this$onStatusChange = this.onStatusChange) === null || _this$onStatusChange === void 0 || _this$onStatusChange.call(this, status, previousStatus);
|
|
1492
|
-
}
|
|
1493
|
-
|
|
1494
|
-
/**
|
|
1495
|
-
* 带缓存的消息发送:当 status 不是 ready 时,缓存消息;ready 后由 flushCachedMessages 批量发送
|
|
1496
|
-
*/
|
|
1497
|
-
}, {
|
|
1498
|
-
key: "send",
|
|
1499
|
-
value: function send(type, payload) {
|
|
1500
|
-
if (this.status === 'destroyed') {
|
|
1501
|
-
return;
|
|
1502
|
-
}
|
|
1503
|
-
if (this.status !== 'ready') {
|
|
1504
|
-
this.cachedSend.push({
|
|
1505
|
-
type: type,
|
|
1506
|
-
payload: payload
|
|
1507
|
-
});
|
|
1508
|
-
return;
|
|
1509
|
-
}
|
|
1510
|
-
this.bridge.send(type, payload);
|
|
1511
|
-
}
|
|
1512
|
-
|
|
1513
|
-
/**
|
|
1514
|
-
* 批量发送缓存的消息
|
|
1515
|
-
*/
|
|
1516
|
-
}, {
|
|
1517
|
-
key: "flushCachedMessages",
|
|
1518
|
-
value: function flushCachedMessages() {
|
|
1519
|
-
var _this10 = this;
|
|
1520
|
-
if (this.cachedSend.length > 0) {
|
|
1521
|
-
this.cachedSend.forEach(function (_ref8) {
|
|
1522
|
-
var type = _ref8.type,
|
|
1523
|
-
payload = _ref8.payload;
|
|
1524
|
-
_this10.bridge.send(type, payload);
|
|
1525
|
-
});
|
|
1526
|
-
this.cachedSend = [];
|
|
1527
|
-
}
|
|
1528
|
-
}
|
|
1529
|
-
|
|
1530
|
-
/**
|
|
1531
|
-
* 处理 webapp 请求打开 modal 弹窗
|
|
1532
|
-
*
|
|
1533
|
-
* 流程(参照 BaseFactory 桥接流程):
|
|
1534
|
-
* 1. 调用 openModal 工具函数创建 modal DOM(overlay + modal + iframe + 动画 + close icon + loading)
|
|
1535
|
-
* 2. 为 modal 创建独立的 HostBridge 用于通信
|
|
1536
|
-
* 3. iframe 加载后 setTarget 到 modal iframe 的 contentWindow
|
|
1537
|
-
* 4. 监听 modal 的 READY_HANDSHAKE → 发送配置消息
|
|
1538
|
-
* 5. 如果 payload 有 appearance,通过 TRANSFER_MODAL_APPEARANCE 消息发送
|
|
1539
|
-
* 6. 如果 payload 有 closeConfirm,创建 MessageChannel port 用于确认关闭
|
|
1540
|
-
*/
|
|
1541
|
-
}, {
|
|
1542
|
-
key: "handleOpenModal",
|
|
1543
|
-
value: function handleOpenModal(payload) {
|
|
1544
|
-
var _payload$appearance,
|
|
1545
|
-
_themeColorMap$appear,
|
|
1546
|
-
_payload$appearance2,
|
|
1547
|
-
_this11 = this;
|
|
1548
|
-
// 清理已存在的 modal
|
|
1549
|
-
this.handleCloseModal();
|
|
1550
|
-
var mode = device.isMobile ? 'mobile' : 'desktop';
|
|
1551
|
-
trackElement('open_modal', {
|
|
1552
|
-
d1: mode,
|
|
1553
|
-
d2: (payload === null || payload === void 0 ? void 0 : payload.modalId) || ''
|
|
1554
|
-
});
|
|
1555
|
-
|
|
1556
|
-
// 为 modal 创建独立的 HostBridge 用于通信(scope 使用 payload 的 scope 或 'modal')
|
|
1557
|
-
var modalBridge = this.modalBridge = HostSDKBridge.getGlobalBridge('HOST');
|
|
1558
|
-
|
|
1559
|
-
// MessageChannel
|
|
1560
|
-
var messageChannel = new MessageChannel();
|
|
1561
|
-
this.bridge.send(MessageType.TRANSFER_APP_PORT, payload.modalId, [messageChannel.port1]);
|
|
1562
|
-
try {
|
|
1563
|
-
var url = new URL(payload.url);
|
|
1564
|
-
if (payload.closeConfirm) {
|
|
1565
|
-
url.searchParams.append('confirm', 'true');
|
|
1566
|
-
}
|
|
1567
|
-
payload.url = url.toString();
|
|
1568
|
-
} catch (e) {
|
|
1569
|
-
var error = new OpenSDKError('Invalid URL', 'INVALID_MODAL_URL', 'APP_RUNTIME');
|
|
1570
|
-
trackError('open_modal_invalid_url', {
|
|
1571
|
-
d1: 'INVALID_MODAL_URL',
|
|
1572
|
-
d2: (payload === null || payload === void 0 ? void 0 : payload.url) || ''
|
|
1573
|
-
});
|
|
1574
|
-
this.bridge.send(MessageType.OPEN_MODAL_ERROR, error);
|
|
1575
|
-
return;
|
|
1576
|
-
}
|
|
1577
|
-
|
|
1578
|
-
// 从 appearance 提取主题信息,组装 loadingConfig(对齐 antom.ts openModal 的处理逻辑)
|
|
1579
|
-
var appearanceTheme = (payload === null || payload === void 0 || (_payload$appearance = payload.appearance) === null || _payload$appearance === void 0 ? void 0 : _payload$appearance.theme) || 'default';
|
|
1580
|
-
var themeConfig = (_themeColorMap$appear = themeColorMap[appearanceTheme]) !== null && _themeColorMap$appear !== void 0 ? _themeColorMap$appear : themeColorMap.default;
|
|
1581
|
-
var loadingConfig = {
|
|
1582
|
-
theme: themeConfig.theme,
|
|
1583
|
-
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
|
|
1584
|
-
};
|
|
1585
|
-
|
|
1586
|
-
// 调用 openModal 工具函数创建 DOM(overlay + modal + iframe + 动画 + close icon + loading)
|
|
1587
|
-
var _openModal = openModal(_objectSpread(_objectSpread({}, payload), {}, {
|
|
1588
|
-
mode: mode,
|
|
1589
|
-
loadingConfig: loadingConfig,
|
|
1590
|
-
onClose: payload.closeConfirm ? function () {
|
|
1591
|
-
return new Promise(function (resolve) {
|
|
1592
|
-
// closeConfirm 时等待确认关闭(由 CLOSE_MODAL 消息触发 resolve)
|
|
1593
|
-
_this11._closeConfirmResolve = resolve;
|
|
1594
|
-
});
|
|
1595
|
-
} : undefined
|
|
1596
|
-
})),
|
|
1597
|
-
iframe = _openModal.iframe,
|
|
1598
|
-
destroy = _openModal.destroy;
|
|
1599
|
-
var handler = function handler() {
|
|
1600
|
-
iframe.removeEventListener('load', handler);
|
|
1601
|
-
trackElement('modal_loaded', {
|
|
1602
|
-
d1: payload.url
|
|
1603
|
-
});
|
|
1604
|
-
// 确保 target 已设置(如果 load 事件尚未触发,在此设置)
|
|
1605
|
-
if (iframe.contentWindow) {
|
|
1606
|
-
modalBridge.setTarget(iframe.contentWindow);
|
|
1607
|
-
try {
|
|
1608
|
-
var iframeOrigin = new URL(iframe.src).origin;
|
|
1609
|
-
if (iframeOrigin && iframeOrigin !== 'null') {
|
|
1610
|
-
modalBridge.setOrigin(iframeOrigin);
|
|
1611
|
-
}
|
|
1612
|
-
} catch (_unused5) {
|
|
1613
|
-
// URL 解析失败时保持默认 origin
|
|
1614
|
-
}
|
|
1615
|
-
// 如果 payload 有 appearance,通过 TRANSFER_MODAL_APPEARANCE 消息发送给 modal
|
|
1616
|
-
if (payload.appearance) {
|
|
1617
|
-
modalBridge.send(MessageType.TRANSFER_MODAL_APPEARANCE, payload.appearance);
|
|
1618
|
-
}
|
|
1619
|
-
if (payload.initialData) {
|
|
1620
|
-
modalBridge.send(MessageType.TRANSFER_MODAL_INITIALDATA, payload.initialData);
|
|
1621
|
-
}
|
|
1622
|
-
|
|
1623
|
-
// 发送 port2 给 modal
|
|
1624
|
-
modalBridge.send(MessageType.TRANSFER_MODAL_PORT, payload.modalId, [messageChannel.port2]);
|
|
1625
|
-
}
|
|
1626
|
-
};
|
|
1627
|
-
this.modalDestroy = function () {
|
|
1628
|
-
destroy();
|
|
1629
|
-
iframe.removeEventListener('load', handler);
|
|
1630
|
-
};
|
|
1631
|
-
|
|
1632
|
-
// 监听 modal 的 iframe load 事件
|
|
1633
|
-
iframe.addEventListener('load', handler);
|
|
1634
|
-
}
|
|
1635
|
-
|
|
1636
|
-
/**
|
|
1637
|
-
* 销毁 modal bridge、调用 openModal 返回的 destroy 方法清理 modal DOM
|
|
1638
|
-
*/
|
|
1639
|
-
}, {
|
|
1640
|
-
key: "handleCloseModal",
|
|
1641
|
-
value: function handleCloseModal() {
|
|
1642
|
-
// 如果有等待中的 closeConfirm,resolve 它
|
|
1643
|
-
if (this._closeConfirmResolve) {
|
|
1644
|
-
trackElement('modal_close_confirm', {
|
|
1645
|
-
d1: 'confirm_resolved'
|
|
1646
|
-
});
|
|
1647
|
-
this._closeConfirmResolve();
|
|
1648
|
-
this._closeConfirmResolve = null;
|
|
1649
|
-
}
|
|
1650
|
-
trackElement('modal_closed', {
|
|
1651
|
-
d1: this.modalBridge ? 'with_bridge' : 'no_bridge'
|
|
1652
|
-
});
|
|
1653
|
-
if (this.modalBridge) {
|
|
1654
|
-
this.modalBridge.destroy();
|
|
1655
|
-
this.modalBridge = null;
|
|
1656
|
-
}
|
|
1657
|
-
if (this.modalDestroy) {
|
|
1658
|
-
this.modalDestroy();
|
|
1659
|
-
this.modalDestroy = null;
|
|
1660
|
-
}
|
|
1661
|
-
}
|
|
1662
|
-
}, {
|
|
1663
|
-
key: "buildIframeUrl",
|
|
1664
|
-
value: function buildIframeUrl() {
|
|
1665
|
-
var baseUrl = buildPageUrl('/element_payment/index.html', true);
|
|
1666
|
-
// 拼 track_id 到 iframe URL,与新版 BaseElement 行为对齐,
|
|
1667
|
-
// 供 iframe 内 elements2 从 URL 取 trackId(埋点串联)
|
|
1668
|
-
var trackId = this.options.sessionData ? parseTrackerId(this.options.sessionData) : '';
|
|
1669
|
-
return "".concat(baseUrl, "?").concat(trackId ? "track_id=".concat(encodeURIComponent(trackId), "&") : '', "_scope_id=").concat(encodeURIComponent(this.scopeId));
|
|
1670
|
-
}
|
|
1671
|
-
}]);
|
|
1672
|
-
return ModernElementController;
|
|
1673
|
-
}();
|