如何开发自己的支付接口
本文整理智简魔方财务系统中“如何开发自己的支付接口”相关的配置、操作或问题处理内容,供管理员和运维人员按原文步骤查阅与执行。
一、开发流程
-
在 modules/gateways 目录里添加这个网关目录(如 demo)
-
创建入口文件
-
确定是否要后台配置文件,如果需要在网关根目录加上 config.php,格式查看下方“配置文件”
-
如需外部访问,请加 controller 目录,再添加 Controller 文件
-
到后台插件管理刷新界面就会看到你新添加的插件
二、创建目录
网关目录在程序的以下目录:
/modules/gateways目录名应使用小写字母和下划线,并且必须以字母开头。例如:
/modules/gateways/demo/三、创建入口文件
文件名应为目录名的大驼峰形式加 Plugin.php,并创建在网关目录下。例如:
demo/DemoPlugin.phpinfo 属性
在网关入口文件定义以下类属性,用于配置网关的基本信息:
info发起支付
支付参数
网关的支付方法会以数组的形式接受支付参数
$param['product_name'] // 产品名
$param['out_trade_no'] // 订单编号
$param['total_fee'] // 金额响应参数
发起支付需要统一以数组的形式返回
<?php
return [
'type' => $type,
'data' => $data,
];财务系统目前支持以下支付请求形式。
- URL 模式
type=urldata 值为用于转换二维码的 URL 地址,由系统自动转换。
- 二维码嵌入模式
type=insertdata 值为第三方支付系统提供的二维码地址,由系统嵌入该二维码。
- 跳转模式
type=jumpdata 值为需要跳转到第三方的支付链接。
- HTML 表单模式
type=htmldata 值为需要提交的 HTML 表单。
配置文件
在你的网关根目录下加上 config.php 即可定义配置
<?php
return [
'custom_config' => [ // 自定义插件配置开关,后台表单键名为 config[custom_config]
'title' => '自定义配置处理', // 表单的 label 标题
'type' => 'text', // 支持 text、password、textarea、checkbox、radio、select 等
'value' => '0', // 值为 1 时由插件自行处理配置,入口为 AdminIndex/setting
'tip' => '自定义配置处理',
],
'text' => [ // 后台表单键名为 config[text]
'title' => '999 文本',
'type' => 'text',
'value' => 'hello,ThinkCMF!',
'tip' => '这是文本组件的演示',
],
'password' => [ // 后台表单键名为 config[password]
'title' => '密码',
'type' => 'password',
'value' => '',
'tip' => '这是密码组件',
],
'number' => [
'title' => '数字',
'type' => 'number',
'value' => '1.0',
'tip' => '这是数字组件的演示',
],
'select' => [ // 后台表单键名为 config[select]
'title' => '下拉列表',
'type' => 'select',
'options' => [ // select、radio 和 checkbox 的子选项
'1' => 'ThinkCMFX',
'2' => 'ThinkCMF',
'3' => '跟猫玩糗事',
'4' => '门户应用',
],
'value' => '1',
'tip' => '这是下拉列表组件',
],
'checkbox' => [
'title' => '多选框',
'type' => 'checkbox',
'options' => [
'1' => 'genmaowan.com',
'2' => 'www.thinkcmf.com',
],
'value' => 1,
'tip' => '这是多选框组件',
],
'radio' => [
'title' => '单选框',
'type' => 'radio',
'options' => [
'1' => 'ThinkCMFX',
'2' => 'ThinkCMF',
],
'value' => '1',
'tip' => '这是单选框组件',
],
'radio2' => [
'title' => '单选框 2',
'type' => 'radio',
'options' => [
'1' => 'ThinkCMFX',
'2' => 'ThinkCMF',
],
'value' => '1',
'tip' => '这是单选框组件 2',
],
'textarea' => [
'title' => '多行文本',
'type' => 'textarea',
'value' => '这里是你要填写的内容',
'tip' => '这是多行文本组件',
],
'date' => [
'title' => '日期',
'type' => 'date',
'value' => '2017-05-20',
'tip' => '这是日期组件的演示',
],
'datetime' => [
'title' => '时间',
'type' => 'datetime',
'value' => '2017-05-20',
'tip' => '这是时间组件的演示',
],
'color' => [
'title' => '颜色',
'type' => 'color',
'value' => '#103633',
'tip' => '这是颜色组件的演示',
],
'image' => [
'title' => '图片',
'type' => 'image',
'value' => '',
'tip' => '这是图片组件的演示',
],
'file' => [
'title' => '文件',
'type' => 'file',
'value' => '',
'tip' => '这是文件组件的演示',
],
'location' => [
'title' => '地理坐标',
'type' => 'location',
'value' => '',
'tip' => '这是地理坐标组件的演示',
],
];回调文件
异步回调
异步回调统一放在网关根目录下的以下文件中:
controller/IndexController.php由以下方法处理:
notifyHandle也可以在 controller 中自定义回调方法,回调地址格式为:
完整域名/gateway/payssion/index/notifyHandle方法中可以处理相关验证,然后调用系统函数并传入数组参数:
$data['invoice_id'] // 订单 ID
$data['payment'] // 支付方式
$data['paid_time'] // 支付时间
$data['trans_id'] // 第三方交易 ID
$data['total_fee'] // 金额
$data['currency'] // 货币
check_pay($data) // 调用系统函数进行验证及后续支付处理IndexController.php 示例:
<?php
namespace gateways\wx_pay\controller;
use think\Controller;
class IndexController extends Controller
{
public function notifyHandle()
{
$data['invoice_id'] = $_POST['invoice_id'];
$data['payment'] = $_POST['payment'];
$data['paid_time'] = $_POST['paid_time'];
$data['trans_id'] = $_POST['trans_id'];
$data['total_fee'] = $_POST['total_fee'];
$data['currency'] = $_POST['currency'];
check_pay($data);
}
}回调账单处理
支付回调之后的账单处理如下,注意需要引入 OrderController:
use app\home\controller\OrderController;
$data = array(
'invoice_id' => $order_id, // 订单号
'trans_id' => $_POST['transaction_id'], // 交易流水号
'currency' => $currency, // 货币的 3 个字母 ISO 代码,例如 USD、CNY
'payment' => 'Payssion', // 当前支付网关名称
'amount_in' => $amount, // 支付金额,单位为元
'paid_time' => time(), // 支付时间
);
$Order = new OrderController();
$Order->orderPayHandle($data, 'wx_pay');