package cn.common.interaction.internal.alipay;

import com.alibaba.fastjson.annotation.JSONField;
import com.alipay.api.domain.ExtUserInfo;
import com.alipay.api.domain.ExtendParams;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.InvoiceInfo;
import com.alipay.api.domain.RoyaltyInfo;
import com.alipay.api.domain.SettleInfo;
import com.alipay.api.domain.SignParams;
import com.alipay.api.domain.SubMerchant;
import lombok.Data;

import java.io.*;
import java.util.List;

/**
 * @author Singer create by singer email:singer-coder@qq.com
 * @projectName byte-platform-api
 * @Description: 支付宝交易参数疯转
 * @date 2020-07-01
 */
@Data
public class AliPayTradeParam implements Serializable {


    private static final long serialVersionUID = -1555306700862058057L;

    /**
     * 签约参数。如果希望在sdk中支付并签约，需要在这里传入签约信息。
     */
    @JSONField(name = "agreement_sign_params")
    private SignParams agreementSignParams;

    /**
     * 对一笔交易的具体描述信息。如果是多种商品，请将商品描述字符串累加传给body。
     */
    @JSONField(name = "body")
    private String body;

    /**
     * 商户传入业务信息，具体值要和支付宝约定，应用于安全，营销等参数直传场景，格式为json格式
     */
    @JSONField(name = "business_params")
    private String businessParams;

    /**
     * 禁用渠道，用户不可用指定渠道支付
     当有多个渠道时用“,”分隔
     注，与enable_pay_channels互斥
     */
    @JSONField(name = "disable_pay_channels")
    private String disablePayChannels;

    /**
     * 可用渠道，用户只能在指定渠道范围内支付
     当有多个渠道时用“,”分隔
     注，与disable_pay_channels互斥
     */
    @JSONField(name = "enable_pay_channels")
    private String enablePayChannels;

    /**
     * 外部指定买家
     */
    @JSONField(name = "ext_user_info")
    private ExtUserInfo extUserInfo;

    /**
     * 业务扩展参数
     */
    @JSONField(name = "extend_params")
    private ExtendParams extendParams;

    /**
     * 订单包含的商品列表信息，json格式，其它说明详见商品明细说明
     */
    @JSONField(name = "goods_detail")
    private List<GoodsDetail> goodsDetail;

    /**
     * 商品主类型 :0-虚拟类商品,1-实物类商品
     */
    @JSONField(name = "goods_type")
    private String goodsType;

    /**
     * 开票信息
     */
    @JSONField(name = "invoice_info")
    private InvoiceInfo invoiceInfo;

    /**
     * 商户原始订单号，最大长度限制32位
     */
    @JSONField(name = "merchant_order_no")
    private String merchantOrderNo;

    /**
     * 商户网站唯一订单号
     */
    @JSONField(name = "out_trade_no")
    private String outTradeNo;

    /**
     * 公用回传参数，如果请求时传递了该参数，则返回给商户时会回传该参数。支付宝只会在同步返回（包括跳转回商户网站）和异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝。
     */
    @JSONField(name = "passback_params")
    private String passbackParams;

    /**
     * 销售产品码，商家和支付宝签约的产品码
     */
    @JSONField(name = "product_code")
    private String productCode;

    /**
     * 优惠参数
     注：仅与支付宝协商后可用
     */
    @JSONField(name = "promo_params")
    private String promoParams;

    /**
     * 描述分账信息，json格式，详见分账参数说明
     */
    @JSONField(name = "royalty_info")
    private RoyaltyInfo royaltyInfo;

    /**
     * 收款支付宝用户ID。 如果该值为空，则默认为商户签约账号对应的支付宝用户ID
     */
    @JSONField(name = "seller_id")
    private String sellerId;

    /**
     * 描述结算信息，json格式，详见结算参数说明
     */
    @JSONField(name = "settle_info")
    private SettleInfo settleInfo;

    /**
     * 指定渠道，目前仅支持传入pcredit
     若由于用户原因渠道不可用，用户可选择是否用其他渠道支付。
     注：该参数不可与花呗分期参数同时传入
     */
    @JSONField(name = "specified_channel")
    private String specifiedChannel;

    /**
     * 商户门店编号
     */
    @JSONField(name = "store_id")
    private String storeId;

    /**
     * 间连受理商户信息体，当前只对特殊银行机构特定场景下使用此字段
     */
    @JSONField(name = "sub_merchant")
    private SubMerchant subMerchant;

    /**
     * 商品的标题/交易标题/订单标题/订单关键字等。
     */
    @JSONField(name = "subject")
    private String subject;

    /**
     * 绝对超时时间，格式为yyyy-MM-dd HH:mm。
     */
    @JSONField(name = "time_expire")
    private String timeExpire;

    /**
     * 该笔订单允许的最晚付款时间，逾期将关闭交易。取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。 该参数数值不接受小数点， 如 1.5h，可转换为 90m。
     */
    @JSONField(name = "timeout_express")
    private String timeoutExpress;

    /**
     * 订单总金额，单位为元，精确到小数点后两位，取值范围[0.01,100000000]
     */
    @JSONField(name = "total_amount")
    private String totalAmount;
}
