> ## Documentation Index
> Fetch the complete documentation index at: https://devzone.nayax.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 单次会话预授权与外部结算

Marshall 实现的[ExternalSettlement](/reference/spark/transactions/externalsettlement)将交易的授权和结算阶段分开。

Marshall 外围设备和 Nayax 设备负责管理与消费者和支付卡的初始交互，而最终的财务结算则由第三方服务器执行，该服务器会将结算请求发送到 Nayax 的服务器。

<Warning>
  先决条件

  要使此流程正常运行，Nayax 必须启用[ExternalSettlement](/reference/spark/transactions/externalsettlement)设置。
</Warning>

## 配置和设备行为

启用后，Nayax Engine 会改变物理设备处理交易的方式：

* 授权成功后，设备将不再发送自己的结算命令。
* 交易在收到外部请求之前将保持未结算状态。
* 结算交易的唯一方法是通过[ExternalSettlement](/reference/spark/transactions/externalsettlement)命令。
* 对于多会话流程，“Close Session”命令不再适用；请改用 [ExternalSettlement](/reference/spark/transactions/externalsettlement)。
* 要允许结算价格与授权金额不同（结算价格 ≤ 授权价格），请在 Marshall SDK 中启用 `price not final` 标志。

这样，您可以根据自己的业务逻辑灵活地从外部触发结算阶段，支持所有流程类型（预选/预授权）。

| 特征 | 要求 |
| :- | :- |
| 结算窗口 | 交易必须在发起后 48 小时内完成结算。 |
| 到期日 | 超过 48 小时窗口期后尝试的结算将会失败。 |
| 自动清洁 | 超过 48 小时未结算的交易将根据卡组织规定被自动取消（不应依赖此机制）。 |
| 增量授权 | 最终结算价格不得超过为运营商/机器设置的 Maximum Default Credit。 |

<Note>
  增量授权

  外部结算支持增量授权。请确保您的逻辑符合最大默认信用额度限制，以避免结算失败。更多信息请参阅[增量授权文档](/docs/integrate-pos-device/marshall/payment-flows/sub-flows-features#incremental-authorization)。
</Note>

## 管理未结算交易

当不提供产品或服务时，您必须主动管理交易，以保持良好的用户体验。

* **外部取消：**如果您知道不会发生结算，则必须立即发送**外部取消**。
* \*\*对消费者的影响：\*\*如果交易在未取消或结算的情况下仍保持授权状态，消费者的资金将一直保留在其支付方式中，从而导致潜在的纠纷。

## 外部结算流

该流程包括两个阶段：由 Marshall 外围设备和 Nayax 设备处理的支付授权，以及由您的第三方服务器触发的结算或取消。

### 付款授权

以下步骤涵盖了授权阶段，从刷卡到会话结束。

<Frame>
  <img src="https://mintcdn.com/nayax-44d6e37b/VrZ-OU46FUlkm5RA/images/docs/external-settlement-marshall/image1.png?fit=max&auto=format&n=VrZ-OU46FUlkm5RA&q=85&s=f9647ef532efe5c3f3377db3291e868b" alt="" width="2147" height="1244" data-path="images/docs/external-settlement-marshall/image1.png" />
</Frame>

1. 消费者与外围设备发起交易。
2. 该外设可启用 Nayax 的设备读卡器。
3. 系统提示消费者出示银行卡。
4. 消费者将卡出示给Nayax设备。
5. 消费者会收到有关授权流程的通知。
6. Nayax 设备向 Nayax 服务器发送授权请求。
7. Nayax 服务器与计费提供商进行授权。
8. 计费提供商向 Nayax 服务器发送授权响应（已批准）。
9. Nayax 服务器将授权响应发送回 Nayax 设备。
10. 外设的SDK触发“会话开始”事件：

<CodeGroup>
  ```java Java theme={null}
  vmc_vend_events() (via onBeginSession(funds_avail))
  ```

  ```csharp C# theme={null}
  vend_callbacks(onBeginSession(funds_avail))
  ```

  ```c C theme={null}
  vmc_vend_event_handler_cb(vm_vend_event_on_session_begin)
  ```
</CodeGroup>

这是向外围设备（例如自动售货机）发出的信号，以准备批准付款。

<CodeGroup>
  ```java Java theme={null}
  m_sessions[0] = new vmc_vend_t.vend_session_t((short) 0, 1, (byte) 0, 10);
  //the fields are (from left to right): produce code (2 bytes long,meaning value up to 65535), quantity (2 byte), unit of measure (1 byte), price (2 bytes, meaning value up to 65535)
  ```

  ```csharp C# theme={null}
  List<vmc_vend_t.vend_item_t> list = new List<vmc_vend_t.vend_item_t> ();
  list.Add(new vmc_vend_t.vend_item_t(0, 10, 1, 1));
  //the fields are (from left to right): produce code (2 bytes long,meaning value up to 65535), price (2 bytes, meaning value up to 65535), quantity (2 bytes), unit of measure (1 byte), .
  session = new vmc_vend_t.vend_session_t(list);
  ```

  ```c C theme={null}
  session_product.code = 1;
  session_product .qty = 1;
  session_product.price = 10;
  session_product.unit = 1;
  session->products = &session_product;
  session->total_products = 1;
  ```
</CodeGroup>

11. 机器显示屏显示：“请选择产品。”消费者选择产品后，外围设备的 SDK 会向 Nayax 设备发送“供应商请求”。

<CodeGroup>
  ```java Java theme={null}
  m_vmc.vend.vend_request(m_sessions[m_active_session]);
  ```

  ```csharp C# theme={null}
  vmc_instance.vend.vend_request(session);
  ```

  ```c C theme={null}
  vmc_vend_vend_request(session);
  ```
</CodeGroup>

<Frame>
  <img src="https://mintcdn.com/nayax-44d6e37b/VrZ-OU46FUlkm5RA/images/docs/external-settlement-marshall/image2.png?fit=max&auto=format&n=VrZ-OU46FUlkm5RA&q=85&s=aa81aa0e59f9b020b5424291390d8985" alt="" width="2147" height="945" data-path="images/docs/external-settlement-marshall/image2.png" />
</Frame>

12. 外围设备的 SDK 处理通过 Transfer Data 命令接收的交易数据（包括 Nayax 交易 ID 和卡片详细信息）：

<CodeGroup>
  ```java Java theme={null}
  vmc_vend_events() (via onTransactionInfo(data))
  ```

  ```csharp C# theme={null}
  vend_callbacks(onTransactionInfo(data))
  ```

  ```c C theme={null}
  vmc_vend_event_handler_cb(vm_vend_event_on_transaction_info)
  ```
</CodeGroup>

此时，外围设备必须保留收到的（Nayax 的）Transaction ID 和 Site ID，以便稍后用于 External Settlement/External Cancel。

13. 可选：外围设备的 SDK 可以向 Nayax 设备回传其自有的 Transaction 编号（此信息不会在任何地方被使用，仅供外围设备希望在其 SDK 日志中显示自己的 Transaction ID 时使用）。
14. Nayax 的设备发送“Vend Approved”消息，触发外围设备的 SDK “vend approved” 事件：

<CodeGroup>
  ```java Java theme={null}
  vmc_vend_events() (via onVendApproved(session))
  ```

  ```csharp C# theme={null}
  vend_callbacks(via onVendApproved(session))
  ```

  ```c C theme={null}
  vmc_vend_event_handler_cb(vm_vend_event_on_vend_approved)
  ```
</CodeGroup>

15. 外围设备向消费者分发产品或提供服务，SDK 报告成功并完成本地会话：

<CodeGroup>
  ```java Java theme={null}
  onVendApproved(session)
  ```

  ```csharp C# theme={null}
  onVendApproved(session)
  ```

  ```c C theme={null}
  vmc_vend_vend_status(&session, __true)` and `vmc_vend_vend_session_complete_lowlevel()
  ```
</CodeGroup>

16. 外围设备发送 `Session Complete` 以表示当前交易过程已完成（尚未结算）。
17. Nayax 的设备向外围设备发送 `End Session`。
18. 外围设备发送 `Reader Disable`，使读卡器进入待机状态。

### 完成交易

会话结束后，第三方服务器会根据服务是否已提供来处理结算或取消事宜。

如果提供了该服务：

19. 第三方服务器通过使用加密密码调用 `StartAuthentication` 方法来发起通信以进行身份验证。
20. Nayax 服务器解密密码，验证凭据和时间戳以确认真实性。

<Frame>
  <img src="https://mintcdn.com/nayax-44d6e37b/82m6viuToj0hTggv/images/docs/external-settlement-marshall/image3.png?fit=max&auto=format&n=82m6viuToj0hTggv&q=85&s=76b3b8d8e8c1d11e9a8c52b5a36f2fb5" alt="" width="2535" height="886" data-path="images/docs/external-settlement-marshall/image3.png" />
</Frame>

21. 第三方服务器发送 [ExternalSettlement](/reference/spark/transactions/externalsettlement) 请求。该请求必须包含：`NayaxTransactionId`、`SiteId`（从交易的 Transfer Data 命令中获取的信息），并且必须在消费者卡片获得授权后的 48 小时内发送。
    * 要允许结算价格与授权金额不同（结算价格 ≤ 授权价格），请在 Marshall SDK 中启用 `price not final` 标志。
22. 外围设备通知服务器交易已完成。
23. 第三方服务器启动身份验证过程。
24. Nayax服务器发送响应。
25. Nayax 的服务器向第三方服务器发送[ExternalSettlement](/reference/spark/transactions/externalsettlement)响应。
26. Nayax 的服务器会将结算信息通知设备。
27. Nayax 的设备会通知消费者，交易已按最终收费金额结算。
28. Nayax 服务器发送外部结算响应。

如果未提供服务：

<Frame>
  <img src="https://mintcdn.com/nayax-44d6e37b/VrZ-OU46FUlkm5RA/images/docs/external-settlement-marshall/image4.png?fit=max&auto=format&n=VrZ-OU46FUlkm5RA&q=85&s=5d4f4020a017fe04155dca8e13790454" alt="" width="2535" height="897" data-path="images/docs/external-settlement-marshall/image4.png" />
</Frame>

24. 第三方服务器启动身份验证过程。
25. Nayax服务器发送响应。
26. 第三方服务器发送 [ExternalCancel](/reference/spark/transactions/externalcancel) 请求。该请求必须包含：`NayaxTransactionId`、`SiteId`（从交易的 Transfer Data 命令中获取的信息），并且必须在消费者卡片获得授权后的 48 小时内发送。
27. Nayax 服务器与支付提供商发起取消流程。
28. Nayax 的服务器会收到来自支付提供商的响应。
29. Nayax 的服务器向第三方服务器发送[ExternalCancel](/reference/spark/transactions/externalcancel)响应。

## 下一步

<CardGroup cols={2}>
  <Card title="外部结算 API" icon="link" href="/reference/spark/transactions/externalsettlement">
    用于结算来自第三方服务器的授权交易的 ExternalSettlement 端点的 API 参考。
  </Card>

  <Card title="外部取消 API" icon="link" href="/reference/spark/transactions/externalcancel">
    用于在未提供服务时取消已授权交易的 ExternalCancel 端点的 API 参考。
  </Card>

  <Card title="增量授权" icon="link" href="/docs/integrate-pos-device/marshall/payment-flows/sub-flows-features#incremental-authorization">
    适用于外部结算的增量授权和最高违约信用额度详情。
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.