# 测试与排查 Stripe 归因 (https://talivia.com/zh-CN/docs/revenue-guides/stripe/testing-and-troubleshooting)



先完成[通用付款测试配置](https://talivia.com/zh-CN/docs/revenue-guides/testing-payment-providers)，再测试产品实际使用的 Stripe 结账路径，不要只发送通用网络回调样例。

## 最小测试矩阵 [#最小测试矩阵]

| 场景      | Talivia 预期结果                     |
| ------- | -------------------------------- |
| 单次结账会话  | 一笔匹配到结账会话的已付付款                   |
| 直接付款意图  | 一笔以 `pi_...` 编号为键的付款             |
| 付款链接    | 通过 `client_reference_id` 或返回网址匹配 |
| 延迟付款方式  | 异步成功前不记录收入                       |
| 注册订阅    | 一笔首次付款和一个有效订阅                    |
| 订阅续费    | 一笔关联到原始客户的续费                     |
| 账单失败    | 订阅生命周期变化且不记录已付收入                 |
| 全额或部分退款 | 保留原始付款并减少净收入                     |
| 争议      | 将争议状态关联到原始付款                     |
| 重复或乱序事件 | 不重复付款                            |

## 连接成功但没有出现付款 [#连接成功但没有出现付款]

检查 Stripe 控制台中网站端点的网络回调投递。相关成功事件必须是以下之一：

* `checkout.session.completed` 或 `checkout.session.async_payment_succeeded`；
* 直接付款意图的 `payment_intent.succeeded`；
* 账单的 `invoice.paid` 或 `invoice.payment_succeeded`。

确认事件与 Talivia 中连接的受限密钥属于同一测试或正式模式。

## 付款出现但未归因 [#付款出现但未归因]

检查流程使用的 Stripe 对象：

* 结账会话：`metadata.talivia_session_id`；
* 直接付款意图：`metadata.talivia_session_id`；
* 订阅：`metadata.talivia_session_id`；
* 付款链接结账会话：以 `s_` 开头、类似 Talivia 会话的 `client_reference_id`；
* 返回页面：`?session_id=cs_...` 和正常运行的 Talivia 追踪器。

如果元数据缺失，请确认后端创建结账前 `window.talivia.getSessionId()` 已返回值。

## 付款链接未添加参数 [#付款链接未添加参数]

自动添加参数要求普通锚点的主机名是 `buy.stripe.com`。Talivia 会保留已有 `client_reference_id`。自定义域名、程序化跳转或已有商户引用请配置带 `{CHECKOUT_SESSION_ID}` 的已追踪返回网址。

## 续费未归因 [#续费未归因]

确认首次订阅付款已归因，后续账单使用同一 Stripe 客户。注册时添加 `subscription_data.metadata`，并在身份验证后使用 Stripe 客户编号调用 `window.talivia.identify`。

## 退款未生效 [#退款未生效]

确认 Talivia 已导入原始付款，而且成功退款引用了相同的 Stripe 付款意图或扣款编号。成功退款无法匹配时，Talivia 会返回错误且不会把该网络回调事件标记为已处理，这样 Stripe 可以在原始付款可用后重试。

## 重新连接 Stripe [#重新连接-stripe]

粘贴更新后的受限密钥时，Talivia 会协调现有 Stripe 网络回调网址和事件列表，而不是创建重复端点。如果原始连接早于托管端点编号功能，首次更新会创建并保存新的托管端点。
