> 本文档以开发支付宝接口为例,为大家演示支付接口开发方式
## 第零步、支付接口目录结构
```
config.json 接口信息
core.php 接口支付核心代码
index.htm 防止目录暴露
logo.png 接口logo
setting.json 接口设置项文件(可不存在)
```
以上仅为最基本的支付接口所需文件,可按照业务规则自行增加
## 第一步、开启开发模式
如何开启开发模式在上一节已经介绍过,故不在此多做解释
## 第二步、新建支付接口
### 1.点击支付接口-设计新的支付接口
![](https://img.kancloud.cn/84/6e/846e4875ede48509582ab5e41ca85ff3_515x255.png)
### 2.填写支付接口基本信息
![](https://img.kancloud.cn/1d/b1/1db1e04e2ae4e4b82b52fb42ce053a05_422x844.png)
1. 其中标识唯一,填写后不能修改,对应的目录为source/plugin/payment/api/标识/
2. *~~接口申请地址~~已废除,请使用自定义链接*
3. 勾选是否包含“安装脚本/卸载脚本”后,在安装或卸载的时候回调用支付接口目录下的install.php/uninstall.php文件,并且在文件的结尾需要写入`$finish=true;`标记脚本运行结束,类似discuz插件的安装和卸载文件
4. HTTP_USER_AGENT**只对手机版和触屏版生效**。若不填写,则在任意浏览器下显示;若填写,当插件匹配到对应的支付接口后,会隐藏其余有HTTP_USER_AGENT的支付接口。如:支付宝为alipay,QQ钱包为qq/,积分支付为空,则在支付宝内只显示支付宝和积分支付,在QQ内只显示QQ钱包和积分支付,在其他浏览器中显示所有支付方式。
5. 提交后会在source/plugin/payment/api/文件夹下创建对应的以标识为文件夹名称的文件夹,并包含三个文件
```
config.json-配置文件(请勿手动修改)
core.php-核心类文件
index.htm-防止目录暴露文件
```
## 第三步、安装API
新建的支付接口默认不会安装,需要点击安装才可
![](images/screenshot_1581952944781.png)
## 第三步、编辑设置项
![](images/screenshot_1581952288869.png)
设置项的内容会在支付接口的操作-设置中显示,设置中的设置项由开发人员设计,由站长填写对应的设置项内容,编辑后会在API文件夹中生成setting.json文件
如下图所示,为编辑设置项的界面
![](https://img.kancloud.cn/b6/46/b64640575037a75366f46ee95f89d692_1195x249.png)
如下图所示,为对应的设置界面,其中`前台显示名称`和`前台显示顺序`为固定设置项,无需在设置项中编辑
![](https://img.kancloud.cn/ed/b7/edb7995418a3ef9ff3d62d8435fa2f7d_691x672.png)
## 第四步、编辑支付接口下的core.php
core.php为支付接口核心类文件,类名为payment_接口标识,需要包含构造函数、PC支付page、手机支付wap、退款refund、*强制校验支付状态checkpay*五个方法,*调用方法失败请throw*
### 0.PaymenBase类
支付接口核心类(core.php)需继承payment_base类,以下介绍该类2.0新方法
#### 0.0强制校验支付状态checkpay
该方法直接抛异常,需在子类中实现。当支付未完成时,也可被子类checkpay方法通过`parent::checkpay();`调用
#### 0.1支付成功success
该方法为payment::success方法在支付接口中的实现,省去了out_trade_no、payment_id两个参数,可在子类或异步方法中调用
#### 0.2支付接口语言包lang
2.0新增支付接口语言包,为在支付接口文件夹下的lang.php或lang.currentlang().php
### *1.PaymentMethodException异常处理*
*core.php中的基础方法运行失败时请勿返回false,而是`throw new PaymentMethodException($msg,$code,$extra)`*
### 2.构造函数
构造函数传入订单号或者订单,父类order方法会对传入类型进行判断
```
public function __construct($order_id = '') {
/**
$this->payment_id = 'credit';
parent::__construct();
if ($order_id) {
parent::order($order_id);
}
以上为1.0写法,以下为2.0写法
**/
$this->payment_id = 'credit';
$this->order_id = $order_id;
parent::__construct();
}
```
### 3.PC支付page
page方法需要返回一个数组,调用成功返回数组结构如下
~~code为状态码,为SUCCESS时代表调用成功;~~
| 键名 | 解释 | 必填 | 实例值 |
| --- | --- | --- |--- |
| paycheck | 是否允许前台调用paycheck方法,若为true,则会出现如下按钮![](https://img.kancloud.cn/f5/67/f567727feef93346ca15bf3819aab8e8_100x33.png) | 否 | true |
| eval | 前端js通过eval函数运行的代码 | 否 | alert('123'); |
| msg | 前端默认区域出现的界面,如二维码、表单项等 | 否 | `<img src="plugin.php?id=payment:pay&qrcode=true&formhash">`|
### 4.手机支付wap
手机支付可返回html代码或直接重定向等任意操作。
若return代码,会显示在支付方式之后(如下图所示)
![](https://img.kancloud.cn/96/56/96568120973823478cb3bb4c937368cf_460x447.png)
若重定向到付款页面,可直接`dheader('location:XXX');`,由于dheader包含location时会在结尾exit,因此不需要在dheader后再exit;其他场景下可通过在代码尾部加入exit阻止后面的代码运行
### 5.退款refund
传入的为discuz内的退款订单号,非订单号
需要返回一个数组。
~~~~code为状态码,为SUCCESS时代表调用成功;~~~~
~~msg为错误原因;~~
调用成功时必须返回refund_time退款时间的时间戳,可选返回refund_id支付平台退款单号
#### 调用成功返回
```
return ['refund_id' => '支付平台退款单号,可为空', 'refund_time' => '退款时间'];
```
### 6.强制校验支付状态checkpay
支付接口主动查询支付订单状态以此返回订单状态,订单已完成支付返回数组结构如下
| 键名 | 解释 | 必填 | 实例值 |
| --- | --- | --- |--- |
| finish_user | 支付平台支付人ID | 否 | 2000000 |
| finish_time | 支付时间戳,若为空则为当前时间 | 否 | 190000000 |
| finish_id | 支付平台交易号 | 否 | 210000000121212 |
常规业务逻辑下未完成支付可直接`parent::checkpay()`
### 7.异步通知(视业务逻辑开发)
demo可参考支付宝、QQ钱包、微信支付的核心库
## 第六步、生成测试订单
访问测试订单页面
![](https://img.kancloud.cn/f9/9d/f99d17271aec493f0dd7dba2899fcb64_509x568.png)
- 团队说明
- 通用支付接口
- 支付接口申请方式
- 微信支付
- QQ钱包
- 积分支付
- 支付宝
- 开发模式与规范
- 插件接口
- 设计接口与注册接口
- 创建订单
- 订单退款
- 插件接口类
- 支付接口
- 目录结构
- 设计接口
- 编辑设置项
- 异常类
- 日志
- 数据字典
- 1.0
- 支付接口接入
- 插件接口接入
- 数据字典
- 支付接口表payment
- 插件接口表payment_api
- 订单表payment_pay
- 支付流程
- 担保中介交易系统
- 交易流程
- 交易参与者联系资料
- 多平台机器人
- 组件设置
- 日志
- 常见问题
- 【QQ机器人】CQHTTP
- 安装流程
- 常见错误
- 开发文档
- 开发模式
- 组件
- 内部组件
- 外部组件
- 机器人
- 插件调用机器人接口
- 威客任务
- 启用版块
- 担保中介交易
- 珊瑚发帖文本内容安全云校验
- 珊瑚图片内容安全云校验
- 实名认证支付宝
- 支付宝应用申请-公钥
- 支付宝应用申请-公钥证书