Wix Velo JS在创建电子商务验证服务插件时遇到的问题
在Wix Velo创建电子商务验证服务插件时遇到问题。自动生成的模板代码创建了这个:
import * as ecomValidations from 'interfaces-ecommerce-v1-validations-provider';
import { getSupabaseClient } from 'backend/supabase';
/**
* This method retrieves validation violations from your app.
*
* Wix calls this method when certain actions are performed on a visitor's cart and checkout...
* @param {import('interfaces-ecommerce-v1-validations-provider').GetValidationViolationsOptions} options
* @param {import('interfaces-ecommerce-v1-validations-provider').Context} context
* @returns {Promise<import('interfaces-ecommerce-v1-validations-provider').GetValidationViolationsResponse | import('interfaces-ecommerce-v1-validations-provider').BusinessError>}
*/
// export const getValidationViolations = async (options, context) => {};
/** @param {import('interfaces-ecommerce-v1-validations-provider').GetValidationViolationsRequest} options */
export async function getValidationViolations(options, context) {
const checkout = options.checkout;
const checkoutId = checkout._id;
主要错误已经在Wix代码中以警告的形式高亮显示:
Cannot find module 'interfaces-ecommerce-v1-validations-provider' or its corresponding type declaration.
我得到这个错误所做的一切,仅仅是按照Wix开发者界面来创建它,错误就内置在模板代码中了。
复现步骤:
https://editor.wix.com/ > 开发者模式 > 后端与公共 > 添加服务插件 > eCommerce Validation > 输入名称 > 添加与编辑代码 > .js和 config.js文件中显示错误
此警告在对 interfaces-ecommerce-v1-validations-provider 的每一次引用时都会出现。
我的最终目标是在结账超过29分钟时阻止完成结账。我只需要一个可靠的自动化方法,在结账完成时触发代码,以便验证自结账创建以来是否已超过29分钟(防止对过时结账进行支付)。
解决方案
这是Wix的 Service Plugin模板生成器的已知问题——interfaces-ecommerce-v1-validations-provider模块在Wix平台的运行时解析,而不是在编辑器中。这个警告是表面上的,不会阻止你的代码运行。
对于你的实际目标(阻止超过29分钟的结账),问题在于options.validationInfo对象包含商品项、运费、账单和折扣——但不包含结账创建的时间戳。该验证SPI不会在传给此函数的结账对象上暴露createdDate。
你有几种选择:
选项1:自行存储时间戳
使用Wix Data集合记录结账开始的时间,然后在验证阶段进行检查:
import * as ecomValidations from 'interfaces-ecommerce-v1-validations-provider';
import wixData from 'wix-data';
export const getValidationViolations = async (options, context) => {
const violations = [];
const checkoutId = options.validationInfo?.purchaseFlowId;
if (checkoutId) {
const result = await wixData.query('CheckoutTimestamps')
.eq('checkoutId', checkoutId)
.find();
if (result.items.length > 0) {
const createdAt = new Date(result.items[0].createdAt).getTime();
const minutesElapsed = (Date.now() - createdAt) / 1000 / 60;
if (minutesElapsed > 29) {
violations.push({
severity: ecomValidations.Severity.ERROR,
target: { other: { name: ecomValidations.NameInOther.OTHER_DEFAULT } },
description: 'This checkout session has expired. Please start a new checkout.',
});
}
}
}
return { violations };
};
你需要在结账创建时向CheckoutTimestamps集合填充数据(通过 https://dev.wix.com/docs/velo/api-reference/wix-ecom-v2/events/checkout)。
选项2:改用电子商务事件API
如果你不一定需要在结账时就阻止完成,可以使用onCheckoutCompleted事件来检查时机,并在事后进行退款或标记订单。