엽킹
엽킹10mo ago

결제 취소시 리턴값에 스트링 값이 다 깨져서 나옵니다

{"mid":"bidafsdfa","lastTransactionKey":"61787afasdfaB","paymentKey":"gN60L1adJYyZqmkKeP8gJ0aqEkAwgxrbQRxB9lG5DnzWE7pM","orderId":"202401120005_f3327b3a-e734-4bd8-9ebd-6d44c434f480","orderName":"기장 리얼맛집 뷰맛집 ì°¾ê³ ì‹¶ë‹¤ë©´ 여기로 !","taxExemptionAmount":0,"status":"CANCELED","requestedAt":"2024-01-12T17:40:25+09:00","approvedAt":"2024-01-12T17:40:37+09:00","useEscrow":false,"cultureExpense":false,"card":{"issuerCode":"33","acquirerCode":"31","number":"91002001**019*","installmentPlanMonths":0,"isInterestFree":false,"interestPayer":null,"approveNo":"45501735","useCardPoint":false,"cardType":"ì‹ ìš©","ownerType":"개인","acquireStatus":"READY","amount":180},"virtualAccount":null,"transfer":null,"mobilePhone":null,"giftCertificate":null,"cashReceipt":null,"cashReceipts":null,"discount":null,"cancels":[{"transactionKey":"617875721626BBE64B0BEA8C1DE6778B","cancelReason":"관리자에 의해 취소 되었습니다.","taxExemptionAmount":0,"canceledAt":"2024-01-12T17:40:55+09:00","easyPayDiscountAmount":0,"receiptKey":null,"cancelAmount":180,"taxFreeAmount":0,"refundableAmount":0}],"secret":null,"type":"NORMAL","easyPay":{"provider":"네이버페이","amount":0,"discountAmount":0},"country":"KR","failure":null,"isPartialCancelable":true,"receipt":{"url":"https://dashboard.tosspayments.com/receipt/redirection?transactionId=bikin20240112174027sIbb3&ref=PX"},"checkout":{"url":"https://api.tosspayments.com/v1/payments/gN60L1adJYyZqmkKeP8gJ0aqEkAwgxrbQRxB9lG5DnzWE7pM/checkout"},"currency":"KRW","totalAmount":180,"balanceAmount":0,"suppliedAmount":0,"vat":0,"taxFreeAmount":0,"method":"ê°„íŽ¸ê²°ì œ","version":"2022-11-16"} 몇몇값의 키값은 제가 임의로 수정했습니다 orderName ,cancelReason 이런값들의 상태값이 왜이렇게되는거죠 ? 16:00 까진 정상적으로 취소데이터가 잘나온거같은데 그이후로 안되네요
28 Replies
토스페이먼츠 BOT
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) : - 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요. * 주말/공휴일에는 답변이 늦을 수 있어요.
이실장
이실장10mo ago
기장 리얼맛집 뷰맛집 찾고싶다면 여기로 ! 이렇게 정상적으로 내려갔습ㄴ디ㅏ. 귀사 서버나 클라이언트 인코딩 방식 확인해주시기 바랍니다 저희 서버에서 인코딩이 잘못내려갈 경우, 현재 디스코드 및 저희 고객센터가 난리가 나야하는데 현재 서비스에는 이상이 없는 것으로 확인됩니다.
엽킹
엽킹10mo ago
다른 고객센터에서 난리가 나는건 저랑 상관이 없는 일이구요 리턴값이 저렇게 돌아오는데 확인은 해보셨는지요 ?? 코드 수정없이 16시까지 정상적으로 스트링 문자열이 돌아왔는데 그 이후로 깨져서 나와서 문의드립니다
이실장
이실장10mo ago
위에도 말씀드렸다 싶이 저희 서버 로그상 한글로 정상적으로 내려드렸스빈다. 코드 수정이 없으셨다면 서버 setting등 변경사항은 없으실까요
엽킹
엽킹10mo ago
네 감사합니다 그러면 혹시 아래코드중에 인코딩 되어져야하는부분이 있는지 문의드려도될까요 처음에 ResponseEntity<String> exchange 여기서 스트링으로 받아서 확인한 결과 문자열이 깨지는데 헤더값이나 혹시 머 추가되어져야하는 부분이 있는지요 16:00까지는 정상적으로 취소되고 리턴값 돌아와서 저장이 되어졌는데 갑자기 취소가 안되고 스트링값이 깨져서 그렇습니다 HashMap cancelReason = setData("cancelReason", cancelPaymentReq.getCancelReason()); HttpEntity<?> entity = new HttpEntity<>(cancelReason, headers); ResponseEntity<String> exchange = restTemplate.exchange(cancelUrl, POST, entity, String.class); Gson gson = new Gson(); PaymentResHandleDto paymentResHandleDto = gson.fromJson(exchange.getBody(), PaymentResHandleDto.class); private HttpHeaders setHeaders() { HttpHeaders headers = new HttpHeaders(); String encodedAuth = new String(Base64.getEncoder().encode((SECRET_KEY + ":").getBytes(StandardCharsets.UTF_8))); headers.setBasicAuth(encodedAuth); headers.setContentType(MediaType.APPLICATION_JSON); return headers; }
이실장
이실장10mo ago
지금 취소도 안되시는건가요? (위 주문번호는 정상 취소되어서요)
엽킹
엽킹10mo ago
네네 취소는 됩니다 취소되고 취소 리턴값이 특정 문자열들만 깨져서 나옵니다
이실장
이실장10mo ago
우선 저희한테 값을 보내주실 때도 한글로 정상적으로 받고 있습니다. 관리자에 의해 취소 되었습니다. 보내주시는 data자체에는 문제가 없는 것 같아요 headers.set("Accept-Charset", "UTF-8"); 헤더에 utf8 set 넣어서 보내보시겠어요
엽킹
엽킹10mo ago
감샇바니다 확인하고 글남기겟습니다 코드를 첨부좀할게요 @Transactional public void paymentCancel(CancelPaymentReq cancelPaymentReq, OrderItems orderitems) { log.info("cancelPaymentReq={}", cancelPaymentReq); try { HttpHeaders headers = setHeaders(); String cancelUrl = url + "payments/" + cancelPaymentReq.getPaymentKey() + "/cancel"; HashMap cancelReason = setData("cancelReason", cancelPaymentReq.getCancelReason()); HttpEntity<?> entity = new HttpEntity<>(cancelReason, headers); ResponseEntity<String> exchange = restTemplate.exchange(cancelUrl, POST, entity, String.class); System.out.println("exchange = " + exchange); Gson gson = new Gson();
PaymentResHandleDto paymentResHandleDto = gson.fromJson(exchange.getBody(), PaymentResHandleDto.class); System.out.println("paymentResHandleDto = " + paymentResHandleDto); cancelPaymentRepository.save(paymentResHandleDto.toCancelPayment()); } catch (HttpClientErrorException.NotFound | HttpClientErrorException.BadRequest e) { TossErrorDto tossErrorDto = new Gson().fromJson(e.getResponseBodyAsString(), TossErrorDto.class); if (Objects.equals(tossErrorDto.getCode(), "ALREADY_CANCELED_PAYMENT")) { orderitems.updateOrderItemsStatus(OrderItemsStatus.ADMIN_CANCEL); return; } throw new BusinessException(tossErrorDto.getMessage()); } catch (Exception e) { throw new BusinessException(e.getMessage()); } } private HttpHeaders setHeaders() { HttpHeaders headers = new HttpHeaders(); String encodedAuth = new String(Base64.getEncoder().encode((SECRET_KEY + ":").getBytes(StandardCharsets.UTF_8))); headers.setBasicAuth(encodedAuth); headers.set("Accept-Charset", "UTF-8"); headers.setContentType(MediaType.APPLICATION_JSON); return headers; }
엽킹
엽킹10mo ago
{"mId":"bikinexbk7","lastTransactionKey":"9BA7D0D8EE7107EE1A031F441D979166","paymentKey":"OR1ZwdkQD5GePWvyJnrKQQmlWGpOMR3gLzN97EoqYA60XKx4","orderId":"202401120009_7721ac70-04db-4881-b11a-49e06ca66f12","orderName":"기장 리얼맛집 뷰맛집 찾고싶다면 여기로 !","taxExemptionAmount":0,"status":"CANCELED","requestedAt":"2024-01-12T18:25:33+09:00","approvedAt":"2024-01-12T18:25:42+09:00","useEscrow":false,"cultureExpense":false,"card":{"issuerCode":"33","acquirerCode":"31","number":"91002001**019*","installmentPlanMonths":0,"isInterestFree":false,"interestPayer":null,"approveNo":"45823341","useCardPoint":false,"cardType":"신용","ownerType":"개인","acquireStatus":"READY","amount":180},"virtualAccount":null,"transfer":null,"mobilePhone":null,"giftCertificate":null,"cashReceipt":null,"cashReceipts":null,"discount":null,"cancels":[{"transactionKey":"9BA7D0D8EE7107EE1A031F441D979166","cancelReason":"관리자에 의해 취소 되었습니다.","taxExemptionAmount":0,"canceledAt":"2024-01-12T18:25:58+09:00","easyPayDiscountAmount":0,"receiptKey":null,"cancelAmount":180,"taxFreeAmount":0,"refundableAmount":0}],"secret":null,"type":"NORMAL","easyPay":{"provider":"네이버페이","amount":0,"discountAmount":0},"country":"KR","failure":null,"isPartialCancelable":true,"receipt":{"url":"https://dashboard.tosspayments.com/receipt/redirection?transactionId=bikin20240112182534AIdR9&ref=PX"},"checkout":{"url":"https://api.tosspayments.com/v1/payments/OR1ZwdkQD5GePWvyJnrKQQmlWGpOMR3gLzN97EoqYA60XKx4/checkout"},"currency":"KRW","totalAmount":180,"balanceAmount":0,"suppliedAmount":0,"vat":0,"taxFreeAmount":0,"method":"간편결제","version":"2022-11-16"}
엽킹
엽킹10mo ago
여전히 스트링값이 깨져서 나오거든여
유부장
유부장10mo ago
추가로, 16:00 까지는 정상적으로 되었다고 하셨는데 이때 작업하신 내용은 없으신가요? 어떤 기점에 따라서 변화가 있을것으로 보이는데요
엽킹
엽킹10mo ago
코드 변경점은 전혀 없고 리턴값에 한글이 깨져서 매핑을 못받고 저장을 못해서 취소는 정상적으로 되었지만 서버에 저장이 이루어지지 않았습니다 그 시점이 16:00 까지 저장이 되고 그 이후로 취소건은 토스 api요청시 성공하고 취소는 정상적으로 이루어지나 저희쪽 서버에 응답값을 못받아 저장이 안되고 있는 상황 입니다 307 39 5EnNZRJGvaBX7zk2yd8y6vZpYYPNkp3x9POLqKQjmAw4b0e1 202401120008_35f388e8-f35b-48e6-a535-10899aeb9923 테스트 1000 일정 및 요청 등 조율 불가 NULL 53279300**850* NULL NULL NULL 2024-01-12T16:12:24+09:00 2024-01-12T16:12:36+09:00 2024-01-12 16:12:52 16:12분까지 정상적으로 데이터가 들어오고 그이후로 한글이 깨져 나옵니다
유부장
유부장10mo ago
이 실장님이 가이드한 내용은 수행 해보셨나요?
엽킹
엽킹10mo ago
이실장 — 오늘 오후 6:33 다른페이지에서 https://docs.tosspayments.com/reference#paymentkey로-결제-조회 이거 한번 호출해보시겠어요 << 이부분은 아직 못햇습니다 테스트에서 라이브키를 쓰지못하더라구요
엽킹
엽킹10mo ago
코드를 수정하라고 하는거는 반영했는데 여전히 안되구요
유부장
유부장10mo ago
키 라이브키로 바꿔서, 결제조회 후에 응답이 어떻게 보이는지 확인 해주세요. 이실장님 가이드 처럼, 동일 환경이 아닌 curl 새롭게 수행할 수 있는 다른 페이지에서요
엽킹
엽킹10mo ago
제가 페이지에서 테스트는 거의안해봐서 이해를 잘 못했습니다 api 테스트 화면에서 하란 말씀이신가요 ? 아 이해했습니다
유부장
유부장10mo ago
아니오 API curl 을 새로운 환경에서 수행해서 네네
엽킹
엽킹10mo ago
확인하고 글남기겠습니다
엽킹
엽킹10mo ago
exchange = <200 OK OK,{"mId":"bikinexbk7","lastTransactionKey":"9BA7D0D8EE7107EE1A031F441D979166","paymentKey":"OR1ZwdkQD5GePWvyJnrKQQmlWGpOMR3gLzN97EoqYA60XKx4","orderId":"202401120009_7721ac70-04db-4881-b11a-49e06ca66f12","orderName":"기장 리얼맛집 뷰맛집 찾고싶다면 여기로 !","taxExemptionAmount":0,"status":"CANCELED","requestedAt":"2024-01-12T18:25:33+09:00","approvedAt":"2024-01-12T18:25:42+09:00","useEscrow":false,"cultureExpense":false,"card":{"issuerCode":"33","acquirerCode":"31","number":"91002001**019*","installmentPlanMonths":0,"isInterestFree":false,"interestPayer":null,"approveNo":"45823341","useCardPoint":false,"cardType":"신용","ownerType":"개인","acquireStatus":"READY","amount":180},"virtualAccount":null,"transfer":null,"mobilePhone":null,"giftCertificate":null,"cashReceipt":null,"cashReceipts":null,"discount":null,"cancels":[{"transactionKey":"9BA7D0D8EE7107EE1A031F441D979166","cancelReason":"관리자에 의해 취소 되었습니다.","taxExemptionAmount":0,"canceledAt":"2024-01-12T18:25:58+09:00","easyPayDiscountAmount":0,"receiptKey":null,"cancelAmount":180,"taxFreeAmount":0,"refundableAmount":0}],"secret":null,"type":"NORMAL","easyPay":{"provider":"네이버페이","amount":0,"discountAmount":0},"country":"KR","failure":null,"isPartialCancelable":true,"receipt":{"url":"https://dashboard.tosspayments.com/receipt/redirection?transactionId=bikin20240112182534AIdR9&ref=PX"},"checkout":{"url":"https://api.tosspayments.com/v1/payments/OR1ZwdkQD5GePWvyJnrKQQmlWGpOMR3gLzN97EoqYA60XKx4/checkout"},"currency":"KRW","totalAmount":180,"balanceAmount":0,"suppliedAmount":0,"vat":0,"taxFreeAmount":0,"method":"간편결제","version":"2022-11-16"},
엽킹
엽킹10mo ago
@Test public void 지급_조회() { RestTemplate restTemplate = new RestTemplate(); setHeaders(); try { HttpEntity<?> entity = new HttpEntity<>(headers); ResponseEntity<String> exchange = restTemplate.exchange(url, GET, entity, String.class); if (exchange.getStatusCode() == HttpStatus.BAD_REQUEST) { System.out.println("BAD_REQUEST = "); } System.out.println("exchange = " + exchange); } catch (HttpClientErrorException.NotFound | HttpClientErrorException.BadRequest e) { TossErrorDto tossErrorDto = new Gson().fromJson(e.getResponseBodyAsString(), TossErrorDto.class); if (Objects.equals(tossErrorDto.getCode(), "ALREADY_CANCELED_PAYMENT")) { System.out.println("ALREADY_CANCELED_PAYMENT = " + tossErrorDto); } throw new BusinessException(tossErrorDto.getMessage()); } } private void setHeaders() { String encodedAuth = new String(Base64.getEncoder().encode((LIVE_KEY).getBytes(StandardCharsets.UTF_8))); headers.setBasicAuth(encodedAuth); headers.set("Accept-Charset", "UTF-8"); headers.setContentType(MediaType.APPLICATION_JSON); } 조회시에도 여전히 깨져서 나옵니다 ㅠ
유부장
유부장10mo ago
새로운 환경 인가요? Postman 같은 환경에서 해보실 수 있다면 가장 좋을것 같습니다. 만약 Postman 같은 환경에서 수행시에 문제가 없다면, 해당 API 호출을 수행하는 서버에서 인코딩 처리에 문제가 있다, 라고 할 수 있을것 같아요.
엽킹
엽킹10mo ago
알겟습니다 포스트맨에서 정상적으로 노출이되네요 😵
유부장
유부장10mo ago
네, 그럼 이제 서버에서 인코딩 처리 부분을 하나씩 파보면 좋을것 같네요 이 부분을 하나씩 확인 해보시겠어요?
엽킹
엽킹10mo ago
원인파악이 먼저였어서 답변 감사합니다
토스페이먼츠 BOT
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.