前言
支付宝官方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商店稳定地集成电脑网站支付功能。