# 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 } ```