@alipay/ams-checkout 0.0.1781167787-dev.0 → 0.0.1782095417-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ams-checkout.js +3 -3
- package/dist/ams-checkout.min.js +1 -1
- package/esm/constant/index.d.ts +3 -0
- package/esm/constant/index.js +4 -0
- package/esm/core/component/element/elementController/index.d.ts +2 -0
- package/esm/core/component/element/elementController/index.js +164 -25
- 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 +15 -0
- package/esm/core/component/element/elementProcessor/paymentProcessor.js +244 -53
- package/esm/core/component/element/mock.js +1 -1
- package/esm/core/component/element/type.d.ts +78 -1
- package/esm/core/component/element/util.d.ts +9 -2
- package/esm/core/component/element/util.js +3 -2
- package/esm/modern/index.js +1 -1
- package/esm/plugin/component/channel.d.ts +13 -2
- package/esm/plugin/component/channel.js +133 -30
- package/esm/tsdoc-metadata.json +1 -1
- package/esm/types/index.d.ts +4 -7
- package/esm/util/beforeConfirm.d.ts +12 -0
- package/esm/util/beforeConfirm.js +68 -0
- package/esm/util/spm-map.d.ts +6 -0
- package/esm/util/spm-map.js +7 -1
- package/package.json +1 -1
|
@@ -27,12 +27,15 @@ import { ELEMENT_PAGE_URL } from "../../../../constant/element";
|
|
|
27
27
|
import { EVENT } from "../../../../constant";
|
|
28
28
|
import { ServiceProvider } from "../../../../foundation/service";
|
|
29
29
|
import { ApplePaySdk, handleGooglePay, isSkipRenderPaymentMethod } from "../../../../plugin/component/channel";
|
|
30
|
+
import { DisplayTypeEnum } from "../../../../types";
|
|
30
31
|
import { queryParse } from "../../../../util";
|
|
31
32
|
import { LogConfig, Logger } from "../../../../util/logger";
|
|
32
33
|
import { parseSessionData } from "../../index";
|
|
33
34
|
import { oneAccount, sdkAction } from "../mock";
|
|
34
|
-
import {
|
|
35
|
+
import { convertPaymentMethods } from "../elementProcessor/convertPaymentMethods";
|
|
36
|
+
import { generateIframeSrc as _generateIframeSrc, isElementPad, isElementPC, safeParse, safeStringify } from "../util";
|
|
35
37
|
import BaseElementProcessor from "./baseElementProcessor";
|
|
38
|
+
import { executeWithTimeout, BEFORE_CONFIRM_TIMEOUT_MS } from "../../../../util/beforeConfirm";
|
|
36
39
|
var logger = new Logger(LogConfig, true);
|
|
37
40
|
var isExpressCheckout = function isExpressCheckout(extendInfo) {
|
|
38
41
|
try {
|
|
@@ -56,16 +59,72 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
56
59
|
// parameterInitAndCheck(): void {}
|
|
57
60
|
// apple pay
|
|
58
61
|
_defineProperty(_assertThisInitialized(_this), "ApplePayService", void 0);
|
|
62
|
+
/**
|
|
63
|
+
* Merchant's onBeforeConfirm callback reference, used in Apple Pay scenario only.
|
|
64
|
+
* Set by elementController.submitPayment before payment,
|
|
65
|
+
* triggered via beforeConfirm event after Apple Pay authorization in iframe.
|
|
66
|
+
*/
|
|
67
|
+
_defineProperty(_assertThisInitialized(_this), "_onBeforeConfirm", null);
|
|
68
|
+
_defineProperty(_assertThisInitialized(_this), "_merchantAmount", null);
|
|
69
|
+
_defineProperty(_assertThisInitialized(_this), "_merchantCurrency", null);
|
|
59
70
|
return _this;
|
|
60
71
|
}
|
|
61
72
|
_createClass(PaymentProcessor, [{
|
|
73
|
+
key: "setOnBeforeConfirm",
|
|
74
|
+
value: function setOnBeforeConfirm(callback) {
|
|
75
|
+
this._onBeforeConfirm = callback;
|
|
76
|
+
// 展码链路:同步设置 onBeforeConfirm 到 ApplePaySdk,确保 Chrome 展码支付时能调用商户回调
|
|
77
|
+
if (this.ApplePayService) {
|
|
78
|
+
this.ApplePayService.setOnBeforeConfirm(callback);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}, {
|
|
82
|
+
key: "setMerchantAmountOverride",
|
|
83
|
+
value: function setMerchantAmountOverride(amount, currency) {
|
|
84
|
+
this._merchantAmount = amount;
|
|
85
|
+
this._merchantCurrency = currency;
|
|
86
|
+
}
|
|
87
|
+
}, {
|
|
62
88
|
key: "onReady",
|
|
63
89
|
value: function onReady(extraParam) {
|
|
64
|
-
var _this$elementContaine, _this$elementContaine2, _this$elementContaine3, _this$elementContaine4, _this$elementContaine5;
|
|
90
|
+
var _this$options, _paymentContext$displ, _this$elementContaine, _this$elementContaine2, _this$elementContaine3, _this$elementContaine4, _this$elementContaine5;
|
|
65
91
|
var paymentContext = this.elementContainer.getPaymentContext();
|
|
66
92
|
this.getLogger().logInfo({
|
|
67
93
|
title: 'sdk_event_renderComponent'
|
|
68
94
|
});
|
|
95
|
+
|
|
96
|
+
// preview mobile 模式下,单普通支付方式(无表单、非快捷支付)不发送 renderComponent,阻止自动提交
|
|
97
|
+
var previewMode = (_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.preview;
|
|
98
|
+
if (previewMode === 'mobile') {
|
|
99
|
+
var _extraParam$originAct, _extraParam$originAct2, _paymentMethods$, _paymentMethods$2;
|
|
100
|
+
var paymentMethods = (extraParam === null || extraParam === void 0 || (_extraParam$originAct = extraParam.originActionQueryResult) === null || _extraParam$originAct === void 0 ? void 0 : _extraParam$originAct.paymentMethods) || [];
|
|
101
|
+
var savedPaymentMethods = (extraParam === null || extraParam === void 0 || (_extraParam$originAct2 = extraParam.originActionQueryResult) === null || _extraParam$originAct2 === void 0 ? void 0 : _extraParam$originAct2.savedPaymentMethods) || [];
|
|
102
|
+
if (paymentMethods.length === 1 && savedPaymentMethods.length === 0 && !((_paymentMethods$ = paymentMethods[0]) !== null && _paymentMethods$ !== void 0 && (_paymentMethods$ = _paymentMethods$.paymentElements) !== null && _paymentMethods$ !== void 0 && _paymentMethods$.length) && !['APPLEPAY', 'GOOGLEPAY'].includes((_paymentMethods$2 = paymentMethods[0]) === null || _paymentMethods$2 === void 0 ? void 0 : _paymentMethods$2.paymentMethodType)) {
|
|
103
|
+
// 跳过 renderComponent,避免触发自动提交
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ===== Element 自助化运营:appearance 二选一处理(不做 deepMerge)=====
|
|
109
|
+
// 根据 theme 值二选一:
|
|
110
|
+
// - 内置 6 大主题(非 APR_ 前缀):完全使用 SDK mount 传入的 appearance
|
|
111
|
+
// - 自定义主题模版(APR_ 前缀 AppearanceID):完全使用后端 sdkAction.query 返回的 appearance,
|
|
112
|
+
// SDK mount 中传的 layout/variables/card 全部忽略
|
|
113
|
+
var mountAppearance = paymentContext === null || paymentContext === void 0 || (_paymentContext$displ = paymentContext.displayInfo) === null || _paymentContext$displ === void 0 ? void 0 : _paymentContext$displ.appearance;
|
|
114
|
+
var isAppearanceId = typeof (mountAppearance === null || mountAppearance === void 0 ? void 0 : mountAppearance.theme) === 'string' && mountAppearance.theme.startsWith('APR_');
|
|
115
|
+
var finalAppearance;
|
|
116
|
+
if (isAppearanceId) {
|
|
117
|
+
var _extraParam$originAct3, _safeParse;
|
|
118
|
+
// 分支 A:自定义主题模版(APR_xxxx)
|
|
119
|
+
// 完全使用后端返回的配置,忽略 SDK mount 中的 layout/variables/card
|
|
120
|
+
// elementSettings 可能是 JSON string,需统一解析为对象
|
|
121
|
+
var elementSettings = extraParam === null || extraParam === void 0 || (_extraParam$originAct3 = extraParam.originActionQueryResult) === null || _extraParam$originAct3 === void 0 || (_extraParam$originAct3 = _extraParam$originAct3.pageStyle) === null || _extraParam$originAct3 === void 0 ? void 0 : _extraParam$originAct3.elementSettings;
|
|
122
|
+
finalAppearance = typeof elementSettings === 'string' ? (_safeParse = safeParse(elementSettings)) === null || _safeParse === void 0 ? void 0 : _safeParse.appearance : elementSettings === null || elementSettings === void 0 ? void 0 : elementSettings.appearance;
|
|
123
|
+
} else {
|
|
124
|
+
// 分支 B:内置 6 大主题或未指定主题
|
|
125
|
+
// 完全使用 SDK mount 传入的配置;
|
|
126
|
+
finalAppearance = mountAppearance;
|
|
127
|
+
}
|
|
69
128
|
this.eventCenter.dispatchToApp({
|
|
70
129
|
event: 'renderComponent',
|
|
71
130
|
data: {
|
|
@@ -84,7 +143,7 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
84
143
|
merchantId: (_this$elementContaine4 = this.elementContainer) === null || _this$elementContaine4 === void 0 || (_this$elementContaine4 = _this$elementContaine4.getPaymentContext()) === null || _this$elementContaine4 === void 0 || (_this$elementContaine4 = _this$elementContaine4.paymentSessionObj) === null || _this$elementContaine4 === void 0 ? void 0 : _this$elementContaine4.clientId,
|
|
85
144
|
paymentMethodType: (_this$elementContaine5 = this.elementContainer) === null || _this$elementContaine5 === void 0 || (_this$elementContaine5 = _this$elementContaine5.getPaymentContext()) === null || _this$elementContaine5 === void 0 || (_this$elementContaine5 = _this$elementContaine5.paymentSessionObj) === null || _this$elementContaine5 === void 0 || (_this$elementContaine5 = _this$elementContaine5.paymentMethodInfoView) === null || _this$elementContaine5 === void 0 ? void 0 : _this$elementContaine5.paymentMethodType
|
|
86
145
|
},
|
|
87
|
-
appearance:
|
|
146
|
+
appearance: finalAppearance,
|
|
88
147
|
sessionResult: paymentContext === null || paymentContext === void 0 ? void 0 : paymentContext.paymentSessionObj,
|
|
89
148
|
notRedirectAfterComplete: (extraParam === null || extraParam === void 0 ? void 0 : extraParam.notRedirectAfterComplete) === true,
|
|
90
149
|
merchantAppointParam: extraParam === null || extraParam === void 0 ? void 0 : extraParam.merchantAppointParam,
|
|
@@ -143,8 +202,12 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
143
202
|
parseData: paymentSessionObj,
|
|
144
203
|
logger: logger,
|
|
145
204
|
env: _this2.options.env.environment,
|
|
146
|
-
shipping: shipping
|
|
205
|
+
shipping: shipping,
|
|
206
|
+
merchantAmount: _this2._merchantAmount,
|
|
207
|
+
merchantCurrency: _this2._merchantCurrency
|
|
147
208
|
});
|
|
209
|
+
// Chrome 展码链路:同步 onBeforeConfirm 到当前 ApplePaySdk 实例
|
|
210
|
+
applePayService.setOnBeforeConfirm(_this2._onBeforeConfirm);
|
|
148
211
|
applePayService.startPay().then(function (res) {
|
|
149
212
|
_this2.eventCenter.dispatchToApp({
|
|
150
213
|
event: 'getApplePayToken',
|
|
@@ -163,19 +226,107 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
163
226
|
});
|
|
164
227
|
});
|
|
165
228
|
});
|
|
229
|
+
// Apple Pay event bridge: after user authorization (FaceID/TouchID) in iframe, before actual charge,
|
|
230
|
+
// requests SDK layer to execute merchant's onBeforeConfirm callback via beforeConfirm event,
|
|
231
|
+
// and returns the result (continue/abort) to iframe via dispatchToApp.
|
|
232
|
+
this.eventCenter.listen(EVENT.beforeConfirm.name, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
233
|
+
var paymentMethodType, startTime, _yield$executeWithTim, rawResult, timedOut, shouldContinue;
|
|
234
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
235
|
+
while (1) switch (_context.prev = _context.next) {
|
|
236
|
+
case 0:
|
|
237
|
+
paymentMethodType = 'APPLEPAY';
|
|
238
|
+
if (_this2._onBeforeConfirm) {
|
|
239
|
+
_context.next = 5;
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
logger.logInfo({
|
|
243
|
+
title: 'sdk_before_confirm_skip'
|
|
244
|
+
}, {
|
|
245
|
+
paymentMethodType: paymentMethodType,
|
|
246
|
+
path: 'applePay_eventBridge'
|
|
247
|
+
});
|
|
248
|
+
_this2.eventCenter.dispatchToApp({
|
|
249
|
+
event: EVENT.beforeConfirm.name,
|
|
250
|
+
data: {
|
|
251
|
+
success: true,
|
|
252
|
+
result: true
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
return _context.abrupt("return");
|
|
256
|
+
case 5:
|
|
257
|
+
logger.logInfo({
|
|
258
|
+
title: 'sdk_before_confirm_start'
|
|
259
|
+
}, {
|
|
260
|
+
paymentMethodType: paymentMethodType,
|
|
261
|
+
path: 'applePay_eventBridge'
|
|
262
|
+
});
|
|
263
|
+
_context.prev = 6;
|
|
264
|
+
startTime = Date.now();
|
|
265
|
+
_context.next = 10;
|
|
266
|
+
return executeWithTimeout(function () {
|
|
267
|
+
return _this2._onBeforeConfirm();
|
|
268
|
+
});
|
|
269
|
+
case 10:
|
|
270
|
+
_yield$executeWithTim = _context.sent;
|
|
271
|
+
rawResult = _yield$executeWithTim.result;
|
|
272
|
+
timedOut = _yield$executeWithTim.timedOut;
|
|
273
|
+
shouldContinue = rawResult; // 双重校验:timedOut(Promise race) + startTime(实际时间差),防止竞态误判
|
|
274
|
+
if (timedOut || Date.now() - startTime >= BEFORE_CONFIRM_TIMEOUT_MS) {
|
|
275
|
+
logger.logError({
|
|
276
|
+
title: 'sdk_before_confirm_timeout'
|
|
277
|
+
});
|
|
278
|
+
shouldContinue = false;
|
|
279
|
+
}
|
|
280
|
+
logger.logInfo({
|
|
281
|
+
title: 'sdk_element_beforeConfirm_callback_result'
|
|
282
|
+
}, {
|
|
283
|
+
shouldContinue: shouldContinue
|
|
284
|
+
});
|
|
285
|
+
_this2.eventCenter.dispatchToApp({
|
|
286
|
+
event: EVENT.beforeConfirm.name,
|
|
287
|
+
data: {
|
|
288
|
+
success: true,
|
|
289
|
+
result: !!shouldContinue
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
_context.next = 23;
|
|
293
|
+
break;
|
|
294
|
+
case 19:
|
|
295
|
+
_context.prev = 19;
|
|
296
|
+
_context.t0 = _context["catch"](6);
|
|
297
|
+
logger.logError({
|
|
298
|
+
title: 'sdk_before_confirm_error'
|
|
299
|
+
}, {
|
|
300
|
+
paymentMethodType: paymentMethodType,
|
|
301
|
+
errorMessage: String((_context.t0 === null || _context.t0 === void 0 ? void 0 : _context.t0.message) || _context.t0).slice(0, 200),
|
|
302
|
+
path: 'applePay_eventBridge'
|
|
303
|
+
});
|
|
304
|
+
_this2.eventCenter.dispatchToApp({
|
|
305
|
+
event: EVENT.beforeConfirm.name,
|
|
306
|
+
data: {
|
|
307
|
+
success: false,
|
|
308
|
+
result: false
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
case 23:
|
|
312
|
+
case "end":
|
|
313
|
+
return _context.stop();
|
|
314
|
+
}
|
|
315
|
+
}, _callee, null, [[6, 19]]);
|
|
316
|
+
})));
|
|
166
317
|
}
|
|
167
318
|
}, {
|
|
168
319
|
key: "initApplePaySdk",
|
|
169
320
|
value: function () {
|
|
170
|
-
var _initApplePaySdk = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function
|
|
321
|
+
var _initApplePaySdk = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
171
322
|
var _this$elementContaine6;
|
|
172
|
-
var
|
|
173
|
-
return _regeneratorRuntime().wrap(function
|
|
174
|
-
while (1) switch (
|
|
323
|
+
var _ref2, paymentSessionObj, paymentSession;
|
|
324
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
325
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
175
326
|
case 0:
|
|
176
|
-
|
|
327
|
+
_ref2 = ((_this$elementContaine6 = this.elementContainer) === null || _this$elementContaine6 === void 0 ? void 0 : _this$elementContaine6.getPaymentContext()) || {}, paymentSessionObj = _ref2.paymentSessionObj, paymentSession = _ref2.paymentSession;
|
|
177
328
|
if (!isSkipRenderPaymentMethod(paymentSessionObj)) {
|
|
178
|
-
|
|
329
|
+
_context2.next = 13;
|
|
179
330
|
break;
|
|
180
331
|
}
|
|
181
332
|
this.ApplePayService = new ApplePaySdk({
|
|
@@ -184,29 +335,29 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
184
335
|
logger: logger,
|
|
185
336
|
env: this.options.env.environment
|
|
186
337
|
});
|
|
187
|
-
|
|
338
|
+
_context2.prev = 3;
|
|
188
339
|
logger.logInfo({
|
|
189
340
|
title: 'a3753.b107385.c398110'
|
|
190
341
|
});
|
|
191
|
-
|
|
342
|
+
_context2.next = 7;
|
|
192
343
|
return this.ApplePayService.initApplePaySession();
|
|
193
344
|
case 7:
|
|
194
345
|
logger.logInfo({
|
|
195
346
|
title: 'a3753.b107385.c398112'
|
|
196
347
|
});
|
|
197
|
-
|
|
348
|
+
_context2.next = 13;
|
|
198
349
|
break;
|
|
199
350
|
case 10:
|
|
200
|
-
|
|
201
|
-
|
|
351
|
+
_context2.prev = 10;
|
|
352
|
+
_context2.t0 = _context2["catch"](3);
|
|
202
353
|
logger.logError({
|
|
203
354
|
title: 'a3753.b107385.c398111'
|
|
204
355
|
});
|
|
205
356
|
case 13:
|
|
206
357
|
case "end":
|
|
207
|
-
return
|
|
358
|
+
return _context2.stop();
|
|
208
359
|
}
|
|
209
|
-
},
|
|
360
|
+
}, _callee2, this, [[3, 10]]);
|
|
210
361
|
}));
|
|
211
362
|
function initApplePaySdk() {
|
|
212
363
|
return _initApplePaySdk.apply(this, arguments);
|
|
@@ -227,20 +378,24 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
227
378
|
}
|
|
228
379
|
}, {
|
|
229
380
|
key: "generateIframeSrc",
|
|
230
|
-
value: function generateIframeSrc(
|
|
231
|
-
var
|
|
232
|
-
|
|
381
|
+
value: function generateIframeSrc(_ref3) {
|
|
382
|
+
var _this$options3;
|
|
383
|
+
var link = _ref3.link,
|
|
384
|
+
instanceId = _ref3.instanceId;
|
|
233
385
|
this.instanceId = instanceId;
|
|
234
|
-
var
|
|
235
|
-
paymentSession =
|
|
236
|
-
paymentSessionObj =
|
|
237
|
-
sdkMetaData =
|
|
238
|
-
var _this$
|
|
239
|
-
environment = _this$
|
|
240
|
-
analytics = _this$
|
|
241
|
-
locale = _this$
|
|
242
|
-
var
|
|
243
|
-
extendInfo =
|
|
386
|
+
var _ref4 = this.elementContainer.getPaymentContext() || {},
|
|
387
|
+
paymentSession = _ref4.paymentSession,
|
|
388
|
+
paymentSessionObj = _ref4.paymentSessionObj,
|
|
389
|
+
sdkMetaData = _ref4.sdkMetaData;
|
|
390
|
+
var _this$options2 = this.options,
|
|
391
|
+
environment = _this$options2.env.environment,
|
|
392
|
+
analytics = _this$options2.analytics,
|
|
393
|
+
locale = _this$options2.locale;
|
|
394
|
+
var _ref5 = paymentSessionObj || {},
|
|
395
|
+
extendInfo = _ref5.extendInfo;
|
|
396
|
+
// 预览模式下,若为 'mobile' 需要让 iframe 以 popup(MobileElement)形态渲染
|
|
397
|
+
var previewMode = (_this$options3 = this.options) === null || _this$options3 === void 0 ? void 0 : _this$options3.preview;
|
|
398
|
+
var renderDisplayType = previewMode === 'mobile' ? DisplayTypeEnum.popup : DisplayTypeEnum.inline;
|
|
244
399
|
var url = _generateIframeSrc({
|
|
245
400
|
paymentSession: paymentSession,
|
|
246
401
|
paymentSessionObj: paymentSessionObj,
|
|
@@ -250,7 +405,8 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
250
405
|
link: link,
|
|
251
406
|
appVersion: sdkMetaData === null || sdkMetaData === void 0 ? void 0 : sdkMetaData.webAppVersion,
|
|
252
407
|
pageUrl: isExpressCheckout(extendInfo) ? ELEMENT_PAGE_URL.EXPRESS_CHECKOUT : ELEMENT_PAGE_URL.ELEMENT_PAYMENT,
|
|
253
|
-
instanceId: instanceId
|
|
408
|
+
instanceId: instanceId,
|
|
409
|
+
renderDisplayType: renderDisplayType
|
|
254
410
|
});
|
|
255
411
|
this.setElementUrl(url);
|
|
256
412
|
return url;
|
|
@@ -258,22 +414,26 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
258
414
|
}, {
|
|
259
415
|
key: "obtainData",
|
|
260
416
|
value: function () {
|
|
261
|
-
var _obtainData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function
|
|
417
|
+
var _obtainData = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
|
|
262
418
|
var _paymentSessionObj$co,
|
|
419
|
+
_this$options5,
|
|
263
420
|
_this3 = this;
|
|
264
|
-
var requestService, _this$elementContaine7, paymentSession, paymentSessionObj, displayInfo, _displayInfo, debugProps, _this$
|
|
265
|
-
return _regeneratorRuntime().wrap(function
|
|
266
|
-
while (1) switch (
|
|
421
|
+
var requestService, _this$elementContaine7, paymentSession, paymentSessionObj, displayInfo, _displayInfo, debugProps, _this$options4, environment, locale, _ref6, paymentSessionConfig, hostSign, isConnect, LOCAL_MOCK, previewMode, IS_PREVIEW, SHOULD_USE_MOCK, _queryParse, appType, terminalType, generateActionQueryPromise, generateOneAccountQueryPromise, _yield$Promise$all, _yield$Promise$all2, originActionQueryResult, originOneAccountQueryResult;
|
|
422
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
423
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
267
424
|
case 0:
|
|
268
425
|
requestService = ServiceProvider.getInstance(this.instanceId).getService('Requester');
|
|
269
426
|
_this$elementContaine7 = this.elementContainer.getPaymentContext(), paymentSession = _this$elementContaine7.paymentSession, paymentSessionObj = _this$elementContaine7.paymentSessionObj, displayInfo = _this$elementContaine7.displayInfo;
|
|
270
427
|
_displayInfo = displayInfo;
|
|
271
428
|
debugProps = _displayInfo.debugProps;
|
|
272
|
-
_this$
|
|
273
|
-
|
|
429
|
+
_this$options4 = this.options, environment = _this$options4.env.environment, locale = _this$options4.locale;
|
|
430
|
+
_ref6 = paymentSessionObj || {}, paymentSessionConfig = _ref6.paymentSessionConfig;
|
|
274
431
|
hostSign = paymentSession.split('&&')[1] || '';
|
|
275
432
|
isConnect = paymentSessionObj === null || paymentSessionObj === void 0 || (_paymentSessionObj$co = paymentSessionObj.connectFactor) === null || _paymentSessionObj$co === void 0 ? void 0 : _paymentSessionObj$co.enableConnect;
|
|
276
|
-
LOCAL_MOCK = (debugProps === null || debugProps === void 0 ? void 0 : debugProps.isDebug) && (debugProps === null || debugProps === void 0 ? void 0 : debugProps.local_mock);
|
|
433
|
+
LOCAL_MOCK = (debugProps === null || debugProps === void 0 ? void 0 : debugProps.isDebug) && (debugProps === null || debugProps === void 0 ? void 0 : debugProps.local_mock); // 兼容三种预览开关取值:true / 'web' / 'mobile'
|
|
434
|
+
previewMode = (_this$options5 = this.options) === null || _this$options5 === void 0 ? void 0 : _this$options5.preview;
|
|
435
|
+
IS_PREVIEW = previewMode === true || previewMode === 'web' || previewMode === 'mobile';
|
|
436
|
+
SHOULD_USE_MOCK = LOCAL_MOCK || IS_PREVIEW;
|
|
277
437
|
_queryParse = queryParse(this.getElementUrl()), appType = _queryParse.appType;
|
|
278
438
|
terminalType = isElementPad() ? 'WEB' : appType ? 'APP' : isElementPC() ? 'WEB' : 'WAP';
|
|
279
439
|
/**
|
|
@@ -285,10 +445,14 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
285
445
|
generateActionQueryPromise = function generateActionQueryPromise() {
|
|
286
446
|
return new Promise(function (resolve, reject) {
|
|
287
447
|
var _displayInfo$merchant;
|
|
288
|
-
|
|
289
|
-
if (LOCAL_MOCK) {
|
|
448
|
+
if (SHOULD_USE_MOCK) {
|
|
290
449
|
setTimeout(function () {
|
|
291
|
-
|
|
450
|
+
if (IS_PREVIEW) {
|
|
451
|
+
var mockData = _this3.buildPreviewMockData(sdkAction);
|
|
452
|
+
resolve(mockData);
|
|
453
|
+
} else {
|
|
454
|
+
resolve(sdkAction);
|
|
455
|
+
}
|
|
292
456
|
}, 100);
|
|
293
457
|
return;
|
|
294
458
|
}
|
|
@@ -306,6 +470,12 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
306
470
|
}
|
|
307
471
|
};
|
|
308
472
|
|
|
473
|
+
// 自定义主题模版(APR_ 前缀 AppearanceID):额外传递 appearanceId
|
|
474
|
+
var mountAppearance = displayInfo === null || displayInfo === void 0 ? void 0 : displayInfo.appearance;
|
|
475
|
+
var isAppearanceId = typeof (mountAppearance === null || mountAppearance === void 0 ? void 0 : mountAppearance.theme) === 'string' && mountAppearance.theme.startsWith('APR_');
|
|
476
|
+
if (isAppearanceId) {
|
|
477
|
+
sdkRequestData.appearanceId = mountAppearance.theme;
|
|
478
|
+
}
|
|
309
479
|
// 可选参数:商户指定的储值卡信息
|
|
310
480
|
if (displayInfo !== null && displayInfo !== void 0 && (_displayInfo$merchant = displayInfo.merchantAppointParam) !== null && _displayInfo$merchant !== void 0 && _displayInfo$merchant.storedCard) {
|
|
311
481
|
sdkRequestData.merchantAppointParam = displayInfo.merchantAppointParam;
|
|
@@ -370,8 +540,7 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
370
540
|
*/
|
|
371
541
|
generateOneAccountQueryPromise = function generateOneAccountQueryPromise() {
|
|
372
542
|
return new Promise(function (resolve, reject) {
|
|
373
|
-
|
|
374
|
-
if (LOCAL_MOCK) {
|
|
543
|
+
if (SHOULD_USE_MOCK) {
|
|
375
544
|
setTimeout(function () {
|
|
376
545
|
resolve(oneAccount);
|
|
377
546
|
}, 100);
|
|
@@ -407,10 +576,10 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
407
576
|
});
|
|
408
577
|
});
|
|
409
578
|
};
|
|
410
|
-
|
|
579
|
+
_context3.next = 18;
|
|
411
580
|
return Promise.all(isConnect ? [generateActionQueryPromise(), generateOneAccountQueryPromise()] : [generateActionQueryPromise()]);
|
|
412
|
-
case
|
|
413
|
-
_yield$Promise$all =
|
|
581
|
+
case 18:
|
|
582
|
+
_yield$Promise$all = _context3.sent;
|
|
414
583
|
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2);
|
|
415
584
|
originActionQueryResult = _yield$Promise$all2[0];
|
|
416
585
|
originOneAccountQueryResult = _yield$Promise$all2[1];
|
|
@@ -418,21 +587,43 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
418
587
|
originActionQueryResult: originActionQueryResult,
|
|
419
588
|
originOneAccountQueryResult: originOneAccountQueryResult
|
|
420
589
|
};
|
|
421
|
-
return
|
|
590
|
+
return _context3.abrupt("return", {
|
|
422
591
|
originActionQueryResult: originActionQueryResult,
|
|
423
592
|
originOneAccountQueryResult: originOneAccountQueryResult
|
|
424
593
|
});
|
|
425
|
-
case
|
|
594
|
+
case 24:
|
|
426
595
|
case "end":
|
|
427
|
-
return
|
|
596
|
+
return _context3.stop();
|
|
428
597
|
}
|
|
429
|
-
},
|
|
598
|
+
}, _callee3, this);
|
|
430
599
|
}));
|
|
431
600
|
function obtainData() {
|
|
432
601
|
return _obtainData.apply(this, arguments);
|
|
433
602
|
}
|
|
434
603
|
return obtainData;
|
|
435
604
|
}()
|
|
605
|
+
/**
|
|
606
|
+
* 构建预览模式的 mock 数据
|
|
607
|
+
* 合并 mock.ts 的硬编码数据和 mount 传入的 paymentMethods 配置
|
|
608
|
+
*/
|
|
609
|
+
}, {
|
|
610
|
+
key: "buildPreviewMockData",
|
|
611
|
+
value: function buildPreviewMockData(baseMock) {
|
|
612
|
+
var _this$elementContaine8 = this.elementContainer.getPaymentContext(),
|
|
613
|
+
displayInfo = _this$elementContaine8.displayInfo;
|
|
614
|
+
var mountOptions = displayInfo;
|
|
615
|
+
var paymentMethodsConfig = mountOptions === null || mountOptions === void 0 ? void 0 : mountOptions.previewPaymentMethods;
|
|
616
|
+
|
|
617
|
+
// 深拷贝 mock 数据,避免修改原始对象
|
|
618
|
+
var result = JSON.parse(JSON.stringify(baseMock));
|
|
619
|
+
|
|
620
|
+
// 转换 paymentMethods 配置为内部格式
|
|
621
|
+
var convertedMethods = convertPaymentMethods(paymentMethodsConfig);
|
|
622
|
+
|
|
623
|
+
// 替换 paymentMethods
|
|
624
|
+
result.paymentMethods = convertedMethods;
|
|
625
|
+
return result;
|
|
626
|
+
}
|
|
436
627
|
}, {
|
|
437
628
|
key: "getValue",
|
|
438
629
|
value: function getValue() {
|
|
@@ -441,9 +632,9 @@ var PaymentProcessor = /*#__PURE__*/function (_BaseElementProcessor) {
|
|
|
441
632
|
}
|
|
442
633
|
}, {
|
|
443
634
|
key: "update",
|
|
444
|
-
value: function update(
|
|
445
|
-
var data =
|
|
446
|
-
paymentSessionData =
|
|
635
|
+
value: function update(_ref7) {
|
|
636
|
+
var data = _ref7.data,
|
|
637
|
+
paymentSessionData = _ref7.paymentSessionData;
|
|
447
638
|
var _parseSessionData = parseSessionData(paymentSessionData),
|
|
448
639
|
_parseSessionData2 = _slicedToArray(_parseSessionData, 2),
|
|
449
640
|
parseData = _parseSessionData2[0],
|
|
@@ -153,7 +153,7 @@ export var sdkAction1 = {
|
|
|
153
153
|
}, {
|
|
154
154
|
antomPage: 'paymentMetaPage',
|
|
155
155
|
category: 'AC_WALLET',
|
|
156
|
-
expressCheckout:
|
|
156
|
+
expressCheckout: false,
|
|
157
157
|
icon: 'https://cdn.marmot-cloud.com/storage/2024/05/15/5b829130-42d9-46e7-a23d-6774f7352900.svg',
|
|
158
158
|
iconName: 'Alipay',
|
|
159
159
|
interActionType: 'REDIRECT',
|
|
@@ -149,7 +149,7 @@ type CompatibleVariables<T extends Record<string, string>> = {
|
|
|
149
149
|
export interface PaymentMountOptions extends BaseMountOptions {
|
|
150
150
|
type: ElementType.payment;
|
|
151
151
|
appearance?: {
|
|
152
|
-
theme?: ThemeType
|
|
152
|
+
theme?: ThemeType | `APR_${string}`;
|
|
153
153
|
layout?: {
|
|
154
154
|
type: PaymentElementLayout;
|
|
155
155
|
};
|
|
@@ -192,6 +192,54 @@ export interface PaymentMountOptions extends BaseMountOptions {
|
|
|
192
192
|
};
|
|
193
193
|
notRedirectAfterComplete?: boolean;
|
|
194
194
|
merchantAppointParam?: IMerchantAppointParam;
|
|
195
|
+
/**
|
|
196
|
+
* 支付方式配置
|
|
197
|
+
*
|
|
198
|
+
* 使用说明:
|
|
199
|
+
* - preview: true 时生效,用于配置预览展示的支付方式和外观
|
|
200
|
+
* - preview: false/undefined 时,此配置被忽略,支付方式来自后端 sdkAction.query 接口
|
|
201
|
+
*/
|
|
202
|
+
previewPaymentMethods?: {
|
|
203
|
+
/**
|
|
204
|
+
* 极速支付配置
|
|
205
|
+
*/
|
|
206
|
+
expressCheckout?: {
|
|
207
|
+
enabled: boolean;
|
|
208
|
+
methods?: {
|
|
209
|
+
/**
|
|
210
|
+
* 支付方式显示名称,如 "Apple Pay"
|
|
211
|
+
*/
|
|
212
|
+
paymentMethodName: string;
|
|
213
|
+
/**
|
|
214
|
+
* 支付方式类型,如 "APPLEPAY"
|
|
215
|
+
*/
|
|
216
|
+
paymentMethodType: string;
|
|
217
|
+
}[];
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* 支持的支付方式列表
|
|
221
|
+
* 数组顺序即为前端展示顺序
|
|
222
|
+
*/
|
|
223
|
+
supportedMethods?: {
|
|
224
|
+
/**
|
|
225
|
+
* 支付方式显示名称,如 "CARD", "AlipayHK"
|
|
226
|
+
*/
|
|
227
|
+
paymentMethodName: string;
|
|
228
|
+
/**
|
|
229
|
+
* 支付方式类型,如 "VISA", "ALIPAY_HK"
|
|
230
|
+
*/
|
|
231
|
+
paymentMethodType: string;
|
|
232
|
+
/**
|
|
233
|
+
* 支付方式图标 URL
|
|
234
|
+
*/
|
|
235
|
+
logoUrl?: string;
|
|
236
|
+
}[];
|
|
237
|
+
/**
|
|
238
|
+
* 推荐支付方式
|
|
239
|
+
* 值为 paymentMethodType,匹配的支付方式会被标记为 recommend
|
|
240
|
+
*/
|
|
241
|
+
topping?: string;
|
|
242
|
+
};
|
|
195
243
|
}
|
|
196
244
|
export declare enum AddressEventCallbackName {
|
|
197
245
|
SHIPPING_CHANGE = "SHIPPING_CHANGE"
|
|
@@ -287,6 +335,26 @@ export interface AddressSubmitData {
|
|
|
287
335
|
export interface SubmitFuncParams {
|
|
288
336
|
handleActions?: boolean;
|
|
289
337
|
shippingInfo?: ShippingInfo;
|
|
338
|
+
/**
|
|
339
|
+
* Amount displayed on the Apple Pay payment sheet, e.g. '10.99'.
|
|
340
|
+
* Display only; actual charge amount is controlled by server.
|
|
341
|
+
* Must be provided together with `currency`. Only effective for Apple Pay.
|
|
342
|
+
*/
|
|
343
|
+
amount?: string;
|
|
344
|
+
/**
|
|
345
|
+
* Currency code displayed on the Apple Pay payment sheet, e.g. 'USD'.
|
|
346
|
+
* Follows ISO 4217 standard. Must be provided together with `amount`. Only effective for Apple Pay.
|
|
347
|
+
*/
|
|
348
|
+
currency?: string;
|
|
349
|
+
/**
|
|
350
|
+
* Pre-confirmation callback. Executed after user authorization but before actual charge,
|
|
351
|
+
* allowing merchant to create order at this point.
|
|
352
|
+
* - Only effective when payment method is Apple Pay
|
|
353
|
+
* - Invoked via event bridge after user FaceID/TouchID authorization on the payment sheet
|
|
354
|
+
* - Return true: proceed with charge
|
|
355
|
+
* - Return false / timeout / throw error: abort payment, returns MERCHANT_CONFIRM_ABORT error code
|
|
356
|
+
*/
|
|
357
|
+
onBeforeConfirm?: () => Promise<boolean>;
|
|
290
358
|
}
|
|
291
359
|
export interface SubmitServiceParams extends PaymentSubmitData {
|
|
292
360
|
accountInfo: AuthSubmitData['accountInfo'];
|
|
@@ -421,6 +489,15 @@ export interface IElementOptions {
|
|
|
421
489
|
onStartLoading: () => void;
|
|
422
490
|
onEndLoading: () => void;
|
|
423
491
|
};
|
|
492
|
+
/**
|
|
493
|
+
* 预览模式开关
|
|
494
|
+
* - true / 'web': 跳过真实 API 请求,使用 mock 数据,按 WebElement(inline)方式渲染(向后兼容,等同于 'web')
|
|
495
|
+
* - 'mobile': 跳过真实 API 请求,使用 mock 数据,按 MobileElement(popup)方式渲染,用于 mobileElement 降级预览
|
|
496
|
+
* - false / undefined: 发起真实请求(默认行为)
|
|
497
|
+
*
|
|
498
|
+
* 使用场景:B 端配置后台预览,C 端生产环境不应使用
|
|
499
|
+
*/
|
|
500
|
+
preview?: boolean | 'web' | 'mobile';
|
|
424
501
|
}
|
|
425
502
|
export interface IElementProcessors {
|
|
426
503
|
[ElementType.auth]: AuthProcessor;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IElementStatus } from '../../../foundation';
|
|
2
|
-
import { CashierSdkActionQueryResult, Ianalytics, IPaymentSessionMetaData } from '../../../types';
|
|
2
|
+
import { CashierSdkActionQueryResult, DisplayTypeEnum, Ianalytics, IPaymentSessionMetaData } from '../../../types';
|
|
3
3
|
import { ContainerController } from './elementContainerService/containerService';
|
|
4
4
|
import { ELEMENT_ENVIRONMENT_TYPE, EventCallbackCode, IElementOptions, IToastOptions } from './type';
|
|
5
5
|
export declare const formatElementOption: (options: IElementOptions) => {
|
|
@@ -19,6 +19,7 @@ export declare const formatElementOption: (options: IElementOptions) => {
|
|
|
19
19
|
onStartLoading: () => void;
|
|
20
20
|
onEndLoading: () => void;
|
|
21
21
|
};
|
|
22
|
+
preview?: boolean | "mobile" | "web";
|
|
22
23
|
};
|
|
23
24
|
export declare const validateElementOption: (options: IElementOptions) => {
|
|
24
25
|
isValid: boolean;
|
|
@@ -48,7 +49,7 @@ export declare function checkCanUpdate({ status, paymentContainerService, newPay
|
|
|
48
49
|
newPaymentSessionData: string;
|
|
49
50
|
oldPaymentSessionData: string;
|
|
50
51
|
}): boolean;
|
|
51
|
-
export declare function generateIframeSrc({ paymentSessionObj, paymentSession, instanceId, environment, appVersion, analytics, locale, pageUrl, link, }: {
|
|
52
|
+
export declare function generateIframeSrc({ paymentSessionObj, paymentSession, instanceId, environment, appVersion, analytics, locale, pageUrl, link, renderDisplayType, }: {
|
|
52
53
|
paymentSessionObj: IPaymentSessionMetaData;
|
|
53
54
|
paymentSession: string;
|
|
54
55
|
environment: string;
|
|
@@ -58,6 +59,12 @@ export declare function generateIframeSrc({ paymentSessionObj, paymentSession, i
|
|
|
58
59
|
pageUrl: string;
|
|
59
60
|
appVersion: string;
|
|
60
61
|
link?: string;
|
|
62
|
+
/**
|
|
63
|
+
* iframe 中 checkout-v2 的渲染形态。
|
|
64
|
+
* - inline(默认): WebElement 渲染
|
|
65
|
+
* - popup: MobileElement 渲染(用于 mobileElement 降级预览)
|
|
66
|
+
*/
|
|
67
|
+
renderDisplayType?: DisplayTypeEnum;
|
|
61
68
|
}): string;
|
|
62
69
|
export declare function handleRedirect(data: any, fromFastSdk: boolean, eventCallback: ({ code, message }: {
|
|
63
70
|
code: any;
|
|
@@ -138,7 +138,8 @@ export function generateIframeSrc(_ref3) {
|
|
|
138
138
|
analytics = _ref3.analytics,
|
|
139
139
|
locale = _ref3.locale,
|
|
140
140
|
pageUrl = _ref3.pageUrl,
|
|
141
|
-
link = _ref3.link
|
|
141
|
+
link = _ref3.link,
|
|
142
|
+
renderDisplayType = _ref3.renderDisplayType;
|
|
142
143
|
var componentSign = getComponentSign(paymentSessionObj);
|
|
143
144
|
var productSceneVersion = (paymentSessionObj === null || paymentSessionObj === void 0 || (_paymentSessionObj$pa = paymentSessionObj.paymentSessionConfig) === null || _paymentSessionObj$pa === void 0 ? void 0 : _paymentSessionObj$pa.productSceneVersion) || '';
|
|
144
145
|
var productScene = (paymentSessionObj === null || paymentSessionObj === void 0 || (_paymentSessionObj$pa2 = paymentSessionObj.paymentSessionConfig) === null || _paymentSessionObj$pa2 === void 0 ? void 0 : _paymentSessionObj$pa2.productScene) || '';
|
|
@@ -151,7 +152,7 @@ export function generateIframeSrc(_ref3) {
|
|
|
151
152
|
link = "".concat(baseUrl[_env]).concat(pageUrl);
|
|
152
153
|
}
|
|
153
154
|
var _getIframeUrl = getIframeUrl({
|
|
154
|
-
renderDisplayType: DisplayTypeEnum.inline,
|
|
155
|
+
renderDisplayType: renderDisplayType !== null && renderDisplayType !== void 0 ? renderDisplayType : DisplayTypeEnum.inline,
|
|
155
156
|
componentSign: componentSign,
|
|
156
157
|
analytics: analytics,
|
|
157
158
|
productScene: productScene,
|
package/esm/modern/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import { createLoader } from '@antglobal/create-sdk-loader';
|
|
|
15
15
|
|
|
16
16
|
import { stageName } from "./stageName";
|
|
17
17
|
var SDKURL = {
|
|
18
|
-
DEV: "https://sdk-dev.marmot-cloud.com/package/ams-checkout/".concat("dev-
|
|
18
|
+
DEV: "https://sdk-dev.marmot-cloud.com/package/ams-checkout/".concat("dev-1782095417", "/ams-checkout.js"),
|
|
19
19
|
LOCAL: "http://localhost:3000/ams-checkout.min.js",
|
|
20
20
|
PROD: 'https://js.antom.com/v2/ams-checkout.js'
|
|
21
21
|
};
|