易支付插件开发

插件文件说明

支付插件目录:/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->isMobilecheckwechat()改成$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规范。
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容