PAYATHON 2026

支付宝对账单包含哪些字段和业务类型字段值?

支付小周

结论

支付宝对账单没有一套适用于所有产品的固定字段。通过 alipay.data.dataservice.bill.downloadurl.query 下载的账单通常分为两类:

  • trade:支付宝交易账单,记录交易、退款等业务。
  • signcustomer:签约商户账务账单,记录账户资金收支和账务流水。

常见的交易账单字段包括支付宝交易号、商户订单号、业务类型、商品名称、交易时间、交易金额、商家实收、优惠金额、服务费、分润和备注等。

“业务类型”的常见值如下:

业务类型业务场景含义
交易用户向商户付款一笔支付交易形成的收入或交易流水
退款商户向用户退款原交易发生全部或部分退款
转账支付宝账户之间划转资金从一个账户转入另一个账户
收费支付宝收取费用手续费、服务费或其他费用扣收
充值账户资金充值资金充值进入支付宝账户
提现余额提现至银行卡资金从支付宝账户转出
跨境结算跨境交易资金结算涉及跨境收款、换汇或结算的资金流水
其他无法归入上述类型的业务特殊业务或新增业务形成的账务记录

商户的账单中不一定会出现所有类型。实际字段和业务类型取决于账单类型、商户签约产品、交易渠道、接口版本以及支付宝后续调整,解析时应以下载文件中的表头和数据为准。

交易账单常见字段

trade 类型账单经常包含以下字段:

字段含义
支付宝交易号支付宝为交易生成的唯一流水号,常用于查询、退款和对账
商户订单号商户系统生成的订单号,对应支付接口中的 out_trade_no
业务类型流水所属业务,例如交易、退款、转账或收费
商品名称下单时传入的商品标题或订单说明
创建时间交易或业务流水创建的时间
完成时间支付、退款或其他业务最终完成的时间
门店编号商户门店标识;未使用门店能力时可能为空
门店名称门店名称;没有门店信息时可能为空
操作员收银员或业务操作人员标识
终端号发起交易的收银终端、设备或机具编号
对方账户交易对方的支付宝账户标识,可能经过脱敏处理
订单金额(元)下单时的订单总金额
商家实收(元)商户在优惠、退款等因素计算后对应的实收金额
支付宝红包(元)由支付宝红包承担的支付金额
集分宝(元)使用集分宝抵扣的金额
支付宝优惠(元)由支付宝承担的优惠金额
商家优惠(元)由商户承担的优惠金额
券核销金额(元)优惠券在该笔订单中核销的金额
券名称被核销优惠券的名称
商家红包消费金额(元)使用商家红包支付或抵扣的金额
卡消费金额(元)使用相关卡产品支付的金额
退款批次号/请求号退款业务对应的批次号或商户退款请求号
服务费(元)支付宝或相关服务方收取的费用
分润(元)交易涉及分润时记录的分润金额
备注补充说明、业务状态或特殊账务信息

每份账单包含的列可能不同。门店、券核销、商家红包和分润等字段,通常只会在开通相应能力后出现。

关键金额字段如何理解

“订单金额”、“商家实收”和”服务费”不是同一个统计口径:

  • 订单金额是订单的原始金额。
  • 商家实收通常是计算商户承担的优惠等因素后,商户对应的收入金额。
  • 服务费是支付服务产生的费用。
  • 优惠金额需要区分由支付宝承担还是由商户承担。
  • 发生退款后,需要结合原交易、退款流水和账务流水计算最终净收入。

不同业务中,金额列的正负号和统计口径可能不同,不能只看”业务类型”来判断资金方向。解析时应同时检查金额列、备注,以及账务账单中的收入和支出字段。

账务账单可能包含的字段

signcustomer 账单主要记录账户资金变化,可能包含以下字段:

字段含义
支付宝交易号或流水号支付宝侧的业务或账务流水标识
商户订单号商户侧业务单号,部分流水可能为空
业务类型交易、退款、收费、提现等业务分类
账务类型收入、支出或其他账务记账类型
收入(元)计入账户的金额
支出(元)从账户扣除的金额
账户余额(元)该笔流水记账后的账户余额
发生时间账务流水发生或入账的时间
备注费用、退款、结算等补充信息

交易账单用于确认发生了什么业务,账务账单则用于核对账户资金增加或减少的原因。进行严格的财务对账时,通常需要结合这两类账单。

推荐的对账步骤

  1. 调用账单下载接口取得下载地址。
  2. 下载并解压账单文件。
  3. 动态读取 CSV 表头,不按固定列下标解析。
  4. 去除文件中的汇总行、说明行和空行。
  5. 使用支付宝交易号关联支付流水和退款流水。
  6. 使用商户订单号关联本地订单。
  7. 按业务类型分类统计,但不将其作为判断资金方向的唯一条件。
  8. 使用十进制定点数处理金额。
  9. 将未知业务类型写入异常表,等待人工确认。
  10. 使用账务账单复核交易净额、手续费和实际资金变化。

Java 解析示例

下面的示例演示如何动态识别字段,并保留对未知业务类型的兼容能力。生产环境应使用成熟的 CSV 解析库,正确处理引号、逗号和换行。

import java.math.BigDecimal;
import java.util.Map;
import java.util.Set;

public class AlipayBillRow {

    private static final Set<String> KNOWN_BUSINESS_TYPES = Set.of(
        "交易",
        "退款",
        "转账",
        "收费",
        "充值",
        "提现",
        "跨境结算",
        "其他"
    );

    public static void process(Map<String, String> row) {
        String alipayTradeNo = value(row, "支付宝交易号");
        String outTradeNo = value(row, "商户订单号");
        String businessType = value(row, "业务类型");

        BigDecimal orderAmount = money(row, "订单金额(元)");
        BigDecimal merchantReceipt = money(row, "商家实收(元)");
        BigDecimal serviceFee = money(row, "服务费(元)");

        if (!businessType.isEmpty()
                && !KNOWN_BUSINESS_TYPES.contains(businessType)) {
            recordUnknownBusinessType(businessType, row);
        }

        System.out.printf(
            "alipayTradeNo=%s, outTradeNo=%s, type=%s, " +
            "orderAmount=%s, merchantReceipt=%s, serviceFee=%s%n",
            alipayTradeNo,
            outTradeNo,
            businessType,
            orderAmount,
            merchantReceipt,
            serviceFee
        );
    }

    private static String value(Map<String, String> row, String field) {
        String value = row.get(field);
        return value == null ? "" : value.trim();
    }

    private static BigDecimal money(
            Map<String, String> row,
            String field
    ) {
        String value = value(row, field);

        if (value.isEmpty() || "-".equals(value)) {
            return BigDecimal.ZERO;
        }

        return new BigDecimal(value.replace(",", ""));
    }

    private static void recordUnknownBusinessType(
            String businessType,
            Map<String, String> row
    ) {
        // 写入异常记录或告警系统,不要直接丢弃整行账单。
        System.err.println(
            "发现未知业务类型: " + businessType + ", row=" + row
        );
    }
}

业务类型不适合定义为封闭的 Java enum 并直接反序列化。如果支付宝新增类型,封闭枚举可能导致整批账单导入失败。更安全的处理方式是保留原始字符串,并将无法识别的值标记为待确认。

调用账单下载接口示例

账单下载接口返回的是临时下载地址,不是账单正文:

AlipayDataDataserviceBillDownloadurlQueryRequest request =
    new AlipayDataDataserviceBillDownloadurlQueryRequest();

request.setBizContent("""
{
  "bill_type": "trade",
  "bill_date": "2026-09-08"
}
""");

AlipayDataDataserviceBillDownloadurlQueryResponse response =
    alipayClient.execute(request);

if (!response.isSuccess()) {
    throw new IllegalStateException(
        response.getCode() + ": " + response.getSubMsg()
    );
}

String downloadUrl = response.getBillDownloadUrl();

示例日期只用于说明参数格式。账单日期范围、可下载期限和接口权限,应以商户当前签约能力及对应接口文档为准。

注意事项

  • 解析时以实际 CSV 表头为准,不要长期写死字段顺序。
  • CSV 可能带有 BOM,字段内容也可能包含逗号、双引号或换行。
  • 下载文件可能包含明细文件、汇总文件和说明文件,不要将汇总行识别为交易。
  • 金额必须使用 BigDecimal 或等价的十进制定点类型,不能使用 float、double。
  • 空金额和 0.00 的含义不同,是否将空值按零处理,需要根据具体字段判断。
  • 一笔订单可能对应多笔退款,不能假设商户订单号或退款记录是一一对应关系。
  • 支付宝交易号适合关联支付宝侧流水,商户订单号适合关联商户订单,两者都需要保存。
  • 对账时还要校验交易状态、完成时间、手续费、优惠承担方和退款金额。
  • 下载地址通常有时效性,不宜保存后长期复用。
  • 对方账户等信息可能属于敏感数据,需要限制访问,并避免写入普通日志。
  • 出现新的业务类型时,应先保留原始记录并告警,不能默认归类为交易,也不能直接丢弃。

备注:内容仅供参考。