跳到主要内容

在结账块中过滤付款方式

问题

您是一名扩展开发者,您的扩展有条件地隐藏结账步骤中的支付网关。您需要使用前端可扩展性点来隐藏结账块中的支付网关。

解决方案

WooCommerce Blocks 提供了名为 registerPaymentMethodExtensionCallbacks 的函数,允许扩展注册回调函数,用于特定付款方式,以确定是否可以进行支付。

导入

别名导入

import { registerPaymentMethodExtensionCallbacks } from '@woocommerce/blocks-registry';

wc global

const { registerPaymentMethodExtensionCallbacks } = window.wc.wcBlocksRegistry;

签名

参数描述类型
namespace用于标识您的扩展的唯一字符串。选择一个能够避免与其他扩展发生命名冲突的名称。string
callbacks包含为不同付款方式注册的回调函数的对象Record< string, CanMakePaymentExtensionCallback >

请参阅以下关于 为付款方式注册的回调函数 的更多信息。

扩展命名空间冲突

当尝试在已使用 registerPaymentMethodExtensionCallbacks 的扩展命名空间下注册回调函数时,注册将被中止,并且您将收到通知,表明您没有使用唯一的命名空间。 这将在 JavaScript 控制台中显示。

使用示例

registerPaymentMethodExtensionCallbacks( 'my-hypothetical-extension', {
cod: ( arg ) => {
return arg.shippingAddress.city === 'Berlin';
},
cheque: ( arg ) => {
return false;
},
} );

为付款方式注册的回调函数

扩展程序只能为每种付款方式注册一个回调函数:

payment_method_name: (arg) => {...}

payment_method_name 是在向 WooCommerce Blocks 注册付款方式时使用的 name 属性 的值。

注册的回调函数用于确定相应的付款方式是否应作为购物者的可用选项。 该函数将传递一个包含有关当前订单的数据的对象。

type CanMakePaymentExtensionCallback = (
cartData: CanMakePaymentArgument
) => boolean;

每个回调函数都可以访问以下信息:

interface CanMakePaymentArgument {
cart: Cart;
cartTotals: CartTotals;
cartNeedsShipping: boolean;
billingAddress: CartResponseBillingAddress;
shippingAddress: CartResponseShippingAddress;
selectedShippingMethods: Record< string, unknown >;
paymentRequirements: Array< string >;
}

如果需要回调函数接收的参数中没有的数据,您可以考虑 在 Store API 中公开您的数据

使用要求过滤付款方式

问题

您的扩展程序以一种方式向您的商店添加了功能,即只有特定的支付网关才能处理包含某些产品的订单。

例如,如果购物者将 Bookable 产品添加到购物车,例如酒店住宿,并且您(作为商家)希望在付款之前确认所有预订,您仍然需要捕获客户的结账详细信息,但此时不需要他们的付款方式。

解决方案

为了允许购物者在不输入付款详细信息的情况下结账,但仍然要求他们填写其他结账详细信息,您可以创建一个新的付款方式,该付款方式将处理包含 Bookable 项目的购物车。

通过使用付款方式的 supports 配置,可以防止其他付款方式(例如信用卡、PayPal 等)被用于结账,并且仅允许您的扩展程序添加的付款方式出现在结账块中。

有关如何向 WooCommerce Blocks 注册付款方式的更多信息,请参阅 付款方式集成 文档。

基本用法

请参考上方链接的文档,注册您的付款方式,并为其指定一个唯一的 supports 特性,例如 booking_availability。这将用于隔离该付款方式,防止其他付款方式显示。

首先,您需要创建一个函数,该函数将检查购物车的内容,以确定购物车所需的特定付款要求。以下是一个针对我们的 Bookable 产品执行此操作的示例。

然后,您需要在 ExtendSchema 类中使用 register_payment_requirements,以告知结账模块执行一个回调函数来检查这些要求。

整合所有内容

此代码示例假设存在一个名为 Pseudo_Booking_Class 的类,该类具有 cart_contains_bookable_product 方法。 此方法的实现在此处不相关。

/**
* 检查购物车的内容,并添加所需的付款方式。
*
*
* @return array 购物车中项目所需的特性列表。
*/
function inject_payment_feature_requirements_for_cart_api() {
// 如果购物车包含可预订的产品,则返回一个包含我们要求的 `booking_availability` 的数组。
if ( Pseudo_Booking_Class::cart_contains_bookable_product() ) {
return array( 'booking_availability' );
}

// 购物车中没有可预订的产品,无需添加任何内容。
return array();
}

总结上述内容:如果购物车中包含可预订的产品,则此函数将返回一个包含 booking_availability 的数组,否则,它将返回一个空数组。

下一步是告诉 ExtendSchema 类,在检查要显示的付款方式时,执行此回调函数。

为此,您可以使用以下代码:

add_action('woocommerce_blocks_loaded', function() {
woocommerce_store_api_register_payment_requirements(
array(
'data_callback' => 'inject_payment_feature_requirements_for_cart_api',
)
);
});

重要的是要注意此代码块中的注释:您必须不要实例化 ExtendSchema 的自定义版本。

如果您已正确添加您的付款方式,并为其指定了正确的 supports 值,那么当您在购物车中包含 Bookable 项目时访问结账页面时,任何不支持 booking_availability 要求的付款方式都应该不显示,而您的付款方式,即_支持_此要求的付款方式_将_显示。