# Rakmao X Easy Money
## Preparing Connection
### Rakmao environment
| Name | Endpoint | AuthString | Username | Password |
| ---------- | --------------------------------- | -------------------------------------------------------------------- | ---------- | ------------ |
| Test | https://rakmao-api-test.builk.com | eyJVc2VyTmFtZSI6ImVhc3ktbW9uZXkiLCJQYXNzd29yZCI6IkROZWFtMm11bFpyZyJ9 | easy-money | DNeam2mulZrg |
| Staging | https://apiprototype.rakmao.com | eyJVc2VyTmFtZSI6ImVhc3ktbW9uZXkiLCJQYXNzd29yZCI6IkROZWFtMm11bFpyZyJ9 | easy-money | DNeam2mulZrg |
| Production | https://api.rakmao.com | eyJVc2VyTmFtZSI6ImVhc3ktbW9uZXkiLCJQYXNzd29yZCI6Ims5T1BqVzk4dm9hUyJ9 | easy-money | k9OPjW98voaS |
> ทุกๆ Request ที่ทำการร้องขอมาที่ Rakmao ต้องแนบ Header มาด้วยดังนี้
```json=
authorization: Bearer {{access token}}
```
### Rakmao Request Authorization
#### Rqeuest Path `POST /api/v1/Authentication/RequestAPIToken`
> มี header เป็น "Content-Type: application/json"
> การ Request Authorization หรือการ Login ในที่นี้จะไม่สามารถใช้ User/Password และวิธีทั่วไปในการใช้งานเว็บไซต์ www.rakmao.com ให้ทำตามวิธีดังต่อไปนี้
> 1. นำ authen_string ที่ได้รับจากการลงทะเบียน (หมายเหตุ แจ้งให้ผู้พัฒนาลงทะเบียนให้) แนบลงในส่วนของ body ของ request
> 2. ทำการร้องขอ Method POST ไปที่ `{baseUrl}/api/v1/Authentication/RequestAPIToken` (หมายเหตุ baseUrl ในที่นี้หมายถึง Endpoint ในส่วน [Rakmao Environment](#Rakmao-Environment))
>
> หมายเหตุ authen_string ได้จากการนำ user/password ไปประกอบในรูปแบบ json และทำการ encoding ด้วย method base64, Example `{"UserName":"your-username","Password":"your-password"}`
**Body Request**
| Parameter | Description | Schema |
| ------------------------- | -------------------------------------- | ------------------- |
| authenString (*required*) | authen string ที่ได้รับจากการลงทะเบียน | string (plain/text) |
**Data Response**
| Parameter | Description | Schema |
| ----------- | ----------------- | ------ |
| token | token สำหรับแนบ ใน Header | string |
| refreshToken | token สำหรับ ในการร้องขอสิทธิ์ใหม่อีกครั้งหลังจากหมดอายุ | string |
| expiration | วันที่และเวลาหมดอายุของ token ที่ร้องขอ | DateTime |
**Example Request**
```
"authString..."
```
**Example Response**
```json
{
"status": 200,
"message": "Success",
"data": {
"token": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.****",
"refreshToken": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.****",
"expiration": 1613978508
}
}
```
### Rakmao Renew Authorization
#### Rqeuest Path `POST /api/v1/Authentication/RenewAPIToken`
> มี header เป็น "Content-Type: application/json"
> การ Renew Authorization คือการออก Token ใหม่โดยใช้สิทธ์ล่าสุดที่เคยได้รับ (หมายเหตุ ต้องเป็น refreshToken ล่าสุดเท่านั้น)
> 1. นำ refreshToken ที่ได้รับจากการ Rquest Authorization แนบลงในส่วนของ body ของ request
> 2. ทำการร้องขอ Method POST ไปที่ `{baseUrl}/api/v1/Authentication/RenewAPIToken` (หมายเหตุ baseUrl ในที่นี้หมายถึง Endpoint ในส่วน [Rakmao Environment](#Rakmao-Environment))
>
**Body Request**
| Parameter | Description | Schema |
| ------------------------- | -------------------------------------- | ------------------- |
| refreshToken (*required*) | refreshToken ที่ได้รับจากการ login ครั้งล่าสุด | string (plain/text) |
**Data Response**
| Parameter | Description | Schema |
| ----------- | ----------------- | ------ |
| token | token สำหรับแนบ ใน Header | string |
| refreshToken | token สำหรับ ในการร้องขอสิทธิ์ใหม่อีกครั้งหลังจากหมดอายุ | string |
| expiration | วันที่และเวลาหมดอายุของ token ที่ร้องขอ | DateTime |
**Example Request**
```
"refreshToken..."
```
**Example Response**
```json
{
"status": 200,
"message": "Success",
"data": {
"token": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.****",
"refreshToken": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.****",
"expiration": 1613978508
}
}
```
### Rakmao Body encryption
> ทุกๆ data ใน request body จะ encrypt ด้วย algorithm RSA256 และ key size 2048
#### Public Key for external
```xml
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCRNmt/q493jkP9
Mcm59VWwHe2qyBjBxZRrW+PX85/IiVWkU0RxZNg1vQ76DWEJ7SJmCUbziYetq/4M
l+fKFI7RroGg6s+PV1PsPYWNDhBAtYyEUiLXZ4oETGpvBzIdOmdW2HkgMTAMrf2g
aQ+JF6K9UNcFsVwPtZm7XuZbCG5QGwJka68UNa9fv8IOKk7tcLSjeEPOatvAnFtl
Q/dZEXThu/rlqQanuowUIoJQUQoiSPwzD0uqv5kdTNTJzKc8rnHy8ACcwJOwAHGA
Cd8qLOxBE7ZyM+KWxtIWfAqQeA1MJSIf8jzKiq/RdvllCnXH5jd1FU6hQ1ej2o14
aY/Fh9bPAgMBAAECggEAWnSD0iuUWu0L/RSejG/+yI5cFh4/DbV+FsJO05620bx6
1Lnp0Jj49cCnK6xZ3k0ROG5e/CWXlt+kiUO253KW5JbHuO2MDcZgSLCqGIvCJAzz
Uxm3Cmc82iCfzDm3Re2zoa2HBj6dp8haTSoku0k13qgUyT8KEd8VvFoJNHuz+8Fm
Lq+PLAj77AvzUnDCFbmv2DMdcI0EnfHHimEtrKzmqhPZROPqtu3ODN/N6Bs/kwW4
/ZGdMN+hhIBRxT777DcDaKjRfhBgIi5IZWrN0lpsRZM3SZCIWBZA+JDh0OiUIA3P
XojHrODvISdHooEs0LM6qOIOF0XWUv6bzpuIl9sLwQKBgQDTObVqcXdcY6K4KC4c
uCY0LorcPYp/vAt2Hhih20foDRIX40nPtRiSWOHnh3o8yW6xh7DtWbl0TVErV/Fy
5Q3vi9+7xxATQyLopFfC+ln2TdrRlJTj2oF/yTNIAOh04KXqfvdgMVr618hUrWbs
7czQXX/NZHM4Ei9DuFxJsgI2QwKBgQCv/nqvBDdTgU506ew2+8bHlMO7HtUW+FXd
hrnOga8kPWVJvuphEeIbegydV/UBITwkOJ8Q5NWq+2pwxZRcp/m1OS9O+bKFBkjf
+WyoxXgq+eXJpTwnqt8s/EDrSOlP0y3ZykQdurGc+4xf7YM7SF11KcPQpJU+Klhe
yZZvJDRihQKBgB9oeFpgjuAVDLAXgWvR0hR2Sz2ehQajXozswrrmkVWnA+a7bFFP
W1z/jG/SDFIXnbcWNy/D5Liven9Yb1WnS6AwC0+vtOs4U2uGbGpYsaHXR89cKZuL
9S+cKlztjaM7eFBbGsuZ6y5bgbVdp21Zmtfs30EaS6utwItwUYC/0GZjAoGARWAB
KIB29rngHYIglUQGhaIEzfxHb3iREHQNRnQkgBqblMhnR8Bu6vnfgx6q+7kIJhcT
zOsHtxDIUo/v/d5RNrjGB1Gyp3FkxLVjudutlPNRO32hCtn2g5skVBs3rTnHtzRe
SYHQhds66I2Nz46lGIxQHizij9DNaP/6BvG0nKkCgYB7XvDog+xVk105zRpiEgy/
QH/QsPmVZbBXadouuM6NIUBkJ8+Zwy9vfDDCz72aHFcwjbsvDzLcXT7sz+fuozSd
E7fd8kGt4KXwBDQgeXPHpz9l4pY2z+Q2AHuhHlpS2ge5nNYyPQUmnagYlQctAAXT
69qOEq6ZuBcOqurGwkXcPg==
-----END PRIVATE KEY-----
```
#### Example data
> ผลลัพท์ที่ได้จาก body ของ requst เกิดจากการเข้ารหัสด้วย public key
```xml
QQ7isQTCS35dkoQD6yoBQ1HMJNzdXgjeC7BvVFfjAl5qMNeMFuqp6FgHcXQYlo3Fva7R3uW53Dpj0DdR6EJv87LpX4zLBSMrmWdOuTJOYpKhcQeh8hv85+aXHdTUYRtD2udKWJxjVwDpBq7EN6ppkD4vocYycPNchSffUnZRA6t/3AOqKwMoDw5tKQzX0YdRCyNBoOfPIe1+wPkOZIg28CBcWfld8Ba/7nHeALVvY9LqvstyY/OK8M1WdsmhmM6ytuqrTfnGrv0h8rh+Op+M1ea2U7A45kMCWngErgkk2db1H2eMudKp6iOT1/oH6FTYKRaqo7O3DPO4xKKiqxkdIg==
```
> ผลลัพท์ที่คาดหวังจากการนำข้อมูลด้านบน ถอดรหัสด้วย private key ที่แนบไว้
```json
{
"Id": "ex001",
"Name": "Example Name",
"Age": 100,
"Type": [
1,
2,
3,
4
]
}
```
### Rakmao Response model
> เป็น model ที่นำไปใช้ในการตอบกลับของทุกๆ API และจะละเว้นการอธิบาย model นี้ในทุกๆ API ต่อไป
| Parameter | Description | Schema |
| --------- | -------------------------------------- |-------------|
| Data | ค่าที่ตอบกลับจากการทำงานของAPI นั้นๆ (ไม่มีการตอบกลับอนุญาติให้เป็น null) | Object |
| Status | สถานะการทำงานของ API นั้นๆ โดยหมวด 2xx คือทำงานปกติ 4xx คือข้อมูลบ้างอย่างไม่ถูกต้อง และ 5xx เป็นการทำงานผิดปกติของทาง API โดยถ้าได้รับ status หมวด 5xx สามารถแจ้งทีมงานเพื่อตรวจสอบได้ | Integer |
| Messge | คำอธิบายขยายความของ Status เบื้องต้น โดยหมวด 2xx จะเป็น success 4xx ส่วนใหญ่จะเป็นข้อบงชี้ของข้อมูลที่ไม่ถูกต้อง และ 5xx จะเป็น error ของตัวระบบ | String |
### Action flow
#### User from rakmao register easymoney
```mermaid
sequenceDiagram
participant Customer
participant Rakmao
participant EasyMoney
autonumber
Customer->>Rakmao: Interest Ads and click !
activate Rakmao
Note right of Rakmao: Create token user data with time expired session
Rakmao->>EasyMoney: Redirect with token
deactivate Rakmao
EasyMoney->>Rakmao: Use token to request user data
Note left of EasyMoney: API:RequestUserDetail
activate Rakmao
Rakmao->>EasyMoney: Return user data with rsa encryption
deactivate Rakmao
activate EasyMoney
EasyMoney->>Customer: decryption data and return autofill register page
deactivate EasyMoney
Customer->>EasyMoney: User register
EasyMoney->>Rakmao: Send customer code when register success
Note left of EasyMoney: API:SendSuccessRegister
```
#### User rakmao use the service easymoney
```mermaid
sequenceDiagram
participant Customer
participant EasyMoneyBranch
participant EasyMoney
participant Rakmao
autonumber
Customer->>EasyMoneyBranch: Make transection
EasyMoneyBranch->>Customer: Give cash of transection
EasyMoneyBranch->>EasyMoney: Insert/Update transection
EasyMoney->>Rakmao: Send success transection data with Ref code
Note right of EasyMoney: API:SendSuccessTransection
```
## Rakmao API
### `POST /api/v1/ExternalInterface/EasyMoney/RequestUserDetail/{token}`
**QueryParam Request**
| Parameter | Description | Schema |
| ------------------------- | ------------------------------------------------- | ------ |
| token (*required*) | Token ที่แนบไปทาง query param เมื่อผู้ใช้งานสนใจสมัครผ่าน rakmao | Guid |
**Response Model (after Decyption)**
| Parameter | Description | Schema |
| ------------ | ----------- | ------ |
| FirstName | | string |
| LastName | | string |
| Email | | string |
| Province | | string |
| PhoneNumber | | string |
| CustomerCode | | string |
#### Example Request
```json=
https://rakmao-api-test.builk.com/api/v1/ExternalInterface/EasyMoney/RequestUserDetail/MGNmNWEzMmItZDYwOC00YmNlLTg2ZmMtOTE5MDE0ZDlkNjVl
```
#### Example Response
```json
{
"Status": 200,
"Message": "success",
"Data": "QQ7isQTCS35dkoQD6yoBQ1HMJNzdXgjeC7BvVFfjAl5qMNeMFuqp6FgHcXQYlo3Fva7R3uW53Dpj0DdR6EJv87LpX4zLBSMrmWdOuTJOYpKhcQeh8hv85+aXHdTUYRtD2udKWJxjVwDpBq7EN6ppkD4vocYycPNchSffUnZRA6t/3AOqKwMoDw5tKQzX0YdRCyNBoOfPIe1+wPkOZIg28CBcWfld8Ba/7nHeALVvY9LqvstyY/OK8M1WdsmhmM6ytuqrTfnGrv0h8rh+Op+M1ea2U7A45kMCWngErgkk2db1H2eMudKp6iOT1/oH6FTYKRaqo7O3DPO4xKKiqxkdIg=="
}
```
#### Response Model
```json
{
"FirstName": "นายมาดี",
"LastName": "มีขันติ",
"Email": "madee_meekhanti@gmail.com",
"Province" : "กรุงเทพมหานคร"
"PhoneNumber": "0988899900",
"CustomerCode": "RM0001"
}
```
### `POST /api/v1/ExternalInterface/EasyMoney/SendSuccessRegister`
**Body Request**
| Parameter | Description | Schema |
| ------------------------- | ------------------------------------------------- | ------ |
| CustomerCode | | string |
| Timestamp | | Date |
#### Example Request
```json=
{
"CustomerCode": "RM0001",
"Timestamp": "2022-03-31T08:00:00.0000000Z"
}
```
#### Example Response
```json
{
"Status": 200,
"Message": "success",
"Data": true
}
```
### `POST /api/v1/ExternalInterface/EasyMoney/SendSuccessTransection`
**Body Request**
| Parameter | Description | Schema |
| ------------------------- | ------------------------------------------------- | ------ |
| CustomerCode | | string |
| TransectionAmount | | number |
| TransectionDate | | Date |
#### Example Request
```json=
{
"CustomerCode": "7d9b2a6c-8166-4e18-a66c-c335b1083258",
"TransectionAmount": "32500",
"TransectionDate": "2022-03-31T08:00:00.0000000Z"
}
```
#### Example Response
```json
{
"Status": 200,
"Message": "success",
"Data": true
}
```