多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> 本文档以开发支付宝接口为例,为大家演示支付接口开发方式 ## 第零步、支付接口目录结构 ``` 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)