> For the complete documentation index, see [llms.txt](https://guide.ssi.com.vn/ssi-products/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://guide.ssi.com.vn/ssi-products/tieng-viet/fastconnect-trading/huong-dan-ket-noi.md).

# Hướng dẫn kết nối

## Đường dẫn dịch vụ

<table><thead><tr><th width="244">Tên dịch vụ</th><th>Đường dẫn</th></tr></thead><tbody><tr><td>FCTrading API</td><td>https://fc-tradeapi.ssi.com.vn</td></tr><tr><td>FCTrading Streaming</td><td>https://fc-tradehub.ssi.com.vn</td></tr></tbody></table>

## Thông tin đăng nhập

Để đảm bảo bảo mật, người dùng được cấp một bộ key kết nối bao gồm:

* ConsumerID: Định danh tài khoản
* ConsumerSecrect: Key truy cập server
* PrivateKey: Được sử dụng để tạo chữ ký số bằng thuật toán RS256

Xem chi tiết đăng ký dịch vụ và tạo key kết nối [tại đây](/ssi-products/tieng-viet/dang-ky-dich-vu.md).&#x20;

## Mô hình kết nối

### Mô hình kết nối

<figure><img src="/files/AHu7eVWuaQq9LsLuCGLb" alt=""><figcaption><p>Mô hình kết nối kỹ thuật</p></figcaption></figure>

### **Yêu cầu access token**

Để đảm bảo an toàn cho tài khoản của bạn, khi yêu cầu access token, ngoài ConsumerID và SecretKey, bạn sẽ cần cung cấp thêm **mã xác thực** của tài khoản. Mã xác thực sẽ phụ thuộc vào phương thức xác thực mà bạn đã đăng ký:

* PIN: Nhập mã PIN đặt lệnh của bạn
* SMS OTP: Sử dụng hàm GetOTP để lấy mã OTP. Mã OTP sẽ được gửi tới số điện thoại đã đăng ký của bạn.&#x20;
* Email OTP: Sử dụng hàm GetOTP để lấy mã OTP. Mã OTP sẽ được gửi tới email đã đăng ký của bạn.
* Smart OTP: Nhập mã OTP trên ứng dụng SSI SmartOTP hoặc iBoard tùy thuộc bạn kích hoạt dịch vụ SmartOTP trên ứng dụng nào.&#x20;

{% hint style="info" %}
Để nâng cao bảo mật cho bạn, chúng tôi khuyến khích bạn chuyển sang dùng các phương thức xác thực SMS OTP và SmartOTP. Phương thức xác thực bằng PIN sẽ sớm dừng hỗ trợ.
{% endhint %}

### **Sử dụng access token**

* Đối với các hàm query dữ liệu, bạn chỉ cần truyền access token đã lấy được để hệ thống FastConnect xác thực và thực thi yêu cầu nếu hợp lệ.&#x20;
* Đối với các hàm trực tiếp làm thay đổi tiền/chứng khoán bao gồm đặt/hủy/sửa lệnh, chuyển khoản nội bộ, đăng ký quyền mua, chuyển khoản chứng khoán, nộp rút ký quỹ phái sinh, bạn sẽ **cần thêm ký số bằng Private Key** (được cung cấp khi bạn tạo key kết nối trên hệ thống iBoard). Xem chi tiết về chữ ký số [tại đây](#chu-ky-dien-tu).&#x20;

{% hint style="info" %}
Access token có hiệu lực trong vòng 8h. Bạn không thể truy cập các api với token hết hiệu lực. Vì vậy, nhớ yêu cầu lại access token trước khi hết hạn để hoạt động của hệ thống không ảnh hưởng.&#x20;

Khi yêu cầu access token, bạn có thể chọn **lưu hiệu lực** của mã xác thực.&#x20;

* Nếu bạn chọn lưu hiệu lực, khi đặt/hủy/sửa lệnh hoặc làm các giao dịch liên quan tiền/chứng khoán, bạn **sẽ không cần** nhập mã xác thực.&#x20;
* Nếu bạn không chọn lưu hiệu lực, khi đặt/hủy/sửa lệnh hoặc làm các giao dịch liên quan tiền/chứng khoán, bạn **sẽ cần** nhập lại mã xác thực.
  {% endhint %}

### Chữ ký điện tử

Signature là một chuỗi ký tự được tạo ra từ một thuật toán cho trước, sử dụng để kiểm tra tính đúng đắn của dữ liệu trên đường truyền giữa 2 hệ thống. Một số thuật toán đang sử dụng là MD5, SHA256, RSA.\
Tham khảo thêm: [Wikipedia](https://en.wikipedia.org/wiki/HMAC)

Trong tài liệu này sử dụng thuật toán RSA + SHA256 để tạo Signature. Dữ liệu đầu vào bao gồm Private Key và data, data là một json body chứa thông tin đặt/sửa/xóa.&#x20;

## Kết nối streaming

Để sử dụng nghe streaming bạn cần khởi tạo kết nối và đăng ký cập nhật từng loại dữ liệu

#### Khởi tạo kết nối

```json
Initstream:
client.initStream({
    url: config.stream_url,
    consumer_id: config. ConsumerID,
    consumer_secret: config. ConsumerSecret,
    notify_id:   0

});

```

{% hint style="info" %}
**Lưu ý:**&#x20;

notify\_id là số thứ tự của các message trả về qua stream. Khi khởi tạo kết nối, bạn cần xác định giá trị cho notify\_id. &#x20;

* notify\_id = 0: hệ thống sẽ trả về dữ liệu từ đầu ngày&#x20;
* notify\_id = -1: hệ thống sẽ trả về dữ liệu từ lúc kết nối lại
* &#x20;notify\_id = n: hệ thống sẽ trả về dữ liệu từ n. Trong đó, n bằng số thứ tự của message cuối cùng bạn nhận được trước khi đứt kết nối + 1.&#x20;

Trong quá trình nhận message stream, bạn cần lưu số thứ tự này để phục vụ cho mục đích kết nối lại trong trường hợp đứt kết nối.

Hệ thống FastConnect sẽ thực hiện reset notify\_id về 0 vào 0 giờ hàng ngày.&#x20;
{% endhint %}

#### Đăng ký cập nhật&#x20;

***Cập nhật thông tin lệnh***

```json
//Bind a callback function to: event onNewOrder:
client.bind(client.events.onOrderUpdate, function (e,data) {
	    console.log(e + ": ");
	    console.log(JSON.stringify(data));
    
});

//Bind a callback function to event onOrderError::
client.bind(client.events.onOrderError, function (e, data) {
	   console.log(e + ": ");
	   console.log(JSON.stringify(data));

```

***Cập nhật thông tin danh mục phái sinh***

```
client.bind(client.events.onClientPortfolioEvent,function(e,data){
Process data...
console.log(e + ": ");
console.log(JSON.stringify(data));
});
```

## Quy trình đặt lệnh

<figure><img src="/files/mbrdIfiarA1FthD2gJdw" alt=""><figcaption><p>Quy trình đặt lệnh và cập nhật kết quả qua streaming</p></figcaption></figure>
