网关模板
网关模板为您构建仅供 POS 使用的自定义支付网关提供起点。它会生成一个仅包含一个 PHP 文件的可用 WordPress 插件,供您安装并按需自定义。
功能
精简代码
仅包含必需内容的单个 PHP 文件——易于阅读和修改
仅限 POS
默认在网页结账中禁用,通过 WCPOS 设置启用
自动设置
Shell 脚本会自动替换所有占位符
GitHub 发布
推送版本号更新后,GitHub Actions 会生成可下载的 ZIP 文件
开始使用
克隆模板库
git clone https://github.com/wcpos/woocommerce-gateway-template.git
cd woocommerce-gateway-template
或者点击 GitHub 仓库上的 使用此模板 按钮,创建您自己的副本。
运行设置脚本
./create-gateway.sh
脚本会询问一些信息——您的网关名称、简短说明和 GitHub 用户名——然后在您选择的目录中生成可直接使用的插件。
安装插件
您有两个选择:
选项 A — 直接复制文件夹(如果您有服务器访问权限):
将生成的网关文件夹复制到网站的 wp-content/plugins/ 目录。
选项 B — 压缩并上传(对大多数人来说最简单):
- 将生成的文件夹压缩为
.zip文件 - 在 WordPress 中,前往 插件 > 添加新 > 上传插件
- 选择 ZIP 文件并点击 立即安装
在 WCPOS 中启用
- 前往 WP Admin > WCPOS > 设置 > 收银台
- 在列表中找到新网关并启用
默认情况下,该网关在常规网页结账中处于禁用状态。WCPOS 通过自身设置控制 POS 中显示哪些网关。
手动设置
如果不想使用脚本,也可以自行替换占位符。在文本编辑器中打开每个文件,然后查找并替换以下内容:
| 占位符 | 填写内容 | 示例 |
|---|---|---|
{{GATEWAY_NAME}} | 网关显示名称 | 现金付款 |
{{GATEWAY_SLUG}} | URL 安全标识符(小写字母、连字符) | cash-payment |
{{GATEWAY_DESCRIPTION}} | 网关简短说明 | 在 WCPOS 中接受现金付款 |
{{GATEWAY_DEFAULT_DESCRIPTION}} | 结账时向收银员显示的文字 | 在 POS 中使用现金付款 |
{{GITHUB_USERNAME}} | 您的 GitHub 用户名 | kilbot |
{{REPO_NAME}} | 您的仓库名称 | cash-payment-gateway |
{{AUTHOR_NAME}} | 您的姓名 | kilbot |
{{GATEWAY_ID}} | 将连字符替换为下划线的 slug | cash_payment |
{{GATEWAY_CLASS_NAME}} | 每个单词首字母大写,并用下划线连接 | Cash_Payment |
{{GATEWAY_FUNCTION_PREFIX}} | 与网关 ID 相同 | cash_payment |
然后将 wcpos-{{GATEWAY_SLUG}}.php 重命名为与您的 slug 匹配的名称(例如 wcpos-cash-payment.php)。
设置脚本会根据名称和 slug 自动生成 GATEWAY_ID、GATEWAY_CLASS_NAME 和 GATEWAY_FUNCTION_PREFIX,因此只有手动设置时才需要考虑这些值。
工作原理
生成的插件会注册一个 WooCommerce 支付网关类。以下是需要了解的要点:
$this->enabled = 'no'— 该网关不会显示在网页结账中。WCPOS 会根据您的 POS 设置在 POS 中启用它。process_payment()— 调用$order->payment_complete(),将订单标记为已付款并自动处理库存扣减。init_form_fields()— 定义 WooCommerce 设置中显示的标题和说明字段。
自定义网关
添加付款字段
如果网关需要收银员输入信息(例如参考编号),请覆盖 payment_fields() 方法:
public function payment_fields() {
if ( $this->description ) {
echo wpautop( wptexturize( $this->description ) );
}
woocommerce_form_field( 'my_gateway_reference', array(
'type' => 'text',
'label' => __( 'Reference Number', 'your-text-domain' ),
'required' => true,
) );
}
然后,您可以通过 process_payment() 在 $_POST['my_gateway_reference'] 中读取提交的值。请记得使用 sanitize_text_field() 清理所有输入。
更改付款行为
默认模板会立即将订单标记为已付款。如果您的工作流程要求稍后付款(例如发票),请将 payment_complete() 替换为状态更新:
public function process_payment( $order_id ) {
$order = wc_get_order( $order_id );
// Set to pending — the customer will pay later.
$order->update_status( 'pending', __( 'Awaiting payment', 'your-text-domain' ) );
// Stock must be reduced manually when not using payment_complete().
wc_reduce_stock_levels( $order_id );
return array(
'result' => 'success',
'redirect' => $this->get_return_url( $order ),
);
}
进行更改和更新
安装网关后,您可以继续编辑插件文件来调整付款逻辑。要安装更新版本:
- 编辑生成文件夹中的
wcpos-your-slug.php - 更新插件标头中的
Version:版本号(例如从0.1.0更新为0.2.0) - 再次压缩文件夹,并通过 插件 > 添加新 > 上传插件 上传,或直接替换
wp-content/plugins/中的文件夹
上传与现有插件同名的 ZIP 文件时,WordPress 会询问是否替换现有插件——点击 用上传的版本替换当前版本 即可更新。
通过 GitHub 自动发布
如果将网关推送到 GitHub 仓库,模板会包含一个 GitHub Actions 工作流,用于自动创建版本发布:
- 更新插件标头中的
Version:版本号 - 提交并推送到
main分支 - GitHub Actions 会检测版本变更,并创建包含可下载 ZIP 文件的新版本发布
其他用户随后可以从您仓库的 发布 页面下载 ZIP 文件,并像安装其他 WordPress 插件一样安装。
故障排除
网关未显示在 POS 中
- 检查是否已在 WP Admin > 插件 中启用插件
- 前往 WP Admin > WCPOS > 设置 > 收银台,确认网关已启用
- 确认已安装并启用 WooCommerce
网关显示在网页结账中
- 确保在网关构造函数中设置了
$this->enabled = 'no'; - WCPOS 会在 POS 请求中覆盖此设置,因此该网关应仅显示在 POS 中
订单一直处于“处理中”而非“已完成”状态
- WooCommerce 会根据商品类型设置订单状态。包含实体商品的订单会保持“处理中”状态——这是 WooCommerce 的正常行为。只有全部商品均为虚拟商品或可下载商品的订单才会自动标记为“已完成”。
要求
资源
- GitHub:woocommerce-gateway-template
- WooCommerce 支付网关 API: WC_Payment_Gateway 文档
示例网关
这些现有网关采用相同的方法构建,是很好的参考: