You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce点击加购直接跳转PayPal购物车及钩子替代方案咨询

替代方案:实现商品页点击「加入购物车」直接跳转PayPal购物车(WooCommerce PayPal Payments)

核心思路

放弃依赖旧的woocommerce_paypal_args钩子,改为拦截默认加入购物车行为,通过PayPal Payments插件的内置功能或直接构造结账链接,完成商品添加并跳转至PayPal页面。

方案1:改造PayPal快速结账按钮(推荐)

利用PayPal Payments自带的快速结账功能,替换商品页默认的「加入购物车」按钮,点击直接进入PayPal结账流程:

  1. 隐藏默认加入购物车按钮
add_action('woocommerce_single_product_summary', function() {
    // 移除默认加入购物车按钮的渲染动作
    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);
}, 20);
  1. 在原位置输出PayPal快速结账按钮
add_action('woocommerce_single_product_summary', function() {
    global $product;
    
    // 仅对简单商品生效,可自行扩展到可变商品
    if ($product->is_type('simple')) {
        echo '<div class="paypal-direct-checkout">';
        // 调用插件内置模板生成结账按钮
        wc_get_template('single-product/paypal-button.php', [
            'product'     => $product,
            'button_type' => 'checkout', // 指定为直接结账类型
        ]);
        echo '</div>';
    }
}, 30);

方案2:拦截加入购物车请求并跳转

保留原「加入购物车」按钮外观,拦截点击后的请求,添加商品到购物车后直接跳转至PayPal结账:

add_action('template_redirect', function() {
    // 仅处理商品页的加入购物车POST请求
    if (is_product() && isset($_POST['add-to-cart']) && !empty($_POST['add-to-cart'])) {
        $product_id = absint($_POST['add-to-cart']);
        $product = wc_get_product($product_id);
        
        if (!$product || !$product->is_purchasable()) return;
        
        // 清空现有购物车(可选,根据需求保留或移除)
        WC()->cart->empty_cart();
        // 添加当前商品到购物车
        WC()->cart->add_to_cart($product_id);
        
        // 构造PayPal Payments快速结账URL
        $paypal_checkout_url = wc_get_checkout_url() . '?paypal_payments_action=express_checkout';
        
        wp_safe_redirect($paypal_checkout_url);
        exit;
    }
});

方案3:调用PayPal REST API直接生成订单

需要更灵活控制时,直接调用PayPal API创建订单并跳转:

add_action('template_redirect', function() {
    if (is_product() && isset($_POST['add-to-cart']) && !empty($_POST['add-to-cart'])) {
        $product_id = absint($_POST['add-to-cart']);
        $product = wc_get_product($product_id);
        
        if (!$product) return;
        
        // 从插件设置中获取PayPal API凭证
        $paypal_settings = get_option('woocommerce_ppcp_settings');
        $client_id = $paypal_settings['client_id'];
        $client_secret = $paypal_settings['client_secret'];
        $env = $paypal_settings['environment'] === 'sandbox' ? 'sandbox' : 'live';
        
        // 获取API访问令牌
        $token_url = $env === 'sandbox' ? 'https://api-m.sandbox.paypal.com/v1/oauth2/token' : 'https://api-m.paypal.com/v1/oauth2/token';
        $token_res = wp_remote_post($token_url, [
            'headers' => [
                'Authorization' => 'Basic ' . base64_encode($client_id . ':' . $client_secret),
                'Content-Type' => 'application/x-www-form-urlencoded',
            ],
            'body' => 'grant_type=client_credentials',
        ]);
        
        if (is_wp_error($token_res)) return;
        $token_data = json_decode(wp_remote_retrieve_body($token_res), true);
        $access_token = $token_data['access_token'];
        
        // 创建PayPal订单
        $order_url = $env === 'sandbox' ? 'https://api-m.sandbox.paypal.com/v2/checkout/orders' : 'https://api-m.paypal.com/v2/checkout/orders';
        $order_res = wp_remote_post($order_url, [
            'headers' => [
                'Authorization' => 'Bearer ' . $access_token,
                'Content-Type' => 'application/json',
            ],
            'body' => json_encode([
                'intent' => 'CAPTURE',
                'purchase_units' => [[
                    'amount' => [
                        'currency_code' => get_woocommerce_currency(),
                        'value' => $product->get_price(),
                    ],
                    'description' => $product->get_name(),
                ]],
                'application_context' => [
                    'return_url' => wc_get_checkout_url() . '?paypal_return=1',
                    'cancel_url' => get_permalink($product_id),
                ],
            ]),
        ]);
        
        if (is_wp_error($order_res)) return;
        $order_data = json_decode(wp_remote_retrieve_body($order_res), true);
        
        // 跳转至PayPal订单确认页
        foreach ($order_data['links'] as $link) {
            if ($link['rel'] === 'approve') {
                wp_safe_redirect($link['href']);
                exit;
            }
        }
    }
});

注意事项

  • 方案1依赖插件内置模板,需确保PayPal Payments为最新版本,避免模板路径变更。
  • 方案2中的paypal_payments_action=express_checkout是插件识别快速结账的标识,不同版本可能有差异,需测试验证。
  • 方案3需确保服务器支持wp_remote_post,且PayPal API凭证配置正确。
  • 所有代码建议添加到主题functions.php或自定义插件中,不要修改核心文件。

内容的提问来源于stack exchange,提问作者Pushan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:52:22