# 서명 검사기

> 요청 본문이나 웹훅 본문을 붙여 넣으세요. 이 페이지가 Cryptomus와 같은 방식으로 서명을 단계별로 계산하고, 각 단계를 당신의 결과와 비교해 처음 달라지는 곳을 표시합니다. 모든 계산은 브라우저에서 이루어집니다. 이 페이지는 네트워크 요청을 아예 보낼 수 없으므로 API key가 컴퓨터 밖으로 나가지 않습니다.
>
> HTML: https://blockwallets.io/docs/sign?lang=ko · English: https://blockwallets.io/docs/sign.md?lang=en

## 요청 서명 (당신이 저희 API를 호출할 때)

1. 서명 대상 텍스트는 보내는 요청 본문 그대로이며, 바이트 단위로 같아야 합니다(공백, 줄바꿈, 이스케이프 포함).
2. 그 UTF-8 바이트의 base64.
3. sign = md5(2단계 + API key). `sign` 헤더로 보내고, `merchant` 헤더에는 가맹점 UUID를 넣습니다.

서명이 틀리면 API가 401을 돌려주며, 응답의 `debug.body_base64`는 저희가 받은 본문으로 계산한 2단계 결과이니 당신의 결과와 바로 비교할 수 있습니다.

## 웹훅 서명 (저희가 당신의 웹훅 URL을 호출할 때)

1. `sign` 필드를 제거하고 나머지를 PHP `json_encode`처럼 다시 인코딩합니다. 공백 없이, `/`는 `\/`로 이스케이프, 비 ASCII 문자는 그대로 둡니다.
2. 1단계 결과의 UTF-8 바이트를 base64로 인코딩합니다.
3. md5(2단계 + API key)가 `sign`과 같아야 합니다. merchant와 같은 모드(Live / Test)의 API key를 쓰세요.

## 흔한 원인

- 다른 모드의 API key이거나 재발급되어 바뀐 키.
- 프레임워크가 본문을 다시 직렬화함(보기 좋게 정리, 키 순서, 숫자 형식). 받은 원문 본문으로 검증하세요.
- 웹훅을 다시 인코딩할 때 `/`를 `\/`로 이스케이프하지 않음.

검사기는 전적으로 브라우저에서 실행되고 이 페이지는 네트워크 요청을 보낼 수 없으므로 API key가 컴퓨터 밖으로 나가지 않습니다. 검증 코드 예제: https://blockwallets.io/docs/cryptomus?lang=ko#verify
