业务系统开发文档>支付接口开发
f\|--- controller (外部调用)|--- config|--- config.php(支付宝接口配置项,【回调地址,编码格式,签名方式,支付宝网关】)|--- AliPayDmf.php (入口文件)|--- config.php (配置项客户配置项,在插件设置中显示)|--- AliPayDmf.png (支付界面上要显示的图片) 三、开发流程以支付宝当面付为例:1、创建支付宝当面付目录\public\plugins\gateway\ali_pay_dmf\;①目录名以小写字母+下划线形式,必须以字母开头,如ali_pay_dmf; 2、创建入口文件: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:临时订单号;client.id:客户ID;client.username:客户姓名;client.company:公司;client.address:地址;client.country:国家;client.phone_code国家区号;client.phone:电话;client.email:邮件;product:商品数组;global.website_name网站名称;global.website_url:网站地址;finance.id:订单号;finance.total:订单金额;finance.tmp_order_id规则1的临时订单号;finance.tmp_order_id2规则2的临时订单号;finance.tmp_order_id3规则3的临时订单号;⑦入口方法(发起支付)返回html即可,系统会将html渲染至支付输出页面;⑧(新增,10.4.3版本后可用)可选方法,发起退款:目录名大驼峰+HandleRefund;如public function AliPayDmfHandleRefund($param),参数param(此参数为数组,示例json方便显示):{"transaction_number":"202412346234234","amount":0.01,"out_request_no":"2024234425","total_fee":0.01,}参数说明:transaction_number订单交易流水号,amount退款金额,out_request_no退款请求号,标识一次退款请求,需要保证在交易号下唯一,如需部分退款,则此参数必传,total_fee总金额;方法返回:成功:{"status":200,"msg":"","data":{"trade_no":"2348729483"}}trade_no为交易流水号失败:{"status":400,"msg":"失败原因"} 3、确定是否需要后台配置文件,如果需要,在支付接口根目录下加上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' => 'text', '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表示禁止编辑,只能看; ],]; 4、需要外部访问,在根目录下创建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’, // 支付接口标识]; 5、到后台支付接口管理界面刷新就会看到新添加的支付接口,安装、配置即可使用。6、(新增,10.4.3版本后可用)对于同步回调的跳转地址,可以通过订单ID调用系统方法获取:get_gateway_return_url($tmp_order_id) 四、示例参考支付宝当面付ali_pay_dmf 五、常见问题1、url链接嵌入html被转义问题返回html时:$html = "<a id='ali_pay_h5' href='$url' target='_blank'>去支付</a> <script> document.getElementById('ali_pay_h5').click() </script>";return $html;如果遇到url链接为:https://payment.com/dci/payment/pay/visacard?amount=10&captureDelay=0¤cy=SGD&merchant_id=Guest&merchant_name=Mobile+Commerce&merchant_order=1708996332599¬_use_ui=0¬ify_url=https%3A%2F%2Fwww.rvers.com其中¬嵌入html中会被转义为¬这个符号,其他转义符号自行查阅;可以通过urlencode编码解决,修改后的html代码如下:$urlss= urlencode($response_data->qr_code_url);$html = "<a id='ali_pay_h5' href='$url' target='_blank'>去支付</a> <script> const btn =document.getElementById('ali_pay_h5') btn.onclick=()=>{ window.open(decodeURIComponent(btn.getAttribute('href')) ) } btn.click() </script>";return $html; 2、如何兼容iPad默认跳转$urlss= urlencode($response_data->qr_code_url);$html = "<a id='mct' href1='$urlss' target='_blank' >去支付</a> <script> const btn =document.getElementById('mct') const url = btn.getAttribute('href1') btn.setAttribute('href',decodeURIComponent(url)); // 创建一个点击事件 const clickEvent = new MouseEvent('click', { 'view': window, 'bubbles': true, 'cancelable': true }); // 设置 target 为 '_blank',在新标签页中打开链接 Object.defineProperty(clickEvent, 'target', { value: '_blank', writable: false, enumerable: true, configurable: true }); // 触发点击事件 btn.dispatchEvent(clickEvent); </script>";return $html;