# Tạo tích hợp Sapo

`POST /service/@id/tinopay/sapo-integrations` · TinoPay, token đăng nhập của chủ dịch vụ

Khách chuyển khoản với nội dung chứa mã đơn (tiền tố + số đơn Sapo, ví dụ `TNG1002` ứng với đơn #1002): đủ hoặc dư tiền thì TinoPay ghi nhận đơn đã thanh toán trên Sapo. Body: `name` (≤ 100 ký tự), `store_url` (tên miền `.mysapo.net` của cửa hàng, không nhận tên miền riêng), `api_key`, `api_secret` (ứng dụng riêng trên Sapo, quyền đọc và ghi đơn hàng, giao dịch), `bank_account_id`, `virtual_account` (bắt buộc với BIDV), `order_prefix` (2–5 chữ hoặc số; chưa có trong cấu trúc mã thanh toán thì TinoPay tự thêm mẫu hậu tố 1–12 chữ số), `transaction` (`kind`, `source_name`, `status`), `status`. TinoPay thử kết nối Sapo trước khi lưu; không được thì 422 `SAPO_CONNECTION_FAILED`, không tạo gì. Dán `snippet` trả về vào Sapo Admin → Cấu hình → Trang thanh toán → Nội dung thông báo thêm.

## HTTP request

| Mục | Giá trị |
| --- | --- |
| URL | `https://api.tino.vn/service/@id/tinopay/sapo-integrations` |
| Method | `POST` |
| Xác thực | token đăng nhập của chủ dịch vụ TinoPay (`Authorization: Bearer <token>`); gateway `/v1` chưa mở TinoPay |
| Content-Type | `application/json` |

## Tham số

| Tên | Vị trí | Kiểu | Bắt buộc | Mô tả |
| --- | --- | --- | --- | --- |
| `id` | đường dẫn | int | có | ID dịch vụ TinoPay |
| `name` | body | string | có | ≤ 100 |
| `store_url` | body | string | có | <tên-cửa-hàng>.mysapo.net (tên miền riêng không nhận) |
| `api_key` | body | string | có | — |
| `api_secret` | body | string | có | — |
| `bank_account_id` | body | string | có | — |
| `virtual_account` | body | string | — | Bắt buộc với BIDV |
| `order_prefix` | body | string | có | 2–5 chữ/số |
| `transaction` | body | array | — | — |
| `status` | body | string | — | active \| inactive |

## Example request

```bash
curl -X POST "https://api.tino.vn/service/100001/tinopay/sapo-integrations" \
  -H "Authorization: Bearer $TINO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Website Sapo",
  "store_url": "<tên-cửa-hàng>.mysapo.net",
  "api_key": "<api_key>",
  "api_secret": "<api_secret>",
  "bank_account_id": "9c1e6f2a-5b7d-4e1a-9f3c-2d8b6a4e0c11",
  "virtual_account": "9624QA01",
  "order_prefix": "TNG"
}'
```

`$TINO_TOKEN` là token đăng nhập của chủ dịch vụ TinoPay. Tham số đường dẫn trong ví dụ là giá trị mẫu.

SDK ([SDK & Ví dụ](/docs/sdk)): chưa có hàm riêng, dùng `client.request("POST", "/service/@id/tinopay/sapo-integrations")`.

## Example response

```json
{
 "data": {
  "id": 4,
  "name": "Website Sapo",
  "store_url": "<tên-cửa-hàng>.mysapo.net",
  "api_key": "<api_key>",
  "has_api_secret": true,
  "bank_account_id": "9c1e6f2a-5b7d-4e1a-9f3c-2d8b6a4e0c11",
  "virtual_account": "9624QA01",
  "order_prefix": "TNG",
  "transaction": {
   "kind": "capture",
   "source_name": null,
   "status": null
  },
  "status": "active",
  "script_url": "<script_url>",
  "snippet": "<snippet>",
  "last_error": null,
  "last_error_at": null,
  "last_paid_at": "2026-10-24T10:00:00+07:00",
  "created_at": "2026-10-24T09:00:00+07:00",
  "updated_at": "2026-10-24T09:00:00+07:00"
 }
}
```

Mẫu dựng theo tài liệu TinoPay API v1 (Tino chuyển tiếp nguyên dữ liệu TinoPay), giá trị là ví dụ.
