在Woocommerce中仅向PayPal发送订单号而不是商品名称

时间:2017-09-14 14:34:22

标签: php wordpress paypal woocommerce orders

在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 );

这里也没有成功。

感谢您的帮助。

2 个答案:

答案 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 )
    );