셀러 등록 400 에러 문의
셀러 등록 시 아래와 같은 응답으로 반환됩니다.
{
"version": "2022-11-16",
"traceId": "0d7f470b8ff74e07955a1815ff93a47c",
"entityBody": null,
"entityType": null,
"error": {
"code": "INVALID_REQUEST",
"message": "필수 파라미터가 누락 또는 요청 형식이 잘못되었습니다."
}
}
요청했던 PHP 소스는 아래와 같습니다.
$requestBody = json_encode([
"refSellerId" => "my-seller-1000001",
"businessType" => "INDIVIDUAL",
"individual" => [
"name" => "이름",
"email" => "이메일주소",
"phone" => "핸드폰번호"
],
"account" => [
"bankCode" => "020",
"accountNumber" => "실제 계좌번호 입력",
"holderName" => "실제 계좌번호 소유주 이름 입력"
],
"metadata" => [
"key1" => "value1",
"key2" => "value2"
]
]);
$encryptedRequestBody = $this->encrypt($requestBody, $securityKey);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tosspayments.com/v2/sellers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_SSL_VERIFYPEER => false, // SSL 인증서 검증을 비활성화 (테스트용)
CURLOPT_POSTFIELDS => $encryptedRequestBody,
CURLOPT_HTTPHEADER => [
"Authorization: Basic $encodedSecret", // 인증 헤더
"Content-Type: text/plain",
'TossPayments-api-security-mode: ENCRYPTION'
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
$httpStatusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
13 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
request body 가 json 타입이 아니라 string 으로 요청이 들어왔습니다.
request body를 보안키로 JWE 암호화 해서 string 타입으로 요청하는게 아닌가요?
개발 API 문서에서는 그렇게 되어있는 것으로 확인되어서요
코어 API | 토스페이먼츠 개발자센터
토스페이먼츠 API 엔드포인트(Endpoint)와 객체 정보, 파라미터, 요청 및 응답 예제를 살펴보세요.
request body jwe 암호화 전 내용입니다.
{"refSellerId":"my-seller-001","businessType":"INDIVIDUAL","individual":{"name":"\ud64d\uae38\ub3d9","email":"test@test.com","phone":"01000000000"},"account":{"bankCode":"020","accountNumber":"1002000000000","holderName":"\ud64d\uae38\ub3d9"},"metadata":{"key1":"value1","key2":"value2"}}
네 위와 같이 보내주셔야 하는데, request body 를 디코딩해보면 말씀드린바와 같이 string 입니다.
"{"refSellerId":"my-seller-001","businessType":"INDIVIDUAL","individual":{"name":"\ud64d\uae38\ub3d9","email":"test@test.com","phone":"01000000000"},"account":{"bankCode":"020","accountNumber":"1002000000000","holderName":"\ud64d\uae38\ub3d9"},"metadata":{"key1":"value1","key2":"value2"}}"
$requestBody = json_encode([
"refSellerId" => "my-seller-001",
"businessType" => "INDIVIDUAL",
"individual" => [
"name" => "홍길동",
"email" => "test@test.com",
"phone" => "01000000000"
],
"account" => [
"bankCode" => "020",
"accountNumber" => "1002000000000",
"holderName" => "홍길동"
],
"metadata" => [
"key1" => "value1",
"key2" => "value2"
]
]);
$encryptedRequestBody = $this->encrypt($requestBody, $securityKey);
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tosspayments.com/v2/sellers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_SSL_VERIFYPEER => false, // SSL 인증서 검증을 비활성화 (테스트용)
CURLOPT_POSTFIELDS => $encryptedRequestBody,
CURLOPT_HTTPHEADER => [
"Authorization: Basic $encodedSecret", // 인증 헤더
"Content-Type: text/plain",
'TossPayments-api-security-mode: ENCRYPTION'
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
$httpStatusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
위 PHP 코드 상에 놓친 부분이 있을까요?
$encryptedRequestBody = $this->encrypt($requestBody, $securityKey);
$tmp = $this->decrypt($encryptedRequestBody, $securityKey);
Log::debug($tmp);
위 코드대로 암호화 후 바로 복호화한 후 로그를 찍었을 때, 아래와 같이 출력됩니다.
[2025-01-22 14:59:22] local.DEBUG: "{"refSellerId":"my-seller-001","businessType":"INDIVIDUAL","individual":{"name":"\ud64d\uae38\ub3d9","email":"test@test.com","phone":"01000000000"},"account":{"bankCode":"020","accountNumber":"1002000000000","holderName":"\ud64d\uae38\ub3d9"},"metadata":{"key1":"value1","key2":"value2"}}"
json_encode() 자체가 php 배열을 JSON 문자열로 변환하는 거라 확인해보시면 string 으로 확인될겁니다.
echo gettype($requestBody);
여기 한번 참고해보시겠어요?
https://docs.tosspayments.com/guides/v2/payouts#암호화
지급대행하기 | 토스페이먼츠 개발자센터
지급대행은 오픈마켓을 운영하는 사업자 대신 토스페이먼츠가 셀러(입점 판매자)에게 대금 지급을 대행 해주는 서비스예요.
참고해서 개발했는데 json_encode() 자체가 php 배열을 JSON 문자열로 변환한 후 String을 보안키랑 암호화해서 넘기는거 아닌가요/
1. php 배열을 json_encode() 해서 문자열로 만든 후
2. 암호화 encrypt() 3. 암호화된 데이터(String)을 Requset Body에 넣어서 요청 json 형식이되 string으로 가는게 맞는거 아닌가요? 말씀주신 답변이 무슨 말인지 이해가 안됩니다
2. 암호화 encrypt() 3. 암호화된 데이터(String)을 Requset Body에 넣어서 요청 json 형식이되 string으로 가는게 맞는거 아닌가요? 말씀주신 답변이 무슨 말인지 이해가 안됩니다
$requestBody = json_encode([]) 하고
$encryptedRequestBody = $this->encrypt($requestBody, $securityKey);
이렇게 호출하셨는데, encrypt()에서 json_encode()를 하기 때문에 상단에서 encrypt() 호출하기전에는 json_encode()를 빼주세요.
와우.
감사합니다
해결되었습니다
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.