package com.softwarebr.nunu.service.pay.ali;

import com.alipay.api.response.*;

/**
 * 支付宝支付
 *
 * @author xu
 * @date 2019/10/31 9:59
 */
public interface AliPayService {

    /** 客户端-APP */
    String CLIENT_APP = "APP";

    /** 客户端-小程序 */
    String CLIENT_APPLET = "APPLET";

    /**
     * app验证信息，用于app支付宝登录
     *
     * @return
     */
    String appAuthInfo();

    /**
     * 换取授权访问令牌
     * https://docs.open.alipay.com/api_9/alipay.system.oauth.token
     *
     * @param code
     * @param client {@link #CLIENT_APP}
     */
    AlipaySystemOauthTokenResponse systemOauthToken(String code, String client);

    /**
     * 支付宝会员授权信息查询接口
     * https://docs.open.alipay.com/api_2/alipay.user.info.share
     *
     * @param accessToken
     * @param client      {@link #CLIENT_APP}
     */
    AlipayUserInfoShareResponse userInfoShare(String accessToken, String client);

    /**
     * 线上资金授权冻结
     * https://docs.open.alipay.com/20180417160701241302/vo4kv7/
     * https://docs.open.alipay.com/api_28/alipay.fund.auth.order.app.freeze
     *
     * @param orderTitle    业务订单的简单描述，如商品名称等长，度不超过100个字母或50个汉字
     * @param outOrderNo    商户授权资金订单号 ,不能包含除中文、英文、数字以外的字符，创建后不能修改，需要保证在商户端不重复
     * @param category      授权业务对应的类目，value由支付宝分配，比如充电桩业务传 "CHARGE_PILE_CAR"
     * @param outStoreAlias 外部商户的门店简称
     * @param amount        需要冻结的金额，单位为：分（人民币）
     * @param payTimeout        该笔订单允许的最晚付款时间，逾期将关闭该笔订单，取值范围：1m～15d。m-分钟，h-小时，d-天。 该参数数值不接受小数点， 如 1.5h，可转换为90m，如果为空，默认15m
     * @param client        {@link #CLIENT_APP}
     */
    AlipayFundAuthOrderAppFreezeResponse fundAuthOrderAppFreeze(String orderTitle, String outOrderNo,
                                                                String category, String outStoreAlias,
                                                                Long amount, String payTimeout, String client);

    /**
     * 资金授权解冻接口
     * https://docs.open.alipay.com/api_28/alipay.fund.auth.order.unfreeze
     *
     * @param authNo       支付宝资金授权订单号
     * @param outRequestNo 商户本次资金操作的请求流水号，同一商户每次不同的资金操作请求，商户请求流水号不能重复
     * @param amount       本次操作解冻的金额，单位为：分（人民币）
     * @param remark       商户对本次解冻操作的附言描述，长度不超过100个字母或50个汉字
     */
    AlipayFundAuthOrderUnfreezeResponse fundAuthOrderUnfreeze(String authNo, String outRequestNo, Long amount, String remark, String client);


    /**
     * 资金授权操作查询接口
     * https://docs.open.alipay.com/api_28/alipay.fund.auth.operation.detail.query/
     * @param authNo         支付宝资金授权订单号
     * @param operationId    支付宝的授权资金操作流水号
     */
    AlipayFundAuthOperationDetailQueryResponse fundAuthOperationDetailQuery(String authNo, String operationId, String client);

    /**
     * 资金授权撤销接口
     * @param authNo        支付宝资金授权订单号
     * @param operationId   支付宝的授权资金操作流水号
     * @param remark        商户对本次撤销操作的附言描述，长度不超过100个字母或50个汉字
     */
    AlipayFundAuthOperationCancelResponse fundAuthOperationCancel(String authNo, String operationId, String remark, String client);


    /**
     * 授权转支付
     * https://docs.open.alipay.com/20180417160701241302/qca164/
     *
     * @param outTradeNo     预授权转支付商户订单号，为新的商户交易流水号；如果重试发起扣款，商户订单号不要变；
     * @param authNo         填写预授权冻结交易号
     * @param totalAmount    结算支付金额
     * @param body           可填写备注信息
     * @param subject        解冻转支付标题，用于展示在支付宝账单中
     * @param payerUserId    购买者
     */
    AlipayTradePayResponse fundAuthTurnTradePay(String outTradeNo, String authNo, Long totalAmount,
                                                String body, String subject, String payerUserId, String client);

    /**
     * 统一收单线下交易查询
     * https://docs.open.alipay.com/api_1/alipay.trade.query
     */
    AlipayTradeQueryResponse tradeQuery(String outTradeNo, String client);

    /**
     * 统一收单交易关闭接口
     * https://docs.open.alipay.com/api_1/alipay.trade.close
     *
     * @param outTradeNo 商户授权资金订单号 ,不能包含除中文、英文、数字以外的字符，创建后不能修改，需要保证在商户端不重复
     * @param client
     */
    AlipayTradeCloseResponse tradeClose(String outTradeNo, String client);

    /**
     * 统一收单交易退款接口
     * https://docs.open.alipay.com/api_1/alipay.trade.refund
     *
     * @param outTradeNo   商户授权资金订单号 ,不能包含除中文、英文、数字以外的字符，创建后不能修改，需要保证在商户端不重复
     * @param refundAmount 需要退款的金额，该金额不能大于订单金额,单位为分
     */
    AlipayTradeRefundResponse tradeRefund(String outTradeNo, Long refundAmount, String client);

    /**
     * 统一收单交易退款查询
     * https://docs.open.alipay.com/api_1/alipay.trade.fastpay.refund.query
     *
     * @param outTradeNo 商户授权资金订单号 ,不能包含除中文、英文、数字以外的字符，创建后不能修改，需要保证在商户端不重复
     */
    AlipayTradeFastpayRefundQueryResponse tradeFastpayRefundQuery(String outTradeNo, String client);

    /**
     * app支付接口2.0
     * https://docs.open.alipay.com/api_1/alipay.trade.app.pay
     *
     * @param outTradeNo     商户授权资金订单号 ,不能包含除中文、英文、数字以外的字符，创建后不能修改，需要保证在商户端不重复
     * @param totalAmount    订单总金额，单位为分，精确到小数点后两位
     * @param body           对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
     * @param subject        商品的标题/交易标题/订单标题/订单关键字等。
     * @param timeoutExpress 该笔订单允许的最晚付款时间，逾期将关闭交易。取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。 该参数数值不接受小数点， 如 1.5h，可转换为 90m。
     */
    AlipayTradeAppPayResponse tradeAppPay(String outTradeNo, Long totalAmount, String body, String subject, String timeoutExpress, String client);




}
