插件文件说明
支付插件目录:/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\ProfitSharingLogicalipay_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规范。