diff --git a/packages/relay/README.md b/packages/relay/README.md index 9fc2c32c..c21a22ee 100644 --- a/packages/relay/README.md +++ b/packages/relay/README.md @@ -37,6 +37,3 @@ - 상점의 정산 정보 조회 - 상점의 인출 정보 조회 -## 3. 마일리지를 사용한 결제 프로세스 - -[마일리지를 사용한 결제 프로세스](docs%2Floyalty-payment.md) diff --git a/packages/relay/docs/loyalty-pament-diagram01.png b/packages/relay/docs/loyalty-pament-diagram01.png deleted file mode 100644 index 71904278..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram01.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-pament-diagram02.png b/packages/relay/docs/loyalty-pament-diagram02.png deleted file mode 100644 index 75b0537f..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram02.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-pament-diagram03.png b/packages/relay/docs/loyalty-pament-diagram03.png deleted file mode 100644 index 6c7b75b4..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram03.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-pament-diagram04.png b/packages/relay/docs/loyalty-pament-diagram04.png deleted file mode 100644 index 361fc0f0..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram04.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-pament-diagram10.png b/packages/relay/docs/loyalty-pament-diagram10.png deleted file mode 100644 index fbcba35f..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram10.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-pament-diagram21.png b/packages/relay/docs/loyalty-pament-diagram21.png deleted file mode 100644 index 60dfa76d..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram21.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-pament-diagram22.png b/packages/relay/docs/loyalty-pament-diagram22.png deleted file mode 100644 index 2eaf3404..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram22.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-pament-diagram23.png b/packages/relay/docs/loyalty-pament-diagram23.png deleted file mode 100644 index 5a0723a5..00000000 Binary files a/packages/relay/docs/loyalty-pament-diagram23.png and /dev/null differ diff --git a/packages/relay/docs/loyalty-payment.md b/packages/relay/docs/loyalty-payment.md deleted file mode 100644 index 55816579..00000000 --- a/packages/relay/docs/loyalty-payment.md +++ /dev/null @@ -1,1262 +0,0 @@ -# 로열티를 사용한 결제 프로세스 - -- [1. 시퀀스 다이어그램](#1-시퀀스-다이어그램) - - - [1.1. 신규결제에 대한 사용자가 승인 했을 때 과정](#11-신규결제에-대한-사용자가-승인-했을-때-과정) - - [1.2. 신규결제에 대한 사용자가 거부 했을 때 과정](#12-신규결제에-대한-사용자가-거부-했을-때-과정) - - [1.3. 취소결제에 대한 상점주가 승인 했을 때 과정](#13-취소결제에-대한-상점주가-승인-했을-때-과정) - - [1.4. 취소결제에 대한 상점주가 거부 했을 때 과정](#14-취소결제에-대한-상점주가-거부-했을-때-과정) - - [1.5. 상점 정보 추가](#15-상점-정보-추가) - - [1.6. 상점 정보 변경](#16-상점-정보-변경) - - [1.7. 상점 활성 상태 변경](#17-상점-활성-상태-변경) - - [1.8. 상점의 정산 요청 및 처리 과정](#18-상점의-정산-요청-및-처리-과정) - -- [2. URL](#2-url) - -- [3. KIOSK 를 위한 일반적인 엔드포인트](#3-kiosk-를-위한-일반적인-엔드포인트) - - - [3.1. 사용자의 로열티 잔고](#31-사용자의-로열티-잔고) - - [3.2. 지불에 사용될 예상 로열티 산출](#32-지불에-사용될-예상-로열티-산출) - - [3.3. 상점의 정보](#33-상점의-정보) - - [3.4. 모든 상점의 정보](#34-모든-상점의-정보) - - [3.5. 환률 변환](#36-환률-변환) - -- [4. KIOSK 를 위한 결제관련 엔드포인트](#4-kiosk-를-위한-결제관련-엔드포인트) - - - [4.1. 신규 결제 생성](#41-신규-결제-생성) - - [4.2. 신규 결제 완료](#42-신규-결제-완료) - - [4.3. 취소 결제 생성](#43-취소-결제-생성) - - [4.4. 취소 결제 완료](#44-취소-결제-완료) - - [4.5. 결제용 콜백 엔드포인트의 응답 데이터의 형태](#45-콜백-결제용-엔드포인트의-응답-데이터의-형태) - - [4.6. 결제용 콜백 엔드포인트의 응답 데이터의 예시](#46-콜백-결제용-엔드포인트의-응답-데이터의-예시) - -- [5. KIOSK 를 위한 상점관련 엔드포인트](#5-kiosk-를-위한-상점관련-엔드포인트) - - - [5.1. 상점 정보 변경](#51-상점-정보-변경) - - [5.2. 상점 활성 상태 변경](#52-상점-활성-상태-변경) - - [5.3. 상점용 콜백 엔드포인트의 응답 데이터의 형태](#53-콜백-상점용-엔드포인트의-응답-데이터의-형태) - - [5.4. 상점용 콜백 엔드포인트의 응답 데이터의 예시](#54-콜백-상점용-엔드포인트의-응답-데이터의-예시) - -- [6. 사용자용 모바일 앱을 위한 엔드포인트](#6-사용자용-모바일-앱을-위한-엔드포인트) - - - [6.1. 결제정보 요청](#61-결제정보-요청) - - [6.2. 결제승인](#62-신규-결제-승인거부) - - [6.3. 취소승인](#63-취소-결제-승인거부) - - [6.4. 사용자용 모바일 푸쉬 메세지의 정의](#64-사용자용-모바일-푸쉬-메세지의-정의) - -- [7. 상점용 모바일 앱을 위한 엔드포인트](#7-상점용-모바일-앱을-위한-엔드포인트) - - - [7.1. 상점 정보를 변경하는 작업을 조회](#71-상점-정보를-변경하는-작업을-조회) - - [7.2. 상점 정보 변경 승인/거부](#72-상점-정보-변경-승인거부) - - [7.3. 상점 활성 상태 변경 승인/거부](#73-상점-활성-상태-변경-승인거부) - - [7.4. 상점용 모바일 푸쉬 메세지의 정의](#74-상점용-모바일-푸쉬-메세지의-정의) - -- [8. 사용자 계정과 잔고](#8-사용자-계정과-잔고) - - [8.1. 사용자의 로열티 잔고 (지갑주소)](#81-사용자의-로열티-잔고-지갑주소) - - [8.2. 사용자의 로열티 잔고 (전화번호)](#82-사용자의-로열티-잔고-전화번호) - - [8.3. 사용자의 전화번호 해시](#83-사용자의-전화번호-해시) - -- [9. 응답 코드와 메세지](#9-응답-코드와-메세지) - -## 1. 시퀀스 다이어그램 - -### 1.1. 신규결제에 대한 사용자가 승인 했을 때 과정 - -![](loyalty-pament-diagram01.png) - -1. 사용자가 모바일앱에서 결제용 QR코드를 생성한다. -2. 사용자가 모바일화면의 QR코드를 KIOSK 에 입력한다. -3. KIOSK가 임시지갑주소를 이용하여 사용자의 잔고를 조회한다. -4. 잔고정보 응답 -5. KIOSK에서 DMS Relay 의 엔드포인트를 호출한다. -6. 응답 -7. 지갑이 내장된 모바일앱에 푸쉬메세지를 전송한다. -8. 사용자는 푸쉬메세지를 받고 해당 결제에 승인한다. -9. 결제를 진행하기 위해 컨트랙트를 호출한다. (자산을 임시계정으로 이동) -10. 컨트랙트의 실행후 이벤트를 수집한다. -11. 최종 결제 결과를 KIOSK로 전달한다. -12. 응답 -13. 최종승인 -14. 결제완료(자산을 이동함) -15. 응답 -16. 응답 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 1.2. 신규결제에 대한 사용자가 거부 했을 때 과정 - -![](loyalty-pament-diagram02.png) - -1. 사용자가 모바일앱에서 결제용 QR코드를 생성한다. -2. 사용자가 모바일화면의 QR코드를 KIOSK 에 입력한다. -3. KIOSK가 임시지갑주소를 이용하여 사용자의 잔고를 조회한다. -4. 잔고정보 응답 -5. KIOSK에서 DMS Relay 의 신규결제를 엔드포인트를 호출한다. -6. 응답 -7. 지갑이 내장된 모바일앱에 푸쉬메세지를 전송한다. -8. 사용자는 푸쉬메세지를 받고 해당 결제에 거부한다. -9. 최종 거부된 결과를 KIOSK로 전달한다. -10. 응답 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 1.3. 취소결제에 대한 상점주가 승인 했을 때 과정 - -![](loyalty-pament-diagram03.png) - -1. KIOSK에서 DMS Relay 의 취소결제 엔드포인트를 호출한다. -2. 응답 -3. 지갑이 내장된 모바일앱에 푸쉬메세지를 전송한다. -4. 상점주는 푸쉬메세지를 받고 해당 결제에 대해서 취소를 승인한다. -5. 취소결제를 진행하기 위해 컨트랙트를 호출한다. (자산을 임시계정으로 이동) -6. 컨트랙트의 실행후 이벤트를 수집한다. -7. 최종 결제 결과를 KIOSK로 전달한다. -8. 응답 -9. 최종승인 -10. 결제완료(자산을 이동함) -11. 응답 -12. 응답 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 1.4. 취소결제에 대한 상점주가 거부 했을 때 과정 - -![](loyalty-pament-diagram04.png) - -1. KIOSK에서 DMS Relay 의 취소결제 엔드포인트를 호출한다. -2. 응답 -3. 지갑이 내장된 모바일앱에 푸쉬메세지를 전송한다. -4. 상점주는 푸쉬메세지를 받고 해당 결제에 대해서 취소를 거부한다. -5. 결제거부를 KIOSK로 전달한다. -6. 응답 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 1.5. 상점 정보 추가 - -![](loyalty-pament-diagram21.png) - -1. 상점주가 상점정보를 추가한다 -2. 스마트컨트랙트에 추가한다. 이때는 비활성화 상태이다. -3. 응답 -4. 추가된 상점정보를 KIOSK로 전달한다. -5. 응답 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 1.6. 상점 정보 변경 - -![](loyalty-pament-diagram22.png) - -1. KIOSK에서 DMS Relay 의 상점정보 변경 엔드포인트를 호출한다. -2. 상점주의 앱으로 푸쉬알림을 보낸다 -3. 상점주는 푸쉬메세지를 받고 해당 변경에 대해서 승인한다. -4. 스마트컨트랙트에 상점정보를 변경한다. -5. 응답 -6. 변경된 상점정보를 KIOSK로 전달한다. -7. 응답 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 1.7. 상점 활성 상태 변경 - -![](loyalty-pament-diagram23.png) - -1. KIOSK에서 DMS Relay 의 상점의 활성 상태 변경 엔드포인트를 호출한다. -2. 상점주의 앱으로 푸쉬알림을 보낸다 -3. 상점주는 푸쉬메세지를 받고 해당 활성 상태 변경에 대해서 승인한다. -4. 스마트컨트랙트에 상점정보의 활성 상태를 변경한다. -5. 응답 -6. 변경된 상점정보의 활성 상태를 KIOSK로 전달한다. -7. 응답 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 1.8. 상점의 정산 요청 및 처리 과정 - -![](loyalty-pament-diagram10.png) - -1. 상점주가 정산금을 앱을 통해 요청한다. -2. -3. 모바일 앱은 직접 스마트컨트랙트를 호출하지 않고 DMS Relay에 전달한다.(DMS-SDK를 이용한다) -4. -5. DMS Relay는 스마트컨트랙트의 인출을 등록한다. -6. -7. 인출이 등록되면 이벤트가 발생한다. 이것을 수집하여 데이타베이스에 인덱싱한다. -8. 수집된 이벤트들을 제공하는 관리자 페이지에서 관리자가 확인 후 정산금을 상점주에게 이체한다. -9. 상점주는 인출금을 확인한다. -10. 인출금이 정상적으로 입금된 것을 확인한 후 인출완료를 하여 과정을 종결한다. 그렇지 않으면 추가적인 인출등록이 불가능하다.(DMS-SDK를 이용한다) -11. -12. 스마트컨트랙트를 호출하여 인출완료 처리한다. 이때 컨트랙트 내부의 누적 인출된 금액이 증가된다. - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -## 2. URL - -- 메인넷: https://relay.main.acccoin.io -- 테스트넷: https://relay.test.acccoin.io -- 개발넷: http://relay.dev.acccoin.io:27070 - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -## 3. KIOSK 를 위한 일반적인 엔드포인트 - -주의: 모든 금액은 소수점 18자리의 문자로 표현됩니다. 그리고 소수점은 포함하지 않습니다. - -### 3.1. 사용자의 로열티 잔고 - -#### - HTTP Request - -`GET /v1/payment/user/balance` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- |---------------------| -| account | string | Yes | 월렛주소 (임시주소 or 실제주소) | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| ----------- | ------ | ---- |--------------------------------------| -| account | string | Yes | 월렛주소 (실제주소) | -| balance | string | Yes | 잔고 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 3.2. 지불에 사용될 예상 로열티 산출 - -#### - HTTP Request - -`GET /v1/payment/info` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- |----------------------------------------| -| account | string | Yes | 월렛주소 (임시주소 or 실제주소) | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -|--------------| ------ | ---- |----------------------------------------| -| account | string | Yes | 월렛주소 (실제주소) | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| balance | string | Yes | 잔고 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| balanceValue | string | Yes | 잔고의 currency 단위의 가치 | -| paidPoint | string | Yes | (예상)지불될 포인트, loyaltyType가 0일때 유효한 값이다 | -| paidValue | string | Yes | 지불될 포인트 또는 토큰의 currency 단위의 가치 | -| feePoint | string | Yes | (예상)수수료 포인트, loyaltyType가 0일때 유효한 값이다 | -| feeValue | string | Yes | 수수료 포인트 또는 토큰의 currency 단위의 가치 | -| totalPoint | string | Yes | (예상)전체 포인트, loyaltyType가 0일때 유효한 값이다 | -| totalValue | string | Yes | 전체 포인트 또는 토큰의 currency 단위의 가치 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 3.3. 상점의 정보 - -#### - HTTP Request - -`GET /v1/payment/shop/info` -`GET /v1/shop/info/:shopId` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -|---------| ------ | ---- | ----------- | -| shopId | string | Yes | 상점 아이디 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -|-----------------| ------ | ---- |--------------------| -| shopId | string | Yes | 상점 아이디 | -| name | string | Yes | 상점 이름 | -| currency | string | Yes | 상점의 결제 통화 | -| status | int | Yes | 상점의 상태(1:활성, 2:비활성) | -| account | string | Yes | 상점주의 월렛주소 | -| providedAmount | string | Yes | 누적된 상점에서 제공한 로열티 포인트 | -| usedAmount | string | Yes | 누적된 상점에서 사용된 로열티 포인트 | -| refundedAmount | string | Yes | 이미 반환된 정산금액 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 3.4. 모든 상점의 정보 - -모든 상점의 정보를 제공한다. - -#### - HTTP Request - -`GET /v1/shop/list` - -#### - HTTP Header -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -|------------|--------| ---- |--------------------------| -| pageNumber | number | Yes | 페이지 번호, 1부터 시작됨 | | -| pageSize | number | Yes | 페이지당 레코드 갯수, 최소 1, 최대 50 | - -#### - 결과 - -| 필드명 | 하부필드명 | 유형 | 필수 | 설명 | -|----------|---------------------|--------|-----|---------------------------| -| pageInfo | totalCount | number | Yes | 전체 레코드의 갯수 | -| pageInfo | totalPages | number | Yes | 전체 페이지의 갯수 | -| | | | | 아래 레코드는 배열이고, 여러번 반복된다. | -| shops | shopId | string | Yes | 상점 아이디 | -| shops | name | string | Yes | 상점 이름 | -| shops | currency | string | Yes | 상점의 결제통화의 심벌 | -| shops | status | string | Yes | 상점의 상태 | -| shops | account | string | Yes | 상점주의 지갑주소 | -| shops | providedAmount | string | Yes | 상점에서 제공된 로열티의 금액(결제통화단위) | -| shops | usedAmount | string | Yes | 상점에서 사용된 로열티의 금액(결제통화단위) | -| shops | refundedAmount | string | Yes | 이미 반환된 정산금액(결제통화단위) | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 3.5. 환률 변환 - -#### - HTTP Request - -`GET /v1/payment/convert/currency` -`GET /v1/currency/convert` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -|--------|--------| ---- |---------------------------------------| -| amount | string | Yes | 금액 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| from | string | Yes | 변환 할 환률코드(usd, krw, lyt, acc, point...) | | -| to | string | Yes | 변환 될 환률코드(usd, krw, lyt, acc, point...) | - -#### - 결과 - -| 필드명 | 하부필드명 | 유형 | 필수 | 설명 | -|----------|---------------------|--------|------------------------------------------|---------------------------| -| amount | string | Yes | 변환된 환률 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -## 4. KIOSK 를 위한 결제관련 엔드포인트 - -### 4.1. 신규 결제 생성 - -[1.1. 시퀀스 다이어그램](#11-신규결제에-대한-사용자가-승인-했을-때-과정) 의 5번에서 사용된다. - -#### - HTTP Request - -`POST /v1/payment/new/open` - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- |----------------------------------------| -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소(임시주소) | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| -------------------- | ------ | ---- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| paymentId | string | Yes | 지불 아이디 | -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소(실제주소) | -| paidPoint | string | Yes | (예상)지불될 포인트, loyaltyType가 0일때 유효한 값이다 | -| paidValue | string | Yes | 지불될 포인트 또는 토큰의 currency 단위의 가치 | -| feePoint | string | Yes | (예상)수수료 포인트, loyaltyType가 0일때 유효한 값이다 | -| feeValue | string | Yes | 수수료 포인트 또는 토큰의 currency 단위의 가치 | -| totalPoint | string | Yes | (예상)전체 포인트, loyaltyType가 0일때 유효한 값이다 | -| totalValue | string | Yes | 전체 포인트 또는 토큰의 currency 단위의 가치 | -| paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | -| openNewTimestamp | int | Yes | 신규결제 생성 명령어 접수 시간 | -| closeNewTimestamp | int | Yes | 신규결제 완료 명령어 접수 시간 | -| openCancelTimestamp | int | Yes | 취소결제 생성 명령어 접수 시간 | -| closeCancelTimestamp | int | Yes | 취소결제 완료 명령어 접수 시간 | - -#### - 기타 - -- 요청후 45초간 콜백엔드포인트로 응답이 없으면 타입아웃 처리 할 수 있다. - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 4.2. 신규 결제 완료 - -[1.1. 시퀀스 다이어그램](#11-신규결제에-대한-사용자가-승인-했을-때-과정) 의 13번에서 사용된다. - -#### - HTTP Request - -`POST /v1/payment/new/close` - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -|-----------|---------| ---- |-------------------------------------| -| confirm | boolean | Yes | 정상 또는 취소 여부 (true: 정상처리, false: 취소) | -| paymentId | string | Yes | 지불 아이디 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -|----------------------| ------ | ---- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| paymentId | string | Yes | 지불 아이디 | -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소(실제주소) | -| paidPoint | string | Yes | (예상)지불될 포인트, loyaltyType가 0일때 유효한 값이다 | -| paidValue | string | Yes | 지불될 포인트 또는 토큰의 currency 단위의 가치 | -| feePoint | string | Yes | (예상)수수료 포인트, loyaltyType가 0일때 유효한 값이다 | -| feeValue | string | Yes | 수수료 포인트 또는 토큰의 currency 단위의 가치 | -| totalPoint | string | Yes | (예상)전체 포인트, loyaltyType가 0일때 유효한 값이다 | -| totalValue | string | Yes | 전체 포인트 또는 토큰의 currency 단위의 가치 | -| paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | -| openNewTimestamp | int | Yes | 신규결제 생성 명령어 접수 시간 | -| closeNewTimestamp | int | Yes | 신규결제 완료 명령어 접수 시간 | -| openCancelTimestamp | int | Yes | 취소결제 생성 명령어 접수 시간 | -| closeCancelTimestamp | int | Yes | 취소결제 완료 명령어 접수 시간 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 4.3. 취소 결제 생성 - -[1.3. 시퀀스 다이어그램](#13-취소결제에-대한-상점주가-승인-했을-때-과정) 의 1번에서 사용된다. - -#### - HTTP Request - -`POST /v1/payment/cancel/open` - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- | ----------- | -| paymentId | string | Yes | 지불 아이디 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| -------------------- | ------ | ---- |---------------------------------------------------------------------------------------------------------------------------------------------------------| -| paymentId | string | Yes | 지불 아이디 | -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소(실제주소) | -| paidPoint | string | Yes | (예상)지불될 포인트, loyaltyType가 0일때 유효한 값이다 | -| paidValue | string | Yes | 지불될 포인트 또는 토큰의 currency 단위의 가치 | -| feePoint | string | Yes | (예상)수수료 포인트, loyaltyType가 0일때 유효한 값이다 | -| feeValue | string | Yes | 수수료 포인트 또는 토큰의 currency 단위의 가치 | -| totalPoint | string | Yes | (예상)전체 포인트, loyaltyType가 0일때 유효한 값이다 | -| totalValue | string | Yes | 전체 포인트 또는 토큰의 currency 단위의 가치 | -| paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | -| openNewTimestamp | int | Yes | 신규결제 생성 명령어 접수 시간 | -| closeNewTimestamp | int | Yes | 신규결제 완료 명령어 접수 시간 | -| openCancelTimestamp | int | Yes | 취소결제 생성 명령어 접수 시간 | -| closeCancelTimestamp | int | Yes | 취소결제 완료 명령어 접수 시간 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 4.4. 취소 결제 완료 - -[1.3. 시퀀스 다이어그램](#13-취소결제에-대한-상점주가-승인-했을-때-과정) 의 9번에서 사용된다. - -#### - HTTP Request - -`POST /v1/payment/cancel/close` - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- |-------------------------------------| -| confirm | boolean | Yes | 정상 또는 취소 여부 (true: 정상처리, false: 취소) | -| paymentId | string | Yes | 지불 아이디 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| -------------------- | ------ | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| paymentId | string | Yes | 지불 아이디 | -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소(실제주소) | -| paidPoint | string | Yes | (예상)지불될 포인트, loyaltyType가 0일때 유효한 값이다 | -| paidValue | string | Yes | 지불될 포인트 또는 토큰의 currency 단위의 가치 | -| feePoint | string | Yes | (예상)수수료 포인트, loyaltyType가 0일때 유효한 값이다 | -| feeValue | string | Yes | 수수료 포인트 또는 토큰의 currency 단위의 가치 | -| totalPoint | string | Yes | (예상)전체 포인트, loyaltyType가 0일때 유효한 값이다 | -| totalValue | string | Yes | 전체 포인트 또는 토큰의 currency 단위의 가치 | -| paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | -| closeNewTimestamp | int | Yes | 신규결제 완료 명령어 접수 시간 | -| openCancelTimestamp | int | Yes | 취소결제 생성 명령어 접수 시간 | -| closeCancelTimestamp | int | Yes | 취소결제 완료 명령어 접수 시간 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 4.5. 콜백 결제용 엔드포인트의 응답 데이터의 형태 - -[1.1. 시퀀스 다이어그램](#11-신규결제에-대한-사용자가-승인-했을-때-과정) 의 11번에서 사용된다. -[1.3. 시퀀스 다이어그램](#13-취소결제에-대한-상점주가-승인-했을-때-과정) 의 7번에서 사용된다. - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -### - 입력 -| 필드 1 | 필드 2 | 유형 | 필수 | 설명 | -| --------- |-----------------| ------ | ---- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| type | | string | Yes | "pay_new": 결제요청
"pay_cancel":취소요청 | -| code | | int | Yes | 0: 성공
4000: 거부
5000: 컨트랙트 오류
6000: 서버오류
7000: 타임아웃 | -| message | | string | Yes | 응답 메세지 | -| data | paymentId | string | Yes | 결제 아이디 | -| data | purchaseId | string | Yes | 구매 아이디 | -| data | amount | string | Yes | 상품가격 | -| data | currency | string | Yes | 환률코드 | -| data | shopId | string | Yes | 상점 아이디 | -| data | account | string | Yes | 월렛 주소(실제주소) | -| data | paidPoint | string | Yes | 지불될 포인트, loyaltyType가 0일때 유효한 값이다
(결제요청 성공시:지불된값, 결제요청 실패시:예상값, 취소시: 지불된값) | -| data | paidValue | string | Yes | 지불될 포인트 또는 토큰의 currency 단위의 가치 | -| data | feePoint | string | Yes | 수수료 포인트, loyaltyType가 0일때 유효한 값이다(결제요청 성공시:지불된값, 결제요청 실패시:예상값, 취소시: 지불된값) | -| data | feeValue | string | Yes | 수수료 포인트 또는 토큰의 currency 단위의 가치 | -| data | totalPoint | string | Yes | 전체 포인트, loyaltyType가 0일때 유효한 값이다(결제요청 성공시:지불된값, 결제요청 실패시:예상값, 취소시: 지불된값) | -| data | totalValue | string | Yes | 전체 포인트 또는 토큰의 currency 단위의 가치 | -| data | paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | - - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 4.6 콜백 결제용 엔드포인트의 응답 데이터의 예시 - -#### 결제 성공했을 때의 응답 - -```json -{ - "type": "pay_new", - "code": 0, - "message": "Success", - "data": { - "paymentId": "0x04785fda06b5e8c61bc857884b66663ed55bf61269508656a5cc7e5df5a7510b", - "purchaseId": "P000002", - "amount": "10000000000000000000", - "currency": "krw", - "shopId": "0x62f131c124c10dd7023e2d1a98ac8aa4c925137207118178d0267d2079447a65", - "account": "0x2793111915DA87B03F90ee0Cb6E0709A8514891F", - "paidPoint": "10000000000000000000", - "paidValue": "10000000000000000000", - "feePoint": "500000000000000000", - "feeValue": "500000000000000000", - "totalPoint": "10500000000000000000", - "totalValue": "10500000000000000000", - "paymentStatus": 18 - } -} -``` - -#### 결제 거부했을 때의 응답 - -```json -{ - "type": "pay_new", - "code": 4000, - "message": "Denied by user", - "data": { - "paymentId": "0x9aa18cfb0df5e528f0415fb1aeea2b2454508655314bf58b91f96e4502b22828", - "purchaseId": "P000002", - "amount": "10000000000000000000", - "currency": "krw", - "shopId": "0x7f67cd5291da2f283ca5bad25c836fa76f3855cc892e55984ead1af46b2db38a", - "account": "0x3beF528430a09b12a52ea65F3cBcdCb96444E7d2", - "paidPoint": "10000000000000000000", - "paidValue": "10000000000000000000", - "feePoint": "500000000000000000", - "feeValue": "500000000000000000", - "totalPoint": "10500000000000000000", - "totalValue": "10500000000000000000", - "paymentStatus": 16 - } -} -``` - -#### 취소 성공했을 때의 응답 - -```json -{ - "type": "pay_cancel", - "code": 0, - "message": "Success", - "data": { - "paymentId": "0x491c07d0fee5eb7d129e21d9c818fb19f1c80603b519bf79ed42e486d8019bfc", - "purchaseId": "P000002", - "amount": "10000000000000000000", - "currency": "krw", - "shopId": "0x270e6da973370b647972531e965e27879211092f748e8382faa48de43e37055d", - "account": "0x2793111915DA87B03F90ee0Cb6E0709A8514891F", - "paidPoint": "10000000000000000000", - "paidValue": "10000000000000000000", - "feePoint": "500000000000000000", - "feeValue": "500000000000000000", - "totalPoint": "10500000000000000000", - "totalValue": "10500000000000000000", - "paymentStatus": 58 - } -} -``` - -#### 취소 거부했을 때의 응답 - -```json -{ - "type": "pay_cancel", - "code": 4000, - "message": "Denied by user", - "data": { - "paymentId": "0x61fc70b3a919aab586898fcfcc76e266e386c5a66a605a03d7569f5bd0ff7458", - "purchaseId": "P000002", - "amount": "10000000000000000000", - "currency": "krw", - "shopId": "0xf14d74201ab85a04e1f56cb43884592f9656b624100bf71313084076a9661112", - "account": "0x2793111915DA87B03F90ee0Cb6E0709A8514891F", - "paidPoint": "10000000000000000000", - "paidValue": "10000000000000000000", - "feePoint": "500000000000000000", - "feeValue": "500000000000000000", - "totalPoint": "10500000000000000000", - "totalValue": "10500000000000000000", - "paymentStatus": 56 - } -} -``` - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -## 5. KIOSK 를 위한 상점관련 엔드포인트 - -### 5.1. 상점 정보 변경 - -[1.6. 시퀀스 다이어그램](#16-상점-정보-변경) 의 1번에서 사용된다. - -#### - HTTP Request - -`POST /v1/shop/update/create` - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| --------------- | ------ | ---- | -------------------------------------- | -| shopId | string | Yes | 상점 아이디 | -| name | string | Yes | 상점 이름 | -| currency | string | Yes | 상점의 결제 통화 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| --------------- | ------ | ---- |-----------------------------------------------------------------------------------------------------| -| taskId | string | Yes | 처리를 작업 아이디 | -| shopId | string | Yes | 상점 아이디 | -| name | string | Yes | 상점 이름 | -| currency | string | Yes | 상점의 결제 통화 | -| taskStatus | int | Yes | 처리상태
11 : 시작
12 : 접수실패
13 : 승인실패
14 : 접수완료
15 : 사용자거부
16 : 완료
70 : 타임아웃 | -| timestamp | int | Yes | 접수 시간 | - -#### - 기타 - -- 요청후 45초간 콜백엔드포인트로 응답이 없으면 타입아웃 처리 할 수 있다. - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 5.2. 상점 활성 상태 변경 - -[1.7. 시퀀스 다이어그램](#17-상점-활성-상태-변경) 의 1번에서 사용된다. - -#### - HTTP Request - -`POST /v1/shop/status/create` - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- | ------------------------------------ | -| shopId | string | Yes | 상점 아이디 | -| status | int | Yes | 활성상태
1 : 활성
2 : 비활성 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -|--------------| ------ | ---- | ----------------------------------------------------------------------------- | -| taskId | string | Yes | 처리를 작업 아이디 | -| shopId | string | Yes | 상점 아이디 | -| status | int | Yes | 활성상태
1 : 활성
2 : 비활성 | -| taskStatus | int | Yes | 처리상태
11 : 시작
12 : 접수실패
13 : 승인실패
14 : 접수완료
15 : 사용자거부
16 : 완료
70 : 타임아웃 | -| timestamp | int | Yes | 접수 시간 | - -#### - 기타 - -- 요청후 45초간 콜백엔드포인트로 응답이 없으면 타입아웃 처리 할 수 있다. - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 5.3. 콜백 상점용 엔드포인트의 응답 데이터의 형태 - -#### - HTTP Header - -| 키 | 설명 | -|-----------------|--------------| -| Authorization | 접근 비밀키 | - -#### - 입력 - -| 필드 1 | 필드 2 | 유형 | 필수 | 설명 | -| --------- |-----------------| ------ | ---- |--------------------------------------------------------------------| -| type | | string | Yes | "shop_add": 추가
"shop_update": 정보수정
"shop_status":상태수정 | -| code | | int | Yes | 0: 성공
4000: 거부
5000: 컨트랙트 오류
6000: 서버오류
7000: 타임아웃 | -| message | | string | Yes | 응답 메세지 | -| data | taskId | string | Yes | 처리 아이디 | -| data | shopId | string | Yes | 상점 아이디 | -| data | name | string | Yes | 상점 이름 | -| data | currency | string | Yes | 상점의 결제통화 | -| data | status | int | Yes | 활성상태(1:활성, 2:비활성) | | -| data | account | string | Yes | 상점주의 지갑주소 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - -### 5.4. 콜백 상점용 엔드포인트의 응답 데이터의 예시 - -#### 상점 정보가 추가되었을 때의 응답 - -```json -{ - "type": "shop_add", - "code": 0, - "message": "Success", - "data": { - "taskId": "", - "shopId": "0xb2980bfac07826f2f93bea8434b569a2a458cbbd39b812a062ddcd7d1fa8fff9", - "name": "Shop 5", - "currency": "krw", - "status": 2, - "account": "0x5b9aD6ad05c0fC423B34C1EaF2FF67C47F02E0D1" - } -} -``` - -#### 상점 정보가 변경되었을 때의 응답 - -```json -{ - "type": "shop_update", - "code": 0, - "message": "Success", - "data": { - "taskId": "0x005423085d89ebc3edea3f8dd6bc4cfff0446c7393d22bf2de9f81c6f24e8ad0", - "shopId": "0xb29991db39fc61c96b5048b9d8863dbe40d556e1ae29c758c48468ffe3ecabad", - "name": "새로운 이름", - "currency": "krw", - "status": 2, - "account": "0x1956F0c574ee588efd4759948a40611613C87Bc6" - } -} -``` - -#### 상점의 상태가 변경되었을 때의 응답 - -```json -{ - "type": "shop_status", - "code": 0, - "message": "Success", - "data": { - "taskId": "0x5510311afd173081a0511559ed950634217e29c81f55a62f57bd4c3e434cfb89", - "shopId": "0xb29991db39fc61c96b5048b9d8863dbe40d556e1ae29c758c48468ffe3ecabad", - "name": "새로운 이름", - "currency": "krw", - "status": 1, - "account": "0x1956F0c574ee588efd4759948a40611613C87Bc6" - } -} -``` - ---- - -## 6. 사용자용 모바일 앱을 위한 엔드포인트 - -### 6.1. 결제정보 요청 - -#### - HTTP Request - -`GET /v1/payment/item` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- | ----------- | -| paymentId | string | Yes | 지불 아이디 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| -------------------- | ------ | ---- | ---------------------------------------------------------------------------------------------------------------------------- | -| paymentId | string | Yes | 지불 아이디 | -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소 | -| paidPoint | string | Yes | 지불될(된) 포인트, loyaltyType가 0일때 유효한 값이다 | -| paidValue | string | Yes | 지불될(된) 포인트 또는 토큰의 currency 단위의 가치 | -| feePoint | string | Yes | 수수료 포인트, loyaltyType가 0일때 유효한 값이다 | -| feeValue | string | Yes | 수수료 포인트 또는 토큰의 currency 단위의 가치 | -| totalPoint | string | Yes | 전체 포인트, loyaltyType가 0일때 유효한 값이다 | -| totalValue | string | Yes | 전체 포인트 또는 토큰의 currency 단위의 가치 | -| paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | -| openNewTimestamp | int | Yes | 신규결제 생성 명령어 접수 시간 | -| closeNewTimestamp | int | Yes | 신규결제 완료 명령어 접수 시간 | -| openCancelTimestamp | int | Yes | 취소결제 생성 명령어 접수 시간 | -| closeCancelTimestamp | int | Yes | 취소결제 완료 명령어 접수 시간 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 6.2. 신규 결제 승인/거부 - -[1.1. 시퀀스 다이어그램](#11-신규결제에-대한-사용자가-승인-했을-때-과정) 의 8번에서 사용된다. - -#### - HTTP Request - -`POST /v1/payment/new/approval` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------- | ---- | --------------------------------- | -| paymentId | string | Yes | 지불 아이디 | -| approval | boolean | Yes | 동의여부(false: 거부, true: 승인) | -| signature | string | Yes | 서명 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -|----------------| ------ | ---- | ---------------------------------------------------------------------------------------------------------------------------- | -| paymentId | string | Yes | 지불 아이디 | -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소 | -| paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | -| txHash | string | Yes | 트랜잭션 해시 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 6.3. 취소 결제 승인/거부 - -[1.2. 시퀀스 다이어그램](#13-취소결제에-대한-상점주가-승인-했을-때-과정) 의 8번에서 사용된다. - -#### - HTTP Request - -`POST /v1/payment/cancel/approval` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- | --------------------------------- | -| paymentId | string | Yes | 지불 아이디 | -| approval | string | Yes | 동의여부(false: 거부, true: 승인) | -| signature | string | Yes | 서명 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| ------------- | ------ | ---- | --------------------------------------------------------------------------------------------------------------------------- | -| paymentId | string | Yes | 지불 아이디 | -| purchaseId | string | Yes | 구매 아이디 | -| amount | string | Yes | 상품가격 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| currency | string | Yes | 환률코드(usd, krw, lyt, acc, acc, point...) | -| shopId | string | Yes | 상점 아이디 | -| account | string | Yes | 월렛주소 | -| paymentStatus | int | Yes | 처리상태
11:신규결제접수
12:신규결제승인접수실패
13:신규결제승인확인실패
14:신규결제승인접수완료
15:신규결제승인확인완료
16:신규결제사용자거부
17:신규결제결과응답
18:신규결제완료
19:신규결제실패
51:취소결제접수
52:취소결제승인접수실패
53:취소결제승인확인실패
54:취소결제승인접수완료
55:취소결제승인확인완료
56:취소결제사용자거부
57:취소결제결과응답
58:취소결제완료
59:취소결제실패 | -| txHash | string | Yes | 트랜잭션 해시 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 6.4. 사용자용 모바일 푸쉬 메세지의 정의 - -| 파라메타명 | 유형 | 설명 | -|----------|--------|---------------------------------------------------| -| type | string | provide : 지급시
new: 신규구매
cancel: 구매취소
| -| paymentId | string | 신규구매또는 취소시 유효한 키값 | -| timestamp | number | 접수시간(UNIX EPOCH) | -| timeout | string | 타임아웃(초) | - - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - -### 6.5. 사용자용 모바일 푸쉬 메세지의 정의 (상점) - -| 파라메타명 | 유형 | 설명 | -|----------|--------|---------------------------------------------| -| type | string | shop_update: 상점정보수정
shop_status: 상점상태수정 | -| taskId | string | 승인또는 취소시 사용되는 키값 | -| timestamp | number | 접수시간(UNIX EPOCH) | -| timeout | string | 타임아웃(초) | - - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -## 7. 상점용 모바일 앱을 위한 엔드포인트 - -### 7.1. 상점 정보를 변경하는 작업을 조회 - -#### - HTTP Request - -`GET /v1/shop/task` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- | ----------- | -| taskId | string | Yes | 지불 아이디 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| --------------- | ------ | ---- |-----------------------------------------------------------------------------------------------------| -| taskId | string | Yes | 처리를 작업 아이디 | -| type | string | Yes | "update" : 상점정보변경
"status" : 상점의 상태변경 | -| shopId | string | Yes | 상점 아이디 | -| name | string | Yes | 상점 이름 | -| currency | string | Yes | 상점의 결제 통화 | -| status | int | Yes | 활성상태
1 : 활성
2 : 비활성 | -| account | string | Yes | 상점주의 지갑주소 | -| taskStatus | int | Yes | 처리상태
11 : 시작
12 : 접수실패
13 : 승인실패
14 : 접수완료
15 : 사용자거부
16 : 완료
70 : 타임아웃 | -| timestamp | int | Yes | 접수 시간 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 7.2. 상점 정보 변경 승인/거부 - -#### - HTTP Request - -`POST /v1/shop/update/approval` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------- | ---- |---------------------------------| -| taskId | string | Yes | 지불 아이디 | -| approval | boolean | Yes | 승인여부
true: 승인
false: 거부 | -| signature | string | Yes | 서명 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| --------------- | ------ | ---- |-----------------------------------------------------------------------------------------------------| -| taskId | string | Yes | 처리를 작업 아이디 | -| shopId | string | Yes | 상점 아이디 | -| name | string | Yes | 상점 이름 | -| currency | string | Yes | 상점의 결제 통화 | -| taskStatus | int | Yes | 처리상태
11 : 시작
12 : 접수실패
13 : 승인실패
14 : 접수완료
15 : 사용자거부
16 : 완료
70 : 타임아웃 | -| timestamp | int | Yes | 접수 시간 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 7.3. 상점 활성 상태 변경 승인/거부 - -#### - HTTP Request - -`POST /v1/shop/status/approval` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------- | ---- | --------------------------------------- | -| taskId | string | Yes | 지불 아이디 | -| approval | boolean | Yes | 승인여부
true: 승인
false: 거부 | -| signature | string | Yes | 서명 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- | ----------------------------------------------------------------------------- | -| taskId | string | Yes | 처리를 작업 아이디 | -| shopId | string | Yes | 상점 아이디 | -| status | int | Yes | 활성상태
1 : 활성
2 : 비활성 | -| taskStatus | int | Yes | 처리상태
11 : 시작
12 : 접수실패
13 : 승인실패
14 : 접수완료
15 : 사용자거부
16 : 완료
70 : 타임아웃 | -| timestamp | int | Yes | 접수 시간 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 7.4. 상점용 모바일 푸쉬 메세지의 정의 - -| 파라메타명 | 유형 | 설명 | -|----------|--------|----------------------------------------------------------------------------------------------| -| type | string | shop_update: 상점정보수정
shop_status: 상점상태수정 | -| taskId | string | 상점정보수정과 상태수정시 유효한 키값 | -| timestamp | number | 접수시간(UNIX EPOCH) | -| timeout | string | 타임아웃(초) | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - - ---- - -## 8. 사용자 계정과 잔고 - -주의: 모든 금액은 소수점 18자리의 문자로 표현됩니다. 그리고 소수점은 포함하지 않습니다. - -### 8.1. 사용자의 로열티 잔고 (지갑주소) - -#### - HTTP Request - -`GET /v1/ledger/balance/account/:account` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- |-----------| -| account | string | Yes | 지갑주소 | - -#### - 결과 - -| 필드명 | 필드명2 | 유형 | 필수 | 설명 | -|-------------|---------|--------| ---- |------------------------------------------| -| account | | string | Yes | 지갑주소 | -| point | balance | string | Yes | 포인트 잔고 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| | value | string | Yes | 잔고의 기준통화 가치 | -| token | balance | string | Yes | 토큰 잔고 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| | value | string | Yes | 잔고의 기준통화 가치 (=토큰잔고 * 토큰가격(기준통화)) | - -### 8.2. 사용자의 로열티 잔고 (전화번호) - -#### - HTTP Request - -`GET /v1/ledger/balance/phone/:phone` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- |--------------------------------| -| phone | string | Yes | 전화번호 - 국제표기법 +82 10-1000-2000 | - -#### - 결과 - -| 필드명 | 필드명2 | 유형 | 필수 | 설명 | -|-------------|---------|--------| ---- |------------------------------------------| -| phone | | string | Yes | 사용자의 전화번호 | -| phoneHash | | string | Yes | 사용자의 전화번호 해시 | -| account | | string | Yes | 사용자의 지갑주소 (실제주소) | -| loyaltyType | | int | Yes | 적립되는 로열티의 종류(0: 포인트, 1: 토큰) | -| point | balance | string | Yes | 포인트 잔고 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| | value | string | Yes | 잔고의 기준통화 가치 | -| token | balance | string | Yes | 토큰 잔고 (소수점이하 18자리로 표시된 문자, 소수점 포함하지 않음) | -| | value | string | Yes | 잔고의 기준통화 가치 (=토큰잔고 * 토큰가격(기준통화)) | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- - -### 8.3. 사용자의 전화번호 해시 - -#### - HTTP Request - -`GET /v1/phone/hash/:phone` - -#### - 입력 파라메타들 - -| 파라메타명 | 유형 | 필수 | 설명 | -| ---------- | ------ | ---- |---------| -| phone | string | Yes | 전화번호 - 국제표기법 +82 10-1000-2000 | - -#### - 결과 - -| 필드명 | 유형 | 필수 | 설명 | -|------------|---------| ---- |---------------------------------------| -| phone | string | Yes | 전화번호 | -| phoneHash | string | Yes | 전화번호 해시 | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - - -## 9. 응답 코드와 메세지 -| 코드 | 메세지 | -|-------|---------------------------------------------------------------------------------------------------------------------------| -| 0000 | 성공
Success | -| 1000 | 트랜잭션을 보낸자가 검증자가 아닙니다
Sender is not validator | -| 1001 | 검증자가 활성화 되지 않았습니다
Validator is not active | -| 1002 | 검증자가 이미 활성화 되었습니다
Validator is already active | -| 1003 | 검증자가 이미 존재합니다
Validator is already exist | -| 1010 | 마지막 검증자를 제거할 수 없습니다
The last validator cannot be removed | -| 1020 | 예치가 허용되지 않습니다
Not allowed deposit | -| 1030 | 금액이 gwei의 배수가 아닙니다
Amount not multiple of gwei | -| 1031 | 입력된 금액이 최소금액보다 작습니다
The amount entered is less than the minimum amount | -| 1050 | 트랜잭션을 보낸자는 인증되지 않은 자입니다
Sender is not authorized to execute | -| 1051 | 전송이 되지 않는 자금입니다
Unable to transfer from system account | -| 1052 | 전송할 수 없는 주소입니다
Unable to transfer to system account | -| 1053 | 인출될 수 없는 자금입니다
Unable to withdraw from the system account | -| 1200 | 상점아이디가 이미 존재합니다
The shop ID already exists | -| 1201 | 상점아이디가 존재하지 않습니다
The shop ID is not exists | -| 1202 | 상점이 활성화 되지 않았습니다
The shop is not activated | -| 1211 | 지원되는 않는 통화심벌입니다
This exchange rate is not supported | -| 1220 | 인출자금이 부족합니다
Insufficient withdrawal amount | -| 1221 | 인출을 이미신청하셨니다
Withdrawal is already opened | -| 1222 | 인출이 신청하지 않았습니다
Withdrawal is not opened | -| 1501 | 잘못된 서명입니다
Invalid signature | -| 1502 | 등록되지 않은 전화번호입니다
Unregistered phone number | -| 1503 | 등록된 지갑주소와 동일하지 않습니다
Does not match registered wallet address | -| 1505 | 유효하지 않은 비밀키입니다
Invalid secret key | -| 1506 | 만기된 서명입니다
Expired signature | -| 1510 | 시스템의 잔고가 부족합니다
Insufficient system balance | -| 1511 | 사용자의 잔고가 부족합니다
Insufficient balance | -| 1512 | 예치을 허용하지 않았습니다
Not allowed deposit | -| 1513 | 수수료 계정 또는 시스템 계정의 잔고가 부족합니다
Insufficient fee or system balance | -| 1514 | 교환을 위해 필요한 유동성자금이 충분하지 않습니다
Insufficient liquidity balance | -| 1520 | 로열티 종류가 토큰가 아닙니다. 토큰만이 인출과 예치가 가능합니다.
Loyalty type is not TOKEN | -| 1521 | 잘못된 값을 입력했습니다
Invalid value entered | -| 1530 | 지불아이디가 이미 사용중입니다
The payment ID already exists | -| 1531 | 지불아이디에 대응하는 상태값이 진행중이지 않습니다
The status of the payment corresponding to the payment ID is not in progress | -| 1532 | 지불아이디에 대응하는 상태값이 취소가능하지 않습니다
The status of the payment corresponding to the payment ID is not a cancellable condition | -| 1533 | 지불아이디에 대응하는 상태값이 취소중이 아닙니다
The status of the payment corresponding to the payment ID is not being cancelled | -| 1534 | 지불에 대한 취소가능 기간이 만료되었습니다
The period for cancellation of payment has expired | -| 1711 | 입금이 이미 존재합니다
Already Exist Deposit | -| 1712 | 인출이 존재하지 않습니다
No Exist Withdraw | -| 1715 | 인출이 이미 승인되었습니다
Already Confirm Withdraw | -| 1717 | 등록된 지갑주소와 동일하지 않습니다
Does not match the address registered on the bridge | -| 1718 | 등록된 금액과 동일하지 않습니다
Does not match the amount registered on the bridge | -| 2001 | 파라메타의 검증에 실패하였습니다
Failed to check the validity of parameters | -| 2002 | 엑세스키가 유효하지 않습니다
The access key entered is not valid | -| 2003 | 지불아이디가 존재하지 않습니다
The payment ID is not exist | -| 2004 | 임시주소가 존재하지 않거나 사용기간이 만료되었습니다
Temporary address that does not exist | -| 2005 | 사용자 모바일의 알림이 허용되지 않았습니다
User's mobile notification is not allowed | -| 2006 | 대리지갑주소를 찾을 수 없습니다
Can not found delegator | -| 2007 | 전화번화형식이 유효하지 않습니다
The phone number format is invalid | -| 2008 | 메세지를 보내기 위해 필요한 모바일정보를 찾을 수 없습니다
Mobile information not found | -| 2020 | 지불에 대한 상태코드는 승인을 할 수 없습니다
The status code for this payment cannot be approved | -| 2022 | 지불에 대한 상태코드는 취소를 할 수 없습니다
The status code for this payment cannot be cancel | -| 2024 | 지불에 대한 상태코드는 종료처리를 할 수 없습니다
The status code for this payment cannot process closing | -| 2025 | 해당 지불은 이미 승인되었습니다
This payment has already been approved | -| 2026 | 해당 지불은 이미 종료되었습니다
This payment has already been closed | -| 2027 | 해당 지불은 이미 승인후 실패처리되었습니다.
This payment has already been approved and failed | -| 2028 | 지불에 대한 상태코드는 거부 할 수 없습니다
The status code for this payment cannot be denied | -| 2029 | 해당 지불은 강제종료되었습니다
This payment has forced to close | -| 2030 | 해당 지불은 승인 전이기 때문에 닫을 수 없습니다
This payment cannot be closed before it is approved | -| 2033 | 작업아이디가 존재하지 않습니다
The task ID is not exist | -| 2040 | 작업에 대한 상태코드는 승인을 할 수 없습니다
The status code for this task cannot be approved | -| 4000 | 사용자에 의해 거부되었습니다
Denied by user | -| 5000 | 스마트컨트랙트 실행중 오류가 발생했습니다
Smart Contract Error | -| 6000 | 내부서버에서 오류가 발생했습니다
Server Error | -| 7000 | 처리시간 초과오류입니다(45초)
Timeout period expired | - -[상단으로 이동](#로열티를-사용한-결제-프로세스) - ---- diff --git a/packages/relay/src/routers/PaymentRouter.ts b/packages/relay/src/routers/PaymentRouter.ts index 7ad710ed..71f12c81 100644 --- a/packages/relay/src/routers/PaymentRouter.ts +++ b/packages/relay/src/routers/PaymentRouter.ts @@ -463,6 +463,7 @@ export class PaymentRouter { const purchaseId: string = String(req.body.purchaseId).trim(); const amount: BigNumber = BigNumber.from(req.body.amount); const currency: string = String(req.body.currency).trim(); + const terminalId: string = req.body.terminalId !== undefined ? String(req.body.terminalId).trim() : ""; const feeRate = await this.contractManager.sideLedgerContract.getPaymentFee(); const rate = await this.contractManager.sideCurrencyRateContract.get(currency.toLowerCase()); @@ -505,6 +506,7 @@ export class PaymentRouter { feeValue, totalPoint, totalValue, + terminalId, paymentStatus: LoyaltyPaymentTaskStatus.OPENED_NEW, contractStatus: ContractLoyaltyPaymentStatus.INVALID, openNewTimestamp: ContractUtils.getTimeStamp(), @@ -739,6 +741,7 @@ export class PaymentRouter { currency: item.currency, shopId: item.shopId, account: item.account, + terminalId: item.terminalId, paymentStatus: item.paymentStatus, }) ); @@ -810,6 +813,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -848,6 +852,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -903,6 +908,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -998,6 +1004,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -1034,6 +1041,7 @@ export class PaymentRouter { } const paymentId: string = String(req.body.paymentId).trim(); + const terminalId: string = req.body.terminalId !== undefined ? String(req.body.terminalId).trim() : ""; const item = await this.storage.getPayment(paymentId); if (item === undefined) { return res.status(200).json(ResponseMessage.getErrorMessage("2003")); @@ -1048,6 +1056,9 @@ export class PaymentRouter { return res.status(200).json(ResponseMessage.getErrorMessage("2022")); } + item.terminalId = terminalId; + await this.storage.updateTerminalId(item.paymentId, item.terminalId); + item.paymentStatus = LoyaltyPaymentTaskStatus.OPENED_CANCEL; item.openCancelTimestamp = ContractUtils.getTimeStamp(); await this.storage.updateOpenCancelTimestamp( @@ -1085,6 +1096,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -1151,6 +1163,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -1278,6 +1291,7 @@ export class PaymentRouter { currency: item.currency, shopId: item.shopId, account: item.account, + terminalId: item.terminalId, paymentStatus: item.paymentStatus, txHash: tx.hash, }) @@ -1325,6 +1339,7 @@ export class PaymentRouter { currency: item.currency, shopId: item.shopId, account: item.account, + terminalId: item.terminalId, paymentStatus: item.paymentStatus, }) ); @@ -1397,6 +1412,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -1435,6 +1451,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -1490,6 +1507,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -1566,6 +1584,7 @@ export class PaymentRouter { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, }; } diff --git a/packages/relay/src/routers/ShopRouter.ts b/packages/relay/src/routers/ShopRouter.ts index e20f7d48..7cf17c89 100644 --- a/packages/relay/src/routers/ShopRouter.ts +++ b/packages/relay/src/routers/ShopRouter.ts @@ -438,6 +438,7 @@ export class ShopRouter { const currency: string = String(req.body.currency).trim().toLowerCase(); const account: string = String(req.body.account).trim(); const signature: string = String(req.body.signature).trim(); // 서명 + const terminalId: string = req.body.terminalId !== undefined ? String(req.body.terminalId).trim() : ""; const taskId = ContractUtils.getTaskId(shopId); const item: ShopTaskData = { @@ -448,6 +449,7 @@ export class ShopRouter { currency, status: ContractShopStatus.INVALID, account, + terminalId, taskStatus: ShopTaskStatus.OPENED, timestamp: ContractUtils.getTimeStamp(), txId: "", @@ -532,6 +534,7 @@ export class ShopRouter { name: item.name, currency: item.currency, status: item.status, + terminalId: item.terminalId, taskStatus: item.taskStatus, account: item.account, timestamp: item.timestamp, @@ -572,6 +575,7 @@ export class ShopRouter { const name: string = String(req.body.name).trim(); const currency: string = String(req.body.currency).trim().toLowerCase(); + const terminalId: string = req.body.terminalId !== undefined ? String(req.body.terminalId).trim() : ""; const shopInfo = await this.contractManager.sideShopContract.shopOf(shopId); if (shopInfo.status !== ContractShopStatus.INVALID) { @@ -585,6 +589,7 @@ export class ShopRouter { currency, status: shopInfo.status, account: shopInfo.account, + terminalId, taskStatus: ShopTaskStatus.OPENED, timestamp: ContractUtils.getTimeStamp(), txId: "", @@ -655,6 +660,7 @@ export class ShopRouter { shopId: item.shopId, name: item.name, currency: item.currency, + terminalId: item.terminalId, taskStatus: item.taskStatus, timestamp: item.timestamp, }) @@ -769,6 +775,7 @@ export class ShopRouter { shopId: item.shopId, name: item.name, currency: item.currency, + terminalId: item.terminalId, taskStatus: item.taskStatus, timestamp: item.timestamp, txHash: item.txId, @@ -844,6 +851,7 @@ export class ShopRouter { } const status: number = Number(String(req.body.status).trim()); + const terminalId: string = req.body.terminalId !== undefined ? String(req.body.terminalId).trim() : ""; const shopInfo = await this.contractManager.sideShopContract.shopOf(shopId); if (shopInfo.status !== 0) { const taskId = ContractUtils.getTaskId(shopId); @@ -856,6 +864,7 @@ export class ShopRouter { currency: shopInfo.currency, status, account: shopInfo.account, + terminalId, taskStatus: ShopTaskStatus.OPENED, timestamp: ContractUtils.getTimeStamp(), txId: "", @@ -878,6 +887,7 @@ export class ShopRouter { taskId: item.taskId, shopId: item.shopId, status: item.status, + terminalId: item.terminalId, taskStatus: item.taskStatus, timestamp: item.timestamp, }) @@ -928,6 +938,7 @@ export class ShopRouter { taskId: item.taskId, shopId: item.shopId, status: item.status, + terminalId: item.terminalId, taskStatus: item.taskStatus, timestamp: item.timestamp, }) @@ -1042,6 +1053,7 @@ export class ShopRouter { taskId: item.taskId, shopId: item.shopId, status: item.status, + terminalId: item.terminalId, taskStatus: item.taskStatus, timestamp: item.timestamp, txHash: item.txId, @@ -1073,6 +1085,7 @@ export class ShopRouter { taskId: item.taskId, shopId: item.shopId, status: item.status, + terminalId: item.terminalId, taskStatus: item.taskStatus, timestamp: item.timestamp, }) @@ -1146,6 +1159,7 @@ export class ShopRouter { currency: item.currency, status: item.status, account: item.account, + terminalId: item.terminalId, }; } diff --git a/packages/relay/src/scheduler/WatchScheduler.ts b/packages/relay/src/scheduler/WatchScheduler.ts index cd7b83d2..67a524c2 100644 --- a/packages/relay/src/scheduler/WatchScheduler.ts +++ b/packages/relay/src/scheduler/WatchScheduler.ts @@ -217,6 +217,7 @@ export class WatchScheduler extends Scheduler { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, }; } @@ -474,6 +475,7 @@ export class WatchScheduler extends Scheduler { currency: item.currency, status: item.status, account: item.account, + terminalId: item.terminalId, }; } /// endregion diff --git a/packages/relay/src/storage/RelayStorage.ts b/packages/relay/src/storage/RelayStorage.ts index 192c30b5..0062c60e 100644 --- a/packages/relay/src/storage/RelayStorage.ts +++ b/packages/relay/src/storage/RelayStorage.ts @@ -76,6 +76,7 @@ export class RelayStorage extends Storage { feeValue: item.feeValue.toString(), totalPoint: item.totalPoint.toString(), totalValue: item.totalValue.toString(), + terminalId: item.terminalId, paymentStatus: item.paymentStatus, openNewTimestamp: item.openNewTimestamp, closeNewTimestamp: item.closeNewTimestamp, @@ -117,6 +118,7 @@ export class RelayStorage extends Storage { feeValue: BigNumber.from(m.feeValue), totalPoint: BigNumber.from(m.totalPoint), totalValue: BigNumber.from(m.totalValue), + terminalId: m.terminalId, paymentStatus: m.paymentStatus, contractStatus: m.contractStatus, openNewTimestamp: m.openNewTimestamp, @@ -166,6 +168,22 @@ export class RelayStorage extends Storage { }); } + public updateTerminalId(paymentId: string, terminalId: string): Promise { + return new Promise(async (resolve, reject) => { + this.queryForMapper("payment", "updateTerminal", { + paymentId, + terminalId, + }) + .then(() => { + return resolve(); + }) + .catch((reason) => { + if (reason instanceof Error) return reject(reason); + return reject(new Error(reason)); + }); + }); + } + public updatePaymentStatus(paymentId: string, paymentStatus: LoyaltyPaymentTaskStatus): Promise { return new Promise(async (resolve, reject) => { this.queryForMapper("payment", "updateStatus", { @@ -407,6 +425,7 @@ export class RelayStorage extends Storage { feeValue: BigNumber.from(m.feeValue), totalPoint: BigNumber.from(m.totalPoint), totalValue: BigNumber.from(m.totalValue), + terminalId: m.terminalId, paymentStatus: m.paymentStatus, contractStatus: m.contractStatus, openNewTimestamp: m.openNewTimestamp, @@ -452,6 +471,7 @@ export class RelayStorage extends Storage { feeValue: BigNumber.from(m.feeValue), totalPoint: BigNumber.from(m.totalPoint), totalValue: BigNumber.from(m.totalValue), + terminalId: m.terminalId, paymentStatus: m.paymentStatus, contractStatus: m.contractStatus, openNewTimestamp: m.openNewTimestamp, @@ -487,6 +507,7 @@ export class RelayStorage extends Storage { currency: item.currency, name: item.name, status: item.status, + terminalId: item.terminalId, taskStatus: item.taskStatus, timestamp: item.timestamp, }) @@ -514,6 +535,7 @@ export class RelayStorage extends Storage { name: m.name, currency: m.currency, status: m.status, + terminalId: m.terminalId, taskStatus: m.taskStatus, timestamp: m.timestamp, txId: m.txId, @@ -596,6 +618,7 @@ export class RelayStorage extends Storage { name: m.name, currency: m.currency, status: m.status, + terminalId: m.terminalId, taskStatus: m.taskStatus, timestamp: m.timestamp, txId: m.txId, diff --git a/packages/relay/src/storage/mapper/payment.xml b/packages/relay/src/storage/mapper/payment.xml index 3489b97e..0f67fed3 100644 --- a/packages/relay/src/storage/mapper/payment.xml +++ b/packages/relay/src/storage/mapper/payment.xml @@ -19,6 +19,7 @@ "feeValue" , "totalPoint" , "totalValue" , + "terminalId" , "paymentStatus" , "openNewTimestamp" , "closeNewTimestamp" , @@ -41,6 +42,7 @@ #{feeValue} , #{totalPoint} , #{totalValue} , + #{terminalId} , ${paymentStatus} , ${openNewTimestamp} , ${closeNewTimestamp} , @@ -80,6 +82,13 @@ WHERE "paymentId" = #{paymentId} AND "paymentStatus" ${paymentStatus} + + UPDATE payments + SET + "terminalId" = #{terminalId} + WHERE "paymentId" = #{paymentId} + + UPDATE payments SET diff --git a/packages/relay/src/storage/mapper/table.xml b/packages/relay/src/storage/mapper/table.xml index 3bdfde05..f155ed3a 100644 --- a/packages/relay/src/storage/mapper/table.xml +++ b/packages/relay/src/storage/mapper/table.xml @@ -18,6 +18,7 @@ "feeValue" VARCHAR(64) NOT NULL, "totalPoint" VARCHAR(64) NOT NULL, "totalValue" VARCHAR(64) NOT NULL, + "terminalId" VARCHAR(66) NOT NULL, "paymentStatus" INTEGER DEFAULT 0, "contractStatus" INTEGER DEFAULT 0, "openNewTimestamp" INTEGER DEFAULT 0, @@ -42,6 +43,7 @@ "name" VARCHAR(128) NOT NULL, "currency" VARCHAR(12) NOT NULL, "status" INTEGER NOT NULL, + "terminalId" VARCHAR(66) NOT NULL, "taskStatus" INTEGER NOT NULL, "timestamp" INTEGER DEFAULT 0, "txId" VARCHAR(66) DEFAULT '', diff --git a/packages/relay/src/storage/mapper/task.xml b/packages/relay/src/storage/mapper/task.xml index e85ac9d8..8270dda1 100644 --- a/packages/relay/src/storage/mapper/task.xml +++ b/packages/relay/src/storage/mapper/task.xml @@ -12,6 +12,7 @@ "name" , "currency" , "status" , + "terminalId" , "taskStatus" , "timestamp" ) @@ -24,6 +25,7 @@ #{name} , #{currency} , ${status} , + #{terminalId} , ${taskStatus} , ${timestamp} ) diff --git a/packages/relay/src/types/index.ts b/packages/relay/src/types/index.ts index 5185e0ea..cf355198 100644 --- a/packages/relay/src/types/index.ts +++ b/packages/relay/src/types/index.ts @@ -88,6 +88,8 @@ export interface LoyaltyPaymentTaskData { totalPoint: BigNumber; totalValue: BigNumber; + terminalId: string; + paymentStatus: LoyaltyPaymentTaskStatus; contractStatus: ContractLoyaltyPaymentStatus; @@ -131,6 +133,7 @@ export interface PaymentResultData { feeValue: string; totalPoint: string; totalValue: string; + terminalId: string; balance?: string; paymentStatus?: LoyaltyPaymentTaskStatus; openNewTimestamp?: number; @@ -158,6 +161,7 @@ export interface ShopTaskData { currency: string; status: ContractShopStatus; account: string; + terminalId: string; taskStatus: ShopTaskStatus; timestamp: number; txId: string; diff --git a/packages/relay/test/Payment.test.ts b/packages/relay/test/Payment.test.ts index b9c6ef14..4e078651 100644 --- a/packages/relay/test/Payment.test.ts +++ b/packages/relay/test/Payment.test.ts @@ -369,6 +369,7 @@ describe("Test of Server", function () { currency: "krw", shopId: shopData[purchaseOfLoyalty.shopIndex].shopId, account: users[purchaseOfLoyalty.userIndex].address, + terminalId: "TM000001", }; const response = await client.post(url, params); @@ -469,6 +470,7 @@ describe("Test of Server", function () { currency: "krw", shopId: shopData[purchaseOfLoyalty.shopIndex].shopId, account: users[purchaseOfLoyalty.userIndex].address, + terminalId: "TM000001", }; const response = await client.post(url, params); @@ -848,6 +850,7 @@ describe("Test of Server", function () { currency: "krw", shopId: shopData[purchaseOfLoyalty.shopIndex].shopId, account: users[purchaseOfLoyalty.userIndex].address, + terminalId: "TM000001", }; const response = await client.post(url, params); @@ -938,6 +941,7 @@ describe("Test of Server", function () { const params = { paymentId, + terminalId: "TM000001", }; const response = await client.post(url, params); @@ -1254,6 +1258,7 @@ describe("Test of Server", function () { currency: "krw", shopId: shopData[purchaseOfLoyalty.shopIndex].shopId, account: users[purchaseOfLoyalty.userIndex].address, + terminalId: "TM000001", }; const response = await client.post(url, params); @@ -1344,6 +1349,7 @@ describe("Test of Server", function () { const params = { paymentId, + terminalId: "TM000001", }; const response = await client.post(url, params); @@ -1721,6 +1727,7 @@ describe("Test of Server", function () { currency: "krw", shopId: shopData[purchaseOfLoyalty.shopIndex].shopId, account: users[purchaseOfLoyalty.userIndex].address, + terminalId: "TM000001", }; const response = await client.post(url, params); @@ -1772,6 +1779,7 @@ describe("Test of Server", function () { const params = { paymentId, + terminalId: "TM000001", }; const response = await client.post(url, params); diff --git a/packages/relay/tspec/02_Shop.ts b/packages/relay/tspec/02_Shop.ts index 3467e097..d94338d2 100644 --- a/packages/relay/tspec/02_Shop.ts +++ b/packages/relay/tspec/02_Shop.ts @@ -67,6 +67,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example "0" */ refundedAmount: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; }; error?: { /** @@ -142,6 +147,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example "0" */ refundedAmount: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; }[]; error?: { /** @@ -255,6 +265,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example "php" */ currency: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId?: string; }; responses: { 200: { @@ -284,6 +299,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example "php" */ currency: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Task progress status ( 11: OPENED, 12: FAILED_TX, 13: REVERTED_TX, 14: SENT_TX, 15: DENIED, 16: COMPLETED ) * @example 11 @@ -395,6 +415,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example 1 */ status: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId?: string; }; responses: { 200: { @@ -419,6 +444,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example 1 */ status: number; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Task progress status ( 11: OPENED, 12: FAILED_TX, 13: REVERTED_TX, 14: SENT_TX, 15: DENIED, 16: COMPLETED ) * @example 11 @@ -484,6 +514,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example 1 */ status: number; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Task progress status ( 11: OPENED, 12: FAILED_TX, 13: REVERTED_TX, 14: SENT_TX, 15: DENIED, 16: COMPLETED ) * @example 11 @@ -559,6 +594,11 @@ export type ShopApiSpec = Tspec.DefineApiSpec<{ * @example 1 */ status: number; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Task progress status ( 11: OPENED, 12: FAILED_TX, 13: REVERTED_TX, 14: SENT_TX, 15: DENIED, 16: COMPLETED ) * @example 11 diff --git a/packages/relay/tspec/03_Payment.ts b/packages/relay/tspec/03_Payment.ts index 96cb68c7..e9ade917 100644 --- a/packages/relay/tspec/03_Payment.ts +++ b/packages/relay/tspec/03_Payment.ts @@ -173,6 +173,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "0x5A3Fc8990417b3e6ddCdAE0E8039E798A609Ef84" */ account: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId?: string; }; responses: { 200: { @@ -242,6 +247,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "105000000000000000000" */ totalValue: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 @@ -342,6 +352,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "105000000000000000000" */ totalValue: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 @@ -417,6 +432,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "0x5A3Fc8990417b3e6ddCdAE0E8039E798A609Ef84" */ account: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 @@ -437,7 +457,7 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ "/v1/payment/item": { get: { summary: "Provider a payment information"; - body: { + query: { /** * ID of Payment * @example "0x2d9100c28be32e1a29e55b2ead66d472a6271627235778379657d08c9dc1d901" @@ -512,6 +532,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "105000000000000000000" */ totalValue: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 @@ -538,6 +563,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "0x2d9100c28be32e1a29e55b2ead66d472a6271627235778379657d08c9dc1d901" */ paymentId: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId?: string; }; responses: { 200: { @@ -607,6 +637,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "105000000000000000000" */ totalValue: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 @@ -707,6 +742,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "105000000000000000000" */ totalValue: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 @@ -782,6 +822,11 @@ export type PaymentApiSpec = Tspec.DefineApiSpec<{ * @example "0x5A3Fc8990417b3e6ddCdAE0E8039E798A609Ef84" */ account: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 diff --git a/packages/relay/tspec/09_Chain.ts b/packages/relay/tspec/09_Chain.ts index 7d9abd37..ab71f660 100644 --- a/packages/relay/tspec/09_Chain.ts +++ b/packages/relay/tspec/09_Chain.ts @@ -380,7 +380,13 @@ export type SideChainTokenApiSpec = Tspec.DefineApiSpec<{ "/v1/token/side/balance/{account}": { get: { summary: "Provide token balance in the side chain"; - path: { account: string }; + path: { + /** + * Address of user wallet + * @example "0x5650CD3E6E8963B43D21FAE60EE7A03BCEFCE766" + */ + account: string; + }; responses: { 200: { /** @@ -414,7 +420,13 @@ export type SideChainTokenApiSpec = Tspec.DefineApiSpec<{ "/v1/token/side/nonce/{account}": { get: { summary: "Provide nonce in the side chain"; - path: { account: string }; + path: { + /** + * Address of user wallet + * @example "0x5650CD3E6E8963B43D21FAE60EE7A03BCEFCE766" + */ + account: string; + }; responses: { 200: { /** diff --git a/packages/relay/tspec/20_CallBack.ts b/packages/relay/tspec/20_CallBack.ts index c35b89ff..a052e937 100644 --- a/packages/relay/tspec/20_CallBack.ts +++ b/packages/relay/tspec/20_CallBack.ts @@ -62,6 +62,11 @@ interface PaymentCallBackData { * @example "105000000000000000000" */ totalValue: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; /** * Progress status of payment task * @example 18 @@ -100,6 +105,11 @@ interface ShopCallBackData { * @example "0xafFe745418Ad24c272175e5B58610A8a35e2EcDa" */ account: string; + /** + * ID of terminal + * @example "KIOSK0001" + */ + terminalId: string; } interface TaskCallBackRequest {