将 PayPal 支付整合到 WordPress 网站并不一定需要安装插件。如果你想了解更深入的原理以便接入其他没有插件的支付方式或者你想减少网站对第三方插件的依赖,那么通过代码的方式设置 PayPal 支付是一个不错的选择。代码接入可以从初始设置到处理 PayPal Webhooks 以及在 WordPress 中管理支付信息的每个步骤,这样也可以更方便的管控整个支付流程。本文就分享一下在WordPress网站上通过代码方式接入PayPal支付的每个步骤。

1. 在前台显示支付表单

首先,您需要一个表单,用户可以通过它发起付款。将此 HTML 表单放在 WordPress 主题文件中希望用户支付的地方,如自定义页面模板或网站的特定部分。

<!-- Place this in your theme's file where you want the form to appear -->
<form id="paypal-payment-form" action="/path-to-your-submission-handler" method="POST">
    <input type="text" name="amount" placeholder="金额" required>
    <input type="email" name="payer_email" placeholder="邮件地址" required>
    <input type="submit" value="通过 PayPal 支付">
</form>

2. 处理表单提交并在数据库中保存支付信息

您需要在服务器端处理步骤1中的表单提交,包括获取表单数据并将其保存到 WordPress 数据库中的自定义表中,然后再重定向到 PayPal。

首先,要创建一个用于存储支付信息的自定义数据表。下面是创建表格的简化 SQL 语句。你可以通过phpMyAdmin等数据库管理工具,或在主题/插件激活钩子中以编程方式运行此语句。

CREATE TABLE wp_custom_payments (
    id BIGINT(20) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    amount DECIMAL(10, 2) NOT NULL,
    payer_email VARCHAR(255) NOT NULL,
    status VARCHAR(20) NOT NULL DEFAULT 'pending',
    paypal_payment_id VARCHAR(255) DEFAULT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

接下来,在主题的functions.php文件中添加以下代码。这段代码会捕获提交的表单,将支付信息保存到自定义表中,然后重定向到 PayPal 完成支付。

add_action('template_redirect', 'handle_paypal_form_submission');
function handle_paypal_form_submission() {
    if (isset($_POST['amount']) && isset($_POST['payer_email'])) {
        global $wpdb;
        $amount = sanitize_text_field($_POST['amount']);
        $payer_email = sanitize_email($_POST['payer_email']);
        
        // Insert payment record into the database
        $wpdb->insert(
            $wpdb->prefix . 'custom_payments',
            [
                'amount' => $amount,
                'payer_email' => $payer_email,
                'status' => 'pending' // Default status
            ],
            ['%f', '%s', '%s']
        );
        
        $payment_id = $wpdb->insert_id;
        
        // 重定向至 PayPal 进行支付 (示例代码,实际开发中请换成你从 PayPal 获取的连接和ID)
        wp_redirect("https://www.paypal.com/cgi-bin/webscr?cmd=_pay-inv&id=PAYMENT_ID_FROM_PAYPAL");
        exit;
    }
}

3. 处理 PayPal Webhook 和更新数据库中的支付状态

通过 PayPal 支付完成后,PayPal 会向你的应用程序中指定的 URL 发送支付结果通知。你需要接收并处理这个通知以更新数据库中的支付状态。

首先,在 PayPal 开发者控制面板中配置通知监听器URL(你的 WordPress 网站上的特定网址)

然后,在主题的functions.php文件中添加以下代码,处理传入的请求并更新付款状态。

add_action('init', 'handle_paypal_webhook');
function handle_paypal_webhook() {
    if ($_SERVER['REQUEST_METHOD'] == 'POST' && $_SERVER['REQUEST_URI'] == '/paypal-webhook-listener') {
        $payload = file_get_contents('php://input');
        $data = json_decode($payload, true);
        
        // Assume $data contains 'payment_id' and 'status'
        global $wpdb;
        $table_name = $wpdb->prefix . 'custom_payments';
        
        // Validate and verify the webhook payload with PayPal
        
        // Update the payment status based on the webhook data
        $wpdb->update(
            $table_name,
            ['status' => sanitize_text_field($data['status'])], // Example: 'completed'
            ['id' => (int) $data['payment_id']], // 假设 'payment_id' 是你的联系方式
            ['%s'],
            ['%d']
        );
        
        status_header(200);
        exit;
    }
}

以上代码只是一个核心实现的示例代码,在实际编码时还应通过 PayPal 验证请求真实性。

安全和验证注意事项

  • 务必对输入数据进行验证和过滤,以防止 SQL 注入和其他安全漏洞。
  • 与 PayPal 验证 webhook 数据,确保通知合法。
  • 对表单提交实施 CSRF 保护。