博客 / WooCommerce/ 如何为WooCommerce集成新版的支付宝PC付款(含示例代码)

如何为WooCommerce集成新版的支付宝PC付款(含示例代码)

如何为WooCommerce集成新版的支付宝PC付款(含示例代码)

前言

支付宝官方SDK已更新,旧版接口(如即时到账)逐渐停止维护。本文将指导你使用支付宝官方最新的PHP SDK,为WooCommerce集成适用于PC网站支付(电脑网站支付)的功能。这种方法安全、规范,无需重复造轮子。

准备工作

在开始集成前,请确保你已具备以下条件:

  • 一个已上线的WordPress网站,并安装了WooCommerce插件。
  • 一个企业支付宝账户,并已签约“电脑网站支付”产品。
  • 获取了支付宝开放平台的APPID应用私钥支付宝公钥
  • 服务器环境支持PHP 7.0及以上版本,并已安装Composer(用于管理依赖)。

集成步骤

步骤一:通过Composer安装支付宝官方SDK

在你的WooCommerce主题目录或自定义插件目录下,通过命令行执行以下命令来安装SDK。建议在自定义插件中操作,以避免主题更新导致代码丢失。

composer require alipaysdk/easysdk:^2.0

安装成功后,你的目录中会生成一个vendor文件夹。

步骤二:创建自定义支付网关插件

为了避免修改核心文件,我们创建一个独立的插件来添加新的支付网关。在wp-content/plugins/目录下创建一个新文件夹,例如alipay-pc-for-woocommerce,并在其中创建主插件文件alipay-pc-for-woocommerce.php

<?php
/**
 * Plugin Name: WooCommerce Alipay PC Gateway
 * Description: 集成支付宝新版电脑网站支付到WooCommerce。
 * Version: 1.0.0
 * Author: Your Name
 */

// 确保在WooCommerce环境下运行
if (!in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {
    return;
}

add_action('plugins_loaded', 'init_alipay_pc_gateway');
function init_alipay_pc_gateway() {
    if (!class_exists('WC_Payment_Gateway')) {
        return;
    }

    class WC_Gateway_Alipay_PC extends WC_Payment_Gateway {
        // 类定义将在下一步填充
    }
}

// 将新网关添加到WooCommerce的支付方式列表中
add_filter('woocommerce_payment_gateways', 'add_alipay_pc_gateway');
function add_alipay_pc_gateway($gateways) {
    $gateways[] = 'WC_Gateway_Alipay_PC';
    return $gateways;
}

步骤三:实现支付网关类

在上一步创建的类中,填充核心代码。以下是精简但完整的关键部分。

class WC_Gateway_Alipay_PC extends WC_Payment_Gateway {
    public function __construct() {
        $this->id = 'alipay_pc';
        $this->icon = ''; // 可选项:支付宝Logo URL
        $this->has_fields = false;
        $this->method_title = '支付宝(电脑网站支付)';
        $this->method_description = '通过支付宝官方新版SDK进行电脑网站支付';
        $this->supports = array('products');

        // 加载配置表单字段
        $this->init_form_fields();
        // 加载用户设置的配置
        $this->init_settings();
        $this->title = $this->get_option('title');
        $this->description = $this->get_option('description');
        $this->app_id = $this->get_option('app_id');
        $this->merchant_private_key = $this->get_option('merchant_private_key');
        $this->alipay_public_key = $this->get_option('alipay_public_key');
        $this->debug = $this->get_option('debug');

        // 保存配置
        add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
        // 处理支付宝异步通知(回调)
        add_action('woocommerce_api_wc_gateway_alipay_pc', array($this, 'check_alipay_response'));
    }

    // 后台配置字段
    public function init_form_fields() {
        $this->form_fields = array(
            'enabled' => array(
                'title' => '启用/禁用',
                'type' => 'checkbox',
                'label' => '启用支付宝电脑网站支付',
                'default' => 'yes'
            ),
            'title' => array(
                'title' => '标题',
                'type' => 'text',
                'description' => '客户在结账时看到的支付方式名称。',
                'default' => '支付宝',
                'desc_tip' => true
            ),
            'app_id' => array(
                'title' => 'APPID',
                'type' => 'text',
                'required' => true
            ),
            'merchant_private_key' => array(
                'title' => '商户私钥',
                'type' => 'textarea',
                'description' => '填写应用私钥(去除-----BEGIN/END PRIVATE KEY-----,并确保无换行)。',
                'required' => true
            ),
            'alipay_public_key' => array(
                'title' => '支付宝公钥',
                'type' => 'textarea',
                'description' => '填写支付宝公钥(去除-----BEGIN/END PUBLIC KEY-----,并确保无换行)。',
                'required' => true
            )
        );
    }

    // 处理支付请求,跳转到支付宝
    public function process_payment($order_id) {
        $order = wc_get_order($order_id);
        require_once(__DIR__ . '/vendor/autoload.php'); // 引入Composer自动加载

        try {
            $config = new AlipayEasySDKKernelConfig();
            $config->protocol = 'https';
            $config->gatewayHost = 'openapi.alipay.com';
            $config->signType = 'RSA2';
            $config->appId = $this->app_id;
            $config->merchantPrivateKey = $this->merchant_private_key;
            $config->alipayPublicKey = $this->alipay_public_key;
            $config->notifyUrl = home_url('/wc-api/wc_gateway_alipay_pc/'); // 异步通知地址

            AlipayEasySDKKernelFactory::setOptions($config);
            $result = AlipayEasySDKPaymentPageClient::pay()->pay(
                $order->get_order_number(), // 商户订单号
                sprintf('%.2f', $order->get_total()), // 订单金额
                '购买商品', // 订单标题
                home_url('/checkout/order-received/') // 同步跳转地址(支付成功后跳回)
            );

            if ($result->code == '10000') {
                // 将订单状态改为“等待支付”
                $order->update_status('pending', '等待用户支付');
                // 清空购物车
                WC()->cart->empty_cart();
                // 重定向到支付宝支付页面
                return array(
                    'result' => 'success',
                    'redirect' => $result->body // 支付页面的URL
                );
            } else {
                wc_add_notice('支付请求创建失败:' . $result->msg, 'error');
                return;
            }
        } catch (Exception $e) {
            wc_add_notice('支付网关配置错误:' . $e->getMessage(), 'error');
            return;
        }
    }

    // 处理支付宝异步通知(验签并更新订单状态)
    public function check_alipay_response() {
        $raw = file_get_contents('php://input');
        $data = json_decode($raw, true);
        if (empty($data)) {
            parse_str($raw, $data);
        }

        require_once(__DIR__ . '/vendor/autoload.php');
        $config = new AlipayEasySDKKernelConfig();
        $config->protocol = 'https';
        $config->gatewayHost = 'openapi.alipay.com';
        $config->signType = 'RSA2';
        $config->appId = $this->app_id;
        $config->merchantPrivateKey = $this->merchant_private_key;
        $config->alipayPublicKey = $this->alipay_public_key;
        AlipayEasySDKKernelFactory::setOptions($config);

        try {
            // 验证签名
            $verify = AlipayEasySDKKernelFactory::payment()->common()->verifyNotify($data);
            if ($verify) {
                // 验签成功,处理业务逻辑
                $out_trade_no = $data['out_trade_no']; // 商户订单号
                $trade_status = $data['trade_status']; // 交易状态
                $order = wc_get_order($out_trade_no);

                if ($trade_status == 'TRADE_SUCCESS' || $trade_status == 'TRADE_FINISHED') {
                    // 支付成功,更新订单状态为“处理中”或“已完成”
                    $order->payment_complete();
                    $order->add_order_note('支付宝支付成功。交易号:' . $data['trade_no']);
                } else if ($trade_status == 'WAIT_BUYER_PAY') {
                    // 交易创建,等待付款
                    $order->update_status('pending');
                } else if ($trade_status == 'TRADE_CLOSED') {
                    // 交易关闭
                    $order->update_status('cancelled', '支付宝交易已关闭');
                }
                echo 'success'; // 必须返回success给支付宝,否则支付宝会重复通知
            } else {
                echo 'fail';
            }
        } catch (Exception $e) {
            echo 'fail';
        }
        exit;
    }
}

步骤四:配置与测试

1. 在WordPress后台“插件”页面,启用你刚创建的“WooCommerce Alipay PC Gateway”插件。
2. 进入 WooCommerce -> 设置 -> 付款,找到“支付宝(电脑网站支付)”,点击“管理”进行配置。
3. 正确填写从支付宝开放平台获取的APPID、商户私钥和支付宝公钥。
4. 保存更改。
5. 创建一个测试订单,选择“支付宝”支付,应能正确跳转到支付宝支付页面。使用支付宝沙箱环境进行测试是推荐的第一步。

注意事项

  • 密钥格式:确保填入的私钥和公钥是去除头尾标记和换行符的纯字符串。
  • 异步通知:确保你的服务器可以通过公网访问,支付宝才能成功发送异步通知以更新订单状态。
  • 错误排查:开启WordPress的WP_DEBUG日志,或在代码中添加日志记录,有助于排查SDK初始化或支付过程中的问题。
  • 生产环境:测试无误后,将配置中的网关地址和APPID等信息切换为支付宝生产环境。

通过以上步骤,你就能使用支付宝官方新版PHP SDK,为你的WooCommerce商店稳定地集成电脑网站支付功能。

发表评论

您的邮箱不会公开。必填项已用 * 标注。