插件文件说明
支付插件目录:/plugins/payment/{插件名}/,插件英文名与目录名一致(如 alipay),主类文件:{Name}Plugin.php(首字母大写,如 AlipayPlugin.php)。
插件元数据文件info.json,里面定义了插件标识、名称、支付方式、配置等信息。
插件元数据说明
{
"name": "baofu", //插件标识,必须和插件目录名称一致
"title": "宝付支付", //插件名称
"author": "官方", //插件作者,可空
"link": "https://www.baofu.com/", //插件链接,可空
"version": "1.0", //插件版本号
"icon": "baofu.png", //插件小图标,可为http开头的url,可空
"desc": "", //插件简介,可空
"pay_types": ["alipay","wxpay","bank"], //插件包含的支付方式
"trans_types": ["bank"], //插件包含的转账方式,可空
"inputs": { //插件密钥配置的输入框,支持input、textarea、select、radio、upload输入框类型
"appid": {
"name": "商户号",
"type": "input",
"required": true,
"note": ""
},
"appurl": {
"name": "终端号",
"type": "input",
"required": true,
"note": ""
},
"pfx_cert_path": {
"name": "商户私钥证书",
"type": "upload",
"accept": ".pfx",
"required": true,
"note": ".pfx格式证书"
},
"appkey": {
"name": "商户私钥证书密码",
"type": "input",
"required": true,
"note": ""
}
},
"select": null, //选择可用的支付方式,可空
"note": "", //配置密钥页面说明,可空
"bindwxmp": true, //是否允许绑定微信公众号
"bindwxa": true //是否允许绑定微信小程序
}
插件代码开发说明
-
插件主类继承自
app\common\BasePayment,父类有支付通道密钥变量$channel,可在插件内直接使用。 -
public的方法可以直接通过地址栏访问,所有需要访问的插件方法都只有1个支付上下文入参
PaymentContext $ctx,访问规则如下:http://你的域名/pay/方法名称/订单号/跳转支付接口的入口方法是submit,API接口支付的入口方法是mapi,这2个方法名称是系统固定的,submit方法不能没有,mapi方法可以没有。
剩余的方法可以自行实现具体的支付、回调等页面。
-
支付上下文
app\common\PaymentContext,属性有order、ordername、method、isMobile、mdevice -
退款、查单接口只有一个订单信息入参$order
-
上传的证书,需要使用
getCertFilePath方法获取证书文件路径。
插件方法返回值说明
返回值格式:
| 返回类型 | 返回代码 |
|---|---|
| 跳转到url | ['type'=>'jump','url'=>'跳转到的链接'] |
| 显示html代码 | ['type'=>'html','data'=>'HTML代码'] |
| 显示json字符串 | ['type'=>'json','data'=>{JSON数组}] |
| 显示指定页面 | ['type'=>'page','page'=>'页面文件名称','data'=>{变量数组}] |
| 显示扫码页面 | ['type'=>'qrcode','page'=>'页面文件名称','url'=>'二维码链接'] |
| 显示小程序跳转页面 | ['type'=>'scheme','page'=>'页面文件名称','url'=>'小程序跳转链接'] |
| 显示JSAPI支付参数 | ['type'=>'jsapi','data'=>{JSAPI支付参数}] |
| 显示APP支付参数 | ['type'=>'app','data'=>{APP支付参数}] |
| 返回错误提示 | ['type'=>'error','msg'=>'提示内容'] |
注:以上的“页面文件名称”,均为/public/template/pay/default/目录下的文件名,不包含后缀名。
旧版支付插件迁移说明
(可将下面的内容复制到md文件,放到项目根目录下,然后让AI Agent根据说明完成迁移)
- 新版支付插件目录:
plugins/payment/{插件名}/,插件英文名与目录名一致(如alipay),主类文件:{Name}Plugin.php(首字母大写,如AlipayPlugin.php)。 - 旧版插件的元信息
public static $info移动到插件同目录下info.json,根据note说明判断若有需要手动上传的证书文件,全部改到inputs下的upload类型的字段,代码中使用getCertFilePath方法获取证书文件路径。 - 插件主类继承自
app\common\BasePayment - 插件父类BasePayment构造方法已经传入支付插件密钥参数
$channel。若插件内有require(PAY_ROOT.'inc/config.php')代码,改为在构造方法中根据$channel生成本插件所需配置数组(如$this->alipayConfig) - 禁止require或include其他文件,全部采用命名空间的方式引入其他类。
- 插件方法全部改用非静态方法。
- 支付、回调、应用网关等方法的入参为支付上下文
app\common\PaymentContext,属性有order、ordername、method、isMobile、mdevice。插件方法内禁止使用global获取全局变量,改为从支付上下文获取;订单号常量TRADE_NO改成支付上下文中的$ctx->order['trade_no'];$conf变量改成用系统方法config_get()获取;$siteurl变量改成request()->siteurl;$clientip变量改成request()->clientip;$submit2变量改成defined('SUMBIT2') - 插件中判断浏览器UA的代码统一修改,
checkmobile()改成$ctx->isMobile,checkwechat()改成$ctx->mdevice==='wechat',checkalipay()改成$ctx->mdevice==='alipay',checkmobbileqq()改成$ctx->mdevice==='qq',checkunionpay()改成$ctx->mdevice==='unionpay',checkdouyin()改成$ctx->mdevice==='douyin' - 退款、关闭订单方法的入参和原先一样,方法内删除
if(empty($order))exit();判断代码。 - 转账方法的入参删除
channel,方法内删除if(empty($channel) || empty($bizParam))exit();判断代码 - processNotify、processReturn、processTransfer、processProfitSharing改成调用父类的同名方法,
processReturn方法调用前面加上return返回 - 原先调用\lib\Payment的lockPayData、updateOrder、updateOrderExt、updateOrderCombine、getSubOrders、processSubOrders、refundSubOrder、updateSubOrderSettle全部改成调用父类的同名方法
- ok方法删除
- 插件内用exit输出json的代码,改成
return ['type' => 'json', 'data' =>原json数组] - 插件方法代码内,命名空间
\lib\替换成\app\lib,\lib\ProfitSharing\CommUtil替换成\app\logic\ProfitSharingLogic - alipay_oauth、wechat_applet_oauth、alipay_mini_oauth公共方法均增加了第1个入参trade_no;alipaymini_jump_scheme、wxminipay_jump_path第1个参数改成了order数组;wxminipay_jump_scheme第2个参数改成了order数组
- 禁止直接使用
$_GET、$_POST,统一使用ThinkPHP的request方法:request()->get('参数名')或request()->get('参数名', '默认值')request()->post('参数名')或request()->post('参数名', '默认值')request()->get()或request()->post()用于获取GET或POST数组
- 禁止直接使用
$_SESSION,使用ThinkPHP的session方法:- 读取:
session('key') - 写入:
session('key', $value) - 判断存在:
session('?key')
- 读取:
- 涉及数据库查询的$DB全局变量,都改成用ThinkPHP的查询构造器
- 新版插件代码需符合PHP8规范。




























暂无评论内容