<?php
// +----------------------------------------------------------------------
// | onezan-admin 快速开发的管理平台
// +----------------------------------------------------------------------
// | 官方网址：https://www.onezan.cn
// +----------------------------------------------------------------------
// | onezan团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: 543885307@qq.com
// +----------------------------------------------------------------------
namespace app\service\domain\pay\gateway;

use think\Request;


/**
 * Payment Gateway Interface
 * @package app\service\domain\pay\gateway
 */
interface PaymentGatewayInterface
{
     /**
     * 创建支付订单
     * @param array $payment 支付订单
     * @param array $order 订单信息
     * @param string $terminal 终端
     * @param array $context 上下文
     * @return array
     */
    public function create(array $payment, array $order, string $terminal, array $context): array;


     /**
     * 支付通知
     * @param Request $request 请求
     * @param string $terminal 终端
     * @return array
     */
    public function notify(Request $request, string $terminal): array;


     /**
     * 退款订单
     * @param array $refund 退款订单
     * @param array $payment 支付订单
     * @return array
     */
    public function refund(array $refund, array $payment): array;


     /**
     * 退款通知
     * @param Request $request 请求
     * @param string $terminal 终端
     * @return array
     */
    public function refundNotify(Request $request, string $terminal): array;


     /**
     * 支付网关提供方
     * @return string
     */
    public function provider(): string;


     /**
     * 支付网关名称
     * @return string
     */
    public function name(): string;


     /**
     * 支付网关是否支持指定终端
     * @param string $terminal 终端
     * @return bool
     */
    public function supportsTerminal(string $terminal): bool;


     /**
     * 支付网关是否可分配
     * @return bool
     */
    public function isAllocatable(): bool;


     /**
     * 支付网关成功响应
     * @return array
     */
    public function successResponse(): array;
}