在Woocommerce的PayPal标准网关中,我想让Woocommerce
仅发送" 订单号"作为购物车中的唯一商品,而不是明细商品列表。
为此,我尝试编辑负责在此处发出PayPal请求的类:
woocommerce/includes/gateways/paypal/includes/class-wc-gateway-paypal-request.php
我尝试编辑get_order_item_names()
函数以返回"invoice" . $order->get_order_number()
作为唯一项目的名称,但它没有成功,因为如果有多个项目,则仅返回第一个项目订单号,其他项目仍然存在。
另外,我钉了add_line_item()
函数,因为为了达到目的,实际上应该只有" item_name_1 "与卡的总金额。
$this->line_items[ 'item_name_' . $index ] = $this->limit_length( $item['item_name'], 127 );
$this->line_items[ 'quantity_' . $index ] = $item['quantity'];
$this->line_items[ 'amount_' . $index ] = $item['amount'];
$this->line_items[ 'item_number_' . $index ] = $this->limit_length( $item['item_number'], 127 );
这里也没有成功。
感谢您的帮助。
答案 0 :(得分:1)
建议:你应该真的避免重写woocommerce核心文件。
相反,您可以在此特定情况下使用 过滤器钩子 woocommerce_paypal_args
,其中您将能够操纵参数在 get_request_url()
函数中使用的函数(将获取订单的PayPal请求网址)。
1)测试并获取数据
只是为了注册并获取发送给paypal的参数,我用这种方式使用了钩子:
add_filter('woocommerce_paypal_args', 'custom_paypal_args', 10, 2 );
function custom_paypal_args ( $args, $order ) {
// Saving the data to order meta data (custom field)
update_post_meta( $order->get_id(), '_test_paypal', $args );
return $args;
}
代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。
现在我可以简单地使用它来获取数据(设置正确的订单ID):
$order_id = 648;
$data_sent_to_paypal = get_post_meta( $order_id, '_test_paypal' );
echo '<pre>'; print_r( $data_sent_to_paypal ); echo '</pre>';
或者在钩子中(此示例中的商店页面仅在管理员处可见):
// Only visible on shop pages by admins
add_action( 'woocommerce_before_main_content', function(){
// Only visible by admins
if( ! current_user_can( 'manage_options' ) ) return;
$order_id = 648;
$data_sent_to_paypal = get_post_meta( $order_id, '_test_paypal' );
echo '<pre>'; print_r( $data_sent_to_paypal ); echo '</pre>';
}, 10, 0 );
这给了我一个类似的输出(2个产品和不同的数量):
Array
(
[0] => Array
(
[cmd] => _cart
[business] => email@example.com
[no_note] => 1
[currency_code] => EUR
[charset] => utf-8
[rm] => 2
[upload] => 1
[return] => https://example.com/checkout/order-received/8877?key=wc_order_55445ndfgbulfdf&utm_nooverride=1
[cancel_return] => https://example.com/cart/?cancel_order=true&order=wc_order_55445ndfgbulfdf&order_id=8877&redirect&_wpnonce=34m7kl83455
[page_style] =>
[image_url] => https://example.com/wp-content/uploads/2012/06/logo.png
[paymentaction] => sale
[bn] => WooThemes_Cart
[invoice] => pp-8877
[custom] => {"order_id":8877,"order_key":"wc_order_55445ndfgbulfdf"}
[notify_url] => https://example.com/wc-api/WC_Gateway_Paypal/
[first_name] => John
[last_name] => Doe
[address1] => Test st.
[address2] =>
[city] => wef
[state] => AR
[zip] => 43242
[country] => US
[email] => myemail@example.com
[night_phone_a] => 078
[night_phone_b] => 653
[night_phone_c] => 6216
[no_shipping] => 1
[tax_cart] => 16.55
[item_name_1] => Test Product - Service
[quantity_1] => 1
[amount_1] => 71
[item_number_1] =>
[item_name_2] => Test Product 1
[quantity_2] => 1
[amount_2] => 66
[item_number_2] =>
[item_name_3] => Test Product 2
[quantity_3] => 1
[amount_3] => 120
[item_number_3] =>
[item_name_4] => Test Product 3
[quantity_4] => 1
[amount_4] => 45
[item_number_4] =>
)
)
正如您现在所看到的,使用 woocommerce_paypal_args
,您可以更改或删除任何参数。
始终只有一个:
'item_name_1'
,'quantity_1'
,'amount_1'
和'item_number_1'
,始终为索引1
发送给PayPal。
2操纵数据发送 (示例):
我们仍然可以使用 woocommerce_paypal_args
,例如在'item_name_1'
键上过滤钩子,按照您的需要用订单号替换项目名称:
add_filter('woocommerce_paypal_args', 'custom_paypal_args', 10, 2 );
function custom_paypal_args ( $args, $order ) {
$$args_keys = array_keys($args);
$i = 0;
// Iterating through order items
foreach( $order->get_items() as $item_id => $item_product ){
$i++; // updating count.
if( ! empty($args["item_name_$i"]) ){
// Returning the order invoice in the item name
$args["item_name_$i"] = "invoice #" . $order->get_id();
}
}
return $args;
}
代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。
代码已经过测试,适用于WooCommerce 3 +
完成:当您在钩子函数中获取WC_Order对象作为参数时,您可以使用它从订单中获取任何数据,并根据需要操作发送到paypal网关的数据。
请参阅此相关答案:How to get WooCommerce order details
答案 1 :(得分:-1)
我正在使用以下功能获取订单ID,您可以根据需要编辑和使用以下功能。
public function process_payment( $order_id ) {
global $woocommerce;
$order = new WC_Order( $order_id );
return array(
'result' => 'success',
'redirect' => $order->get_checkout_payment_url( true )
);