한국어
내부 계정 간 자산 이동
오프라인 결제는 고객의 USER 계정에서 가맹점의 BUSINESS 결제 계정으로 보내는 내부이체입니다.
고객 잔액 확인
bash
wallet_request GET "/accounts/$USER_ACCOUNT_ID/balances/$ASSET_TYPE_ID" | jq결제를 제출하기 전에 available_amount_raw가 주문 금액 이상인지 확인합니다.
고유한 결제 요청 생성
client_request_id는 내부이체와 외부 출금 전체에서 고유해야 합니다. 주문마다 하나를 만들고 다른 작업에 재사용하지 않습니다.
생성한 PAYMENT_REQUEST_ID를 주문 ID·계정·자산·금액과 연결해 요청 전 영구 저장합니다. 같은 주문을 복구할 때는 저장한 ID를 사용하고 아래 ID 생성 코드를 다시 실행하지 않습니다. 응답을 받은 뒤에 PAYMENT_WITHDRAWAL_ID를 추가로 저장합니다.
bash
export PAYMENT_AMOUNT='1.00'
export PAYMENT_REQUEST_ID="payment-$(node -e 'process.stdout.write(require("crypto").randomUUID())')"
payment_body="$(jq -nc \
--argjson from_account_id "$USER_ACCOUNT_ID" \
--argjson to_account_id "$PAYMENT_ACCOUNT_ID" \
--argjson asset_type_id "$ASSET_TYPE_ID" \
--arg amount "$PAYMENT_AMOUNT" \
--arg client_request_id "$PAYMENT_REQUEST_ID" \
'{from_account_id:$from_account_id,to_account_id:$to_account_id,asset_type_id:$asset_type_id,amount:$amount,client_request_id:$client_request_id}')"
payment_response="$(wallet_request POST '/withdrawals/internal' "$payment_body")"
printf '%s\n' "$payment_response" | jq
export PAYMENT_WITHDRAWAL_ID="$(printf '%s' "$payment_response" | jq -r '.data.withdrawal_id')"주문에 PAYMENT_REQUEST_ID와 PAYMENT_WITHDRAWAL_ID를 함께 저장합니다. 엔드포인트 이름은 withdrawal이지만 이 레코드는 결제에 사용된 내부 자금 이동을 나타냅니다.
생성 응답만으로 성공 처리하지 않기
반환된 ID는 거래 레코드가 존재한다는 의미입니다. 주문을 결제 완료로 바꾸기 전에 상태를 확인합니다.
bash
wallet_request GET "/withdrawals/$PAYMENT_WITHDRAWAL_ID" | jq내부결제의 성공 조건은 다음과 같습니다.
success: truerequest_type: "INTERNAL"status: "COMPLETED"user_status: "COMPLETED"
다음: 결제 결과와 거래 기록 처리