前面一篇博客介绍了支付宝开放平台上如何创建应用,以及相应的SDK中提供的接口。

这篇博客介绍一下WooCommerce中如何添加新的支付方式。


创建一个简单的支付网关

WooCommerce中的支付网关是基于类的,可以通过插件的方式添加。在插件里面,需要在插件加载后创建一个类,比如:

add_action( 'plugins_loaded', 'init_your_gateway_class' );

并且你的类需要继承自WooCommerce网关基类,然后你才可以使用设置API以及其他一些WooCommerce提供的方法:

function init_your_gateway_class() {class WC_Gateway_Your_Gateway extends WC_Payment_Gateway {}}

除了定义自己的类,还需要告诉WooCommerce这个类的存在。这是通过添加过滤器实现的:

function add_your_gateway_class( $methods ) {$methods[] = 'WC_Gateway_Your_Gateway'; return $methods;}add_filter( 'woocommerce_payment_gateways', 'add_your_gateway_class' );

类中需要实现的方法

大多数的方法继承自WC_Payment_Gateway类,但是在自己的网关中要求实现一些方法。

__construct()

在构造方法中,应该定义以下的变量:

  • $this->id:自己的网关的唯一ID,比如’your_gateway’
  • $this->icon:如果你想在前端网关名称的旁边显示一张图片,输入图片的URL
  • $this->has_fields:布尔值,如果你想要支付域在结算页面显示的话,设置成true
  • $this->method_title:在admin页面显示的支付方法的标题
  • $this->method_description:在admin页面显示的支付方法的描述

构造方法中应该定义并加载设置域:

$this->init_form_fields();
$this->init_settings();

在调用了init_settings()之后,可以获取设置并且保存在变量中,比如:

$this->title = $this->get_option( 'title' );

最后,需要为你的设置添加一个保存钩子:

add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );

init_form_fields()
这个方法用于设置$this->form_fields,这是你在自己的网关设置页面中显示的选项,这个方法中需要使用WC Settings API([2])。

自己网关的基本设置应该包含enabled,title和description:

$this->form_fields = array('enabled' => array('title' => __( 'Enable/Disable', 'woocommerce' ),'type' => 'checkbox','label' => __( 'Enable Cheque Payment', 'woocommerce' ),'default' => 'yes'),'title' => array('title' => __( 'Title', 'woocommerce' ),'type' => 'text','description' => __( 'This controls the title which the user sees during checkout.', 'woocommerce' ),'default' => __( 'Cheque Payment', 'woocommerce' ),'desc_tip'      => true,),'description' => array('title' => __( 'Customer Message', 'woocommerce' ),'type' => 'textarea','default' => '')
);

process_payment( $order_id )

这是网关最重要的部分——处理支付以及订单。这个方法也告诉WC重定向用户到哪,这是通过返回的array实现的。

下面以Cheque网关的process_function方法为例:

function process_payment( $order_id ) {global $woocommerce;$order = new WC_Order( $order_id );// Mark as on-hold (we're awaiting the cheque)$order->update_status('on-hold', __( 'Awaiting cheque payment', 'woocommerce' ));// Reduce stock levels$order->reduce_order_stock();// Remove cart$woocommerce->cart->empty_cart();// Return thankyou redirectreturn array('result' => 'success','redirect' => $this->get_return_url( $order ));
}

这个方法实现了:

  • 获取并更新处理中的订单
  • 减少库存并清空购物车
  • 返回success和重定向URL(这个例子中是感谢页面)

Cheque给订单一个On-Hold状态,因为支付不能被自动验证。如果你在构建一个direct网关,那么你应该在这里完成订单。在订单被支付之后,应该使用payment_complete而不是update_status:

$order->payment_complete();

这可以确保库存确实减少并且状态是正确的值。

如果支付失败,你应该抛出一个错误并且返回null:

wc_add_notice( __('Payment error:', 'woothemes') . $error_message, 'error' );
return;

WooCommerce会捕获这个错误并在结算页面中显示。

更新订单状态

更新订单状态可以通过使用订单类中的方法实现。更新到一个定制状态的例子如下:

$order = new WC_Order( $order_id );
$order->update_status('on-hold', __('Awaiting cheque payment', 'woothemes'));

上面的例子把订单状态更新为On-Hold,并且添加一个注意消息通知顾客正在等待一个Cheque。你也可以不再更新订单状态的时候添加注意消息:

$order->add_order_note( __('IPN payment completed', 'woothemes') );

订单状态实践建议

  • 如果订单完成但是admin需要人工验证支付,使用On-Hold
  • 如果订单失败并且已经创建,设置为Failed
  • 如果订单完成,让WooCommerce处理状态并且使用$order->payment_complete(). WooCommerce会使用Completed或者Processing状态并处理库存。

参考

[1] Payment Gateway API
[2] Settings API

WooCommerce接入支付宝支付功能(二)——WooCommerce中添加新的支付网关相关推荐

  1. WooCommerce接入支付宝微信支付

    WooCommerce接入支付宝微信支付 前言 安装支付宝插件(方法一) 安装配置 获取注册信息 安装支付宝插件(方法二) 安装微信支付插件 下载及安装 获取微信公众号APPID,微信支付密钥 获取微 ...

  2. 个人开发者的项目如何接入支付宝登录功能(保姆级教学)(Java的后台为例,其他语言类似)

    文章目录 前言 一.创建开发者账号和应用并配置 (1)创建应用 (2)接入产品并配置 (3)开发设置 二.接入SDK (1)下载SDK (2)写后台 代码解释 : getToken方法的code参数怎 ...

  3. discuz网站没备案无执照接入支付宝充值功能

    discuz个人网站没备案无执照接入支付宝充值功能 文章目录 事情是这样的 一.支付宝当面付是什么? 二.如何申请当面付接口 1.登录 支付宝商家中心 2.点击"产品中心",支付产 ...

  4. 全面剖析支付宝服务窗功能二次开发

    支付宝服务窗功能二次开发是类似于微信公众号功能二次开发一样的平台,但是支付宝跟微信之间只有区别的,微信可提供给客户发布些个人相关的信息.言论.文章等,也可以提供给单位使用:而且都支持二次开发的.而支付 ...

  5. 微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...

    首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 namespace ...

  6. wordpress添加媒体_如何在WordPress中添加新帖子并利用所有功能

    wordpress添加媒体 Are you trying to create a new post in WordPress? Do you want to learn about all the W ...

  7. Sharepoint学习笔记—Ribbon系列-- 5. 在Ribbon中添加新控件(针对用户自定义Tab)

    前面我们实现了向用户自定义的Tab中添加新的Group,并向其中创建了两个Button按钮.这里我们看看如何向这个已经创建好的Group中再另外添加新的Button控件(当然,你可以添加其它控件,实现 ...

  8. Android 驱动(17)---如何在linux中添加新的kernel module

    如何在linux中添加新的kernel module 该SOP针对客户如何添加一个kernel module,并把生成的.ko打包进system.img的过程. 解决方案 L版本(version> ...

  9. Android内核开发:在源码树中添加新的app应用

    本文是<Android内核开发>系列的第十二篇文章,上一篇文章介绍了如何从源码中删除出厂的app应用,本文则在此基础上,详细介绍一下如何在Android内核源码树中添加一个新的app应用. ...

  10. Java向word表格中添加新行并赋值

    前言: 相信大家都有过操作word文档表格的经历,对于每行数据的记录与操作是比较方便的.但这是不够的,对于一些OA项目,则需要在线打开word文档并通过后台的设置将数据添加到word表格中,甚至对表格 ...

最新文章

  1. jQuery中的$.getJSON
  2. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
  3. 用python定义一个员工类_Python:定义一个只有整数定义的类
  4. 2019 amazingdotnet 公众号回顾
  5. LeetCode 638. 大礼包(无限背包DP)
  6. Python基础===使用virtualenv创建一个新的运行环境
  7. mac 下 hadoop、spark 的安装及配置
  8. NAT,PAT、OSPF的相关配置
  9. 复杂json解析(json里面嵌套json)
  10. Linux线程优先级
  11. speedoffice(Excel)表格的外框线怎么设置?
  12. TSRC挑战赛:WAF之SQL注入绕过挑战实录
  13. 怎么做三维设计模型轻量化
  14. linux环境下mysql主从数据库配置(maser-slave-replication)
  15. DoTween的使用与详解
  16. Latent semantic analysis (LSA)
  17. 我奋斗了18年才和你坐在一起喝咖啡 原作者:麦子
  18. 远程服务器 一闪就没有了,远程桌面连接一闪而过的解决方法
  19. castle典范英语 storm_典范英语6的第一、二、三、四、五、六、七本翻译。写的好的分绝对多!!...
  20. Java面向对象知识详解——三大基本特征

热门文章

  1. U盘数据损坏了不要慌,这两种方法可以轻松找回数据
  2. eclipse导入系统签名
  3. 计算机格式化为ntfs,WinXP下怎么把U盘格式化成NTFS格式?XP下把U盘格式化成NTFS格式图文教程...
  4. 最好的聊天机器人平台,以建立一个聊天机器人
  5. XSS靶场(haozi.me)
  6. hdoj 1163 Eddy's digital Roots(数学问题,继续分析) .
  7. 小程序京东首页底部导航栏代码
  8. 奇点云 x 阿里云 | 联合发布综合体数字化转型与数据创新解决方案
  9. apk文件以及打包流程
  10. 如何保障企业业务流程的落地实施?