Skip to content

내부 계정 간 자산 이동 ​

오프라인 결제는 고객의 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: true
  • request_type: "INTERNAL"
  • status: "COMPLETED"
  • user_status: "COMPLETED"

다음: 결제 결과와 거래 기록 처리

OOLIN은 BPMG가 제공하는 디지털자산 운영 인프라 제품입니다.