支付接口开发
位置
支付接口放在 public/plugins/gateway/ 目录下
目录结构
public/plugins/gateway/ali_pay_dmf/
|--- controller (外部调用)
|--- config
|----- config.php(支付宝 SDK 配置文件,位于 config/ 目录)
|--- AliPayDmf.php (入口文件)
|--- config.php (配置项客户配置项,在插件设置中显示)
|--- AliPayDmf.png (支付界面上要显示的图片)开发流程
以支付宝当面付为例:
创建支付宝当面付目录 public/plugins/gateway/ali_pay_dmf/
①目录名以小写字母+下划线形式,必须以字母开头,如ali_pay_dmf;
创建入口文件:AliPayDmf.php
①命名空间namespace gateway\ali_pay_dmf(控制器下命名空间对应相应目录即可,其它同理);
②以目录名大驼峰+.php,创建在支付接口根目录下,如ali_pay_dmf\AliPayDmf.php;
③文件中需要定义info属性,示例:
// 插件基础信息
public $info = array(
'name' => 'AliPayDmf', // 必填 插件标识(唯一)
'title' => '支付宝当面付插件', // 必填 插件显示名称
'description' => '支付宝当面付插件', // 必填 插件功能描述
'author' => 'idcsmart', // 必填 插件作者
'version' => '1.0', // 必填 插件版本
'help_url' => '', // 选填 申请链接
'author_url' => '', // 选填 作者链接
'url' => '', // 选填 图标地址(可以自定义支付图片地址)
);④定义临时订单生成规则,系统默认规则1:
// 临时订单生成规则,1:毫秒时间戳+8位随机数(21-22位长度订单号,默认规则),2:时间戳+8位随机数(18位长度订单号),3:10位随机数(10位长度订单号)
public $orderRule=1;⑤必须实现install()安装以及uninstall()卸载方法
⑥必须实现入口方法,发起支付:目录名大驼峰+Handle;
方法签名:
public function AliPayDmfHandle($param)参数 param 为数组,以下使用 JSON 展示:
{
"out_trade_no": "1660030044500783722161",
"client": {
"id": 62,
"username": "wyh",
"company": "智简魔方",
"address": "示例地址",
"country": "中国",
"phone_code": 86,
"phone": "12345678910",
"email": ""
},
"product": [
"魔方云"
],
"global": {
"website_name": "智简魔方",
"website_url": "https://test.test.com"
},
"finance": {
"id": 1728,
"total": "500.00",
"tmp_order_id": "1660030044500783722161",
"tmp_order_id2": "166003004463630999",
"tmp_order_id3": "5075991847"
}
}参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
out_trade_no | string | — | 临时订单号 |
client.id | integer | — | 客户ID |
client.username | string | — | 客户姓名 |
client.company | string | — | 公司 |
client.address | string | — | 地址 |
client.country | string | — | 国家 |
client.phone_code | string | — | 国家区号 |
client.phone | string | — | 电话 |
client.email | string | — | 邮件 |
product | array | — | 商品数组 |
global.website_name | string | — | 网站名称 |
global.website_url | string | — | 网站地址 |
finance.id | integer | — | 订单号 |
finance.total | number | — | 订单金额 |
finance.tmp_order_id | string | — | 规则1的临时订单号 |
finance.tmp_order_id2 | string | — | 规则2的临时订单号 |
finance.tmp_order_id3 | string | — | 规则3的临时订单号 |
⑦入口方法(发起支付)返回html即可,系统会将html渲染至支付输出页面;
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
返回值 | HTML | 系统将 HTML 渲染至支付输出页面 |
确定是否需要后台配置文件,如果需要,在支付接口根目录下加上config.php,示例
return [
'module_name' => [ # 在后台插件配置表单中的键名(统一规范:小写+下划线),会是config[module_name]
'title' => '名称', # 表单的label标题
'type' => 'text', # 表单的类型:text文本,password密码,checkbox复选框,select下拉,radio单选,textarea文本区域,tip提示
'value' => '支付宝当面付', # 表单的默认值
'tip' => 'friendly name', # 表单的帮助提示
'size' => 200, # 输入框长度(当type类型为text,password,textarea,tip时,可传入此键)
],
'app_id' => [
'title' => 'appID',
'type' => 'text',
'value' => '',
'tip' => '',
'size' => 200,
],
'merchant_private_key' => [
'title' => '商户私钥',
'type' => 'password',
'value' => '',
'tip' => '商户私钥,保存后不应完整回显',
'size' => 200,
],
'alipay_public_key' => [
'title' => '支付宝公钥',
'type' => 'text',
'value' => '',
'tip' => '',
'size' => 200,
],
# 此配置作为范例
'mode' => [
'title' => '模式',
'type' => 'radio',
'options' => [ # 当type类型为checkbox,select,radio时,需要有此键,作为选项
'debug' => '调试',
'online' => '上线',
],
'value' => 'online',
'tip' => '请选择模式',
'attribute' => 'disabled', # 属性,加入此键:disabeld表示禁止编辑,只能看;
],
];需要外部访问,在根目录下创建controller目录,添加控制器,处理异步或同步回调
①创建自定义控制器,如controller/IndexController.php;
②自定义异步回调方法,如 notifyHandle(),则异步回调地址为:
网站地址/gateway/ali_pay_dmf/index/notifyHandle③在②的方法中处理支付回调逻辑,进行订单等的验证;
④支付成功调系统订单处理方法order_pay_handle($param),传入数组参数:
$param = [
'tmp_order_id' => 123456, // 临时订单ID
'amount' => 1.00, // 支付金额
'trans_id' => 22483701327490139472, // 交易流水ID
'currency' => 'CNY', // 货币代码
'paid_time' => '2022-08-09 15:52:19', // 时间,**注意必须是此标准格式**
'gateway' => 'AliPayDmf', // 支付接口标识
];到后台支付接口管理界面刷新就会看到新添加的支付接口,安装、配置即可使用
示例
参考支付宝当面付ali_pay_dmf