智简魔方文档

如何开发自己的支付接口

本文整理智简魔方财务系统中“如何开发自己的支付接口”相关的配置、操作或问题处理内容,供管理员和运维人员按原文步骤查阅与执行。

一、开发流程

  1. 在 modules/gateways 目录里添加这个网关目录(如 demo)

  2. 创建入口文件

  3. 确定是否要后台配置文件,如果需要在网关根目录加上 config.php,格式查看下方“配置文件”

  4. 如需外部访问,请加 controller 目录,再添加 Controller 文件

  5. 到后台插件管理刷新界面就会看到你新添加的插件

二、创建目录

网关目录在程序的以下目录:

/modules/gateways

目录名应使用小写字母和下划线,并且必须以字母开头。例如:

/modules/gateways/demo/

三、创建入口文件

文件名应为目录名的大驼峰形式加 Plugin.php,并创建在网关目录下。例如:

demo/DemoPlugin.php

info 属性

在网关入口文件定义以下类属性,用于配置网关的基本信息:

info

发起支付

支付参数

网关的支付方法会以数组的形式接受支付参数

$param['product_name'] // 产品名
$param['out_trade_no'] // 订单编号
$param['total_fee'] // 金额

响应参数

发起支付需要统一以数组的形式返回

<?php
return [
    'type' => $type,
    'data' => $data,
];

财务系统目前支持以下支付请求形式。

  1. URL 模式
type=url

data 值为用于转换二维码的 URL 地址,由系统自动转换。

  1. 二维码嵌入模式
type=insert

data 值为第三方支付系统提供的二维码地址,由系统嵌入该二维码。

  1. 跳转模式
type=jump

data 值为需要跳转到第三方的支付链接。

  1. HTML 表单模式
type=html

data 值为需要提交的 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');