일반결제
결제 관련으로 문의 드립니다.
테스트로 현재 진행하고 있는데 지금 계속 response code가 다음과 같이 나옵니다.
{"code":null,"message":null,"data":null}
response.status 프린트 했을때도 500으로 나오는데
혹시 왜 이렇게 되는지 알 수 있을까요?
32 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
어떤 SDK 혹은 API를 호출하셨을까요
SDK는 <script src="https://js.tosspayments.com/v1/payment"></script> 넣어서 기본 결제 SDK를 불러왔고
API는 결제 승인 API 부분입니다
사용한 paymentKey말씀해주세요
paymentKey는 결제창에서 리다이렉트 해올때 query param에서 받아온걸 넣었습니다
예를 들어 이런식으로
/success?planet=1003&orderId=PFD6qnKIk1ZXKJzeTkPn5&paymentKey=lqNRYD097kZLKGPx4M3MG1eQ9DjoWRrBaWypv1o6bemnOJz2&amount=1000
리다이렉트 됬을때 해당 paymentKey를 불러와서 넣었습니다
해당 paymentkey 로 승인 요청이 저희쪽으로 들어온적이 없습니다.
방화벽 등에 막힌게 아닐지 확인 부탁드립니다.
지금 현재 로컬로 테스트를 진행하는데 로컬로 진행할 경우에는 안 들어가거나 그런 경우도 있나요? 만약 그렇다면 dev 서버 내에서 다시 해보겠습니다
아뇨 그런것은 없습니다.
혹시 저희쪽 승인 API 호출하는 코드를 공유해 주실수 있을까요?
var clientKey = '{{ client_key }}' // 클라이언트 키
var tossPayment = TossPayments(clientKey);
var button = document.getElementById('payment-button') // 결제하기 버튼
button.addEventListener('click', function () {
tossPayment.requestPayment('카드', {
amount: 1000,
orderId: '{{ order_id }}',
orderName: '비공개(비밀글) 기능 추가',
customerName: '{{ current_planet.ans_dp_name }}',
successUrl: '{{ host_url }}success?planet={{ current_planet.ans_id }}',
failUrl: '{{ host_url }}failed',
})
})
이쪽이 스크립트쪽이고
스크립트 쪽은 문제가 없으신것 같아요.
url = request.url
parsed_url = urlparse(url)
payment_key = parse_qs(parsed_url.query)['paymentKey'][0]
order_id = parse_qs(parsed_url.query)['orderId'][0]
amount = parse_qs(parsed_url.query)['amount'][0]
planet_id = parse_qs(parsed_url.query)['planet'][0]
conn = http.client.HTTPSConnection("api.tosspayments.com")
payload = "{"paymentKey":"" + payment_key + "","amount":" + amount + ","orderId":"" + order_id + ""}"
print(payload)
headers = {
'Authorization': "Basic dGVzdF9za19HS05iZE92azVya2JKRE1STWtFVm4wN3hsem1q==",
'Content-Type': "application/json"
}
conn.request("POST", "/v1/payments/confirm", payload, headers)
response = conn.getresponse()
data = response.read()
이쪽은 파이썬 내에서 승인 요청입니다
하단에 Authorization에 있는건 시크릿 코드 인코딩도 진행해서 넣은것입니다
payload 가 빈값으로 들어온것 같습니다.
{"paymentKey":"oYwn6qbDZOAQ92ymxN34lo6QjMDnv3ajRKXvdk4El1Bp0J5L","amount":1000,"orderId":"7YCVTjeRTA5WbAOb9mbxN"}
json encoding해서 보내주시겠어요?
이쪽이 방금전에 payload 프린트 한거입니다
어떤 부분은 인코딩 하면 되나요?
json_data = json.dumps(payload)
로 하신후에 conn.request("POST", "/v1/payments/confirm", json_data, headers)
이렇게 해보실수 있을까요?
저는 request 모듈을 애용하는 편 입니다
url = "https://api.tosspayments.com/v1/payments/confirm"
secertkey = ""
userpass = secertkey + ':'
encoded_u = base64.b64encode(userpass.encode()).decode()
headers = { "Authorization" : "Basic %s" % encoded_u, "Content-Type": "application/json" }
params = { "orderId" : orderId, "amount" : amount, "paymentKey": paymentKey, }
res = requests.post(url, data=json.dumps(params), headers=headers)
headers = { "Authorization" : "Basic %s" % encoded_u, "Content-Type": "application/json" }
params = { "orderId" : orderId, "amount" : amount, "paymentKey": paymentKey, }
res = requests.post(url, data=json.dumps(params), headers=headers)
이쪽이 json_data로 한 내용이고
"{"paymentKey":"OR1ZwdkQD5GePWvyJnrK2kBXPg7xYaVgLzN97EoqYA60XKx4","amount":1000,"orderId":"bKTqORIqXol8wXU2u9Rnn"}"
response는 똑같이
{"code":null,"message":null,"data":null}
이렇게 나옵니다
지금도 body가 전달되지 않았습니다.
이쪽도 한번 시도 해보겠습니다 공유 감사합니다
같은 Python 쓰셔서 반가워서 글 남겨 드렸어요 ㅎㅎ 파이팅!
@냥과장 혹시 지금 해당 paymentKey로 body가 전해진게 있나요?
OR1ZwdkQD5GePWvyJnrK4voZYxQYAO8gLzN97EoqYA60XKx4
luckyhyun님의 방법으로 해봤는데..
저희 내부 로그를 보다보니
IllegalArgumentException: Input byte array has wrong 4-byte ending unit
그러면 디코딩에서 문제가 생기는건가요?
혹시 실제 코드에 이렇게 캐리지 리턴이 들어가 있으신가요?
'Authorization': "Basic dGVzdF9za19HS05iZE92azVya2JKRE1STWtFVm4wN3hsem1q==",
캐리지 리턴이라고 하면 \r 이거 말씀하시는건가요?
캐리지 리턴은 안 들어가있는거 같습니다
headers = {
'Authorization': "Basic dGVzdF9za19HS05iZE92azVya2JKRE1STWtFVm4wN3hsem1q==",
'Content-Type': "application/json"
}
dGVzdF9za19HS05iZE92azVya2JKRE1STWtFVm4wN3hsem1qOg==
이거로 한번 해보시겠어요?
시크릿키 base64 인코딩 시에, 특정 값 누락등이 있는것이 아닐까 생각됩니다
필수 파라메터가 누락 되었다고 왔습니다
"{\"paymentKey\":\"k2WNa0EMg4Gv6LjeKD8azDDdj9GDzN3wYxAdXy19qpobJmB7\",\"amount\":1000,\"orderId\":\"1Qu6xCgC9cAnrOHy2rOfZ\"}"
그럼 이제 인증은 성공 하셨네요!
다음은 body payload 부분입니다
luckyhyun 님 방식 기준으로
params = {
"orderId" : orderId,
"amount" : amount,
"paymentKey": paymentKey,
}
data = json.dumps(params)
res = requests.post(url, data=json.dumps(params), headers=headers)
payload = "{\"paymentKey\":\"" + payment_key + "\",\"amount\":" + amount + ",\"orderId\":\"" + order_id + "\"}"
알겠습니다
오 됬습니다
감사합니다!👍
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.