> 插件接口类位置与文件名参考 设计接口与注册接口,类名为接口标识
* 插件接口类的方法调用成功都应返回true
* 插件接口类的方法调用失败应`throw new PaymentPluginException`
* 插件接口类应继承payment_plugin类
* 插件接口类可直接调用csu_base插件的sql与csubase类
#### payment_plugin类
```
<?php
if (!defined('IN_DISCUZ')) {
exit('Access Denied');
}
class payment_plugin {
public function __construct($order_id = '') {
//获取订单
$this->order = C::m('#payment#payment')->load_order($order_id, $order, true);
$this->order_id = $this->order['order_id'];
if ($this->order['is_refund']) {
//退款订单获取主订单
$this->main_order_id = substr($this->order['subject'], 0, 20);
$this->main_order = C::m('#payment#payment')->load_order($this->main_order_id);
}
}
/**
* 退款时调用此方法可禁止单笔订单多次退款
*/
public function disable_multi_refund() {
if ($this->main_order['amount'] != $this->order['amount']) {
throw new PaymentPluginException(lang('plugin/payment', 'order_refund_mustall'), 800);
}
}
}
?>
```
#### 插件接口类必须包含的方法
* __construct构造方法,构造方法会传入order_id
* success支付成功方法
* refund退款方法,若不支持退款可直接`throw new PaymentPluginException('该插件不支持退款',$code)`,由于2.0支持单笔订单多次退款,所以需要对订单金额进行校验。若不想支持多次退款,可在校验订单不一致后抛出异常
#### 插件接口类可选包含的方法
* cancel取消订单方法,可在此做释放订单库存等操作
* expire订单超时取消方法,可在此做释放订单库存等操作
#### 插件接口类demo
可参考payment插件下的payment_test.class.php
```
<?php
if (!defined('IN_DISCUZ')) {
exit('Access Denied');
}
if (!class_exists('payment_plugin')) {
include_once DISCUZ_ROOT . './source/plugin/payment/payment_plugin.class.php';
}
/**
* 由于插件接口类是被动被调用的,所以在此处可以直接使用csu_base插件的sql类与csubase类,以及本插件的payment类
* 插件接口必须包含success与refund方法,可包含cancel方法(订单取消回调)与expire方法(订单超时回调),可在此做释放订单之类操作
* 插件接口方法调用失败请勿返回false,请throw new PaymentPluginException(string $msg,int $code,array $extra=[])
* 插件接口方法调用成功请返回true
*/
class payment_test extends payment_plugin {
public function __construct($order_id = '') {
parent::__construct($order_id);
}
public function success() {
//将false设置为true可演示调用success失败
if (false) {
throw new PaymentPluginException('payment_success_fail_demo', 233333, ['url' => 'abc']);
/**
* 返回的error数组格式如下
* [
* 'msg'=>'payment_success_fail_demo',
* 'code'=>'233333',
* 'url'=>'abc'
* ]
**/
}
//支付后的回调
$content = [
$this->order['subject'],
lang('plugin/payment', 'order_id') . ':' . $this->order['order_id'],
lang('plugin/payment', 'amount') . ':' . payment::amount($this->order['amount']),
lang('plugin/payment', 'method_id') . ':' . payment::method_title($this->order['method_id']),
lang('plugin/payment', 'status') . ':' . payment::status_color($this->order['status']),
lang('plugin/payment', 'plugin_status') . ':' . lang('plugin/payment', 'plugin_status_' . $this->order['plugin_status']),
];
csubase::system_notice($this->order['uid'], lang('plugin/payment', 'pay_success'), implode('<br>', $content));
return true;
}
public function refund() {
//将false设置为true可演示调用refund失败,此时传入的order为主订单的退款订单,要获取主订单号可查看payment_plugin类,可通过调用disable_multi_refund禁止单笔订单多次退款
//$this->disable_multi_refund();
if (false) {
throw new PaymentPluginException('method_refund_fail_demo', 233333, ['url' => 'abc']);
/**
* 返回的error数组格式如下
* [
* 'msg'=>'method_refund_fail_demo',
* 'code'=>'233333',
* 'url'=>'abc'
* ]
**/
//退款后的回调
}
$content = [
$this->order['subject'],
lang('plugin/payment', 'out_refund_id') . ':' . $this->order['order_id'],
lang('plugin/payment', 'refund_amount') . ':' . payment::amount($this->order['amount']),
lang('plugin/payment', 'status') . ':' . payment::status_color($this->order['status']),
lang('plugin/payment', 'plugin_status') . ':' . lang('plugin/payment', 'plugin_status_' . $this->order['plugin_status']),
];
csubase::system_notice($this->order['uid'], lang('plugin/payment', 'refund_success'), implode('<br>', $content));
return true;
}
public function cancel() {
//将false设置为true可演示调用success失败
if (false) {
throw new PaymentPluginException('payment_cancel_fail_demo', 233333, ['url' => 'abc']);
/**
* 返回的error数组格式如下
* [
* 'msg'=>'payment_cancel_fail_demo',
* 'code'=>'233333',
* 'url'=>'abc'
* ]
**/
}
//取消订单后的回调
$content = [
$this->order['subject'],
lang('plugin/payment', 'order_id') . ':' . $this->order['order_id'],
lang('plugin/payment', 'amount') . ':' . payment::amount($this->order['amount']),
lang('plugin/payment', 'method_id') . ':' . payment::method_title($this->order['method_id']),
lang('plugin/payment', 'status') . ':' . payment::status_color($this->order['status']),
lang('plugin/payment', 'plugin_status') . ':' . lang('plugin/payment', 'plugin_status_' . $this->order['plugin_status']),
];
csubase::system_notice($this->order['uid'], lang('plugin/payment', 'cancel_success'), implode('<br>', $content));
return true;
}
public function expire() {
//将false设置为true可演示调用success失败
if (false) {
throw new PaymentPluginException('payment_expire_fail_demo', 233333, ['url' => 'abc']);
/**
* 返回的error数组格式如下
* [
* 'msg'=>'payment_expire_fail_demo',
* 'code'=>'233333',
* 'url'=>'abc'
* ]
**/
}
//取消订单后的回调
$content = [
$this->order['subject'],
lang('plugin/payment', 'order_id') . ':' . $this->order['order_id'],
lang('plugin/payment', 'amount') . ':' . payment::amount($this->order['amount']),
lang('plugin/payment', 'method_id') . ':' . payment::method_title($this->order['method_id']),
lang('plugin/payment', 'status') . ':' . payment::status_color($this->order['status']),
lang('plugin/payment', 'plugin_status') . ':' . lang('plugin/payment', 'plugin_status_' . $this->order['plugin_status']),
];
csubase::system_notice($this->order['uid'], lang('plugin/payment', 'expire_success'), implode('<br>', $content));
return true;
}
}
?>
```
- 团队说明
- 通用支付接口
- 支付接口申请方式
- 微信支付
- QQ钱包
- 积分支付
- 支付宝
- 开发模式与规范
- 插件接口
- 设计接口与注册接口
- 创建订单
- 订单退款
- 插件接口类
- 支付接口
- 目录结构
- 设计接口
- 编辑设置项
- 异常类
- 日志
- 数据字典
- 1.0
- 支付接口接入
- 插件接口接入
- 数据字典
- 支付接口表payment
- 插件接口表payment_api
- 订单表payment_pay
- 支付流程
- 担保中介交易系统
- 交易流程
- 交易参与者联系资料
- 多平台机器人
- 组件设置
- 日志
- 常见问题
- 【QQ机器人】CQHTTP
- 安装流程
- 常见错误
- 开发文档
- 开发模式
- 组件
- 内部组件
- 外部组件
- 机器人
- 插件调用机器人接口
- 威客任务
- 启用版块
- 担保中介交易
- 珊瑚发帖文本内容安全云校验
- 珊瑚图片内容安全云校验
- 实名认证支付宝
- 支付宝应用申请-公钥
- 支付宝应用申请-公钥证书