에스크로 구매확정의 개념 질문
A라는 주문에
각각 다른 3개의 상품이 셀러가 다 달라서
송장번호가 다 다르다 할경우
에스크로 배송정보등록은 하나의 송장만 하는거 같은데..
이러면 A주문중에 하나라도 먼저 배송완료가 되면 3일뒤에 해당 주문에 대해 남은 배송전 2개 상품에 대해서도 구매확정이 되버리는건가요?
59 Replies
⏳ 잠시만 기다려주세요! 곧 답변드리겠습니다
오류 문의일 경우 아래 정보를 미리 전달해주시면, 빠른 답변에 도움이 됩니다.
- 주문번호(orderId) :
- 문의 내용 :
(img를 함께 첨부해주시면 도움이됩니다)
* 계약관련 내용은 1544-7772로 문의주세요.
* 주말/공휴일에는 답변이 늦을 수 있어요.
구매확정을 주문번호 단위가 아닌...셀러가 다른 주문 상품별로는 안되는건가보죠....?
주문 a에 상품2개가 각각 셀러가 달라서 각각의 택배사와 송장번호로 운영이 되는데 이 경우 토스 상점관리자에서 에스크로 배송정보 등록시 둘중 어떤 상품의 송장번호를 넣어야 하는건가요
1개가 먼저 출발하고 남은 1개는 사유가 있어 아직 배송전인데 보낸 송장으로 에스크로를 등록해버리면 아직 하나는 나가지도 않았는데 구매확정이 되어버릴수 있는거자나요
너무 궁금하네요
죄송합니다. 에스크로는 오래된 API라 주문번호1개당 배송추적이 1개만 지원됩니다. 대표상품 1개만 송장번호 등록을 추천드려요.
박수습님이 답변을 잘못 주신것 같네요.
결제 요청하실때 에스크로 관련해서 product 정보를 여러개 보낼수 있습니다.
결제창 JavaScript SDK | 토스페이먼츠 개발자센터
토스페이먼츠 결제창 JavaScript SDK 사용에 필요한 준비와 메서드 사용법, 결제 실패 및 에러 처리 방법을 알아봅니다.
SDK v1 통결창 방식으로 requestpayment 호출시에 아래 파라미터를 보내주시면 됩니다.

이렇게 하신후에 배송정보 등록시에 productID 를 기존에 등록하셨던 productid 중에 하나로 설정해서 배송정보를 등록하시면 됩니다.
다만 이경우 하위에 모든 product 에 배송정보를 등록하셔야 하고, 모든 배송이 완료되어야 해당 결제에 대한 배송 완료처리가 됩니다.
하나라도 누락되면 배송완료처리가 되지 않으므로 주의해 주시기 바랍니다.
안녕하세요 냥과장님 우선 이해가 안가는게 토스 상점관리자에서 배송정보 등록을 운송장 기반/ 수령자 기반으로 하게 되있는데
배송정보 등록 플로우에는 productId 에 대한 설정은 없는걸로 보입니다만

네 해당 방식은 API 로만 가능합니다.
그러다 보니 저희가 포트원을 이용하는데 포트원이 제공하는 에스크로 api들이 토스랑만은 제휴가 안맺어져 있다 합니다.
그래서 토스에서 자체 제공하는 에스크로 관련 api 문서를 찾아봐도 xpay?? 너무 old한 jsp,php이런 방식만 제공하는거 같은데
rest api가 존재 하는거 같지 않습니다 아무리 찾아봐도 혹시 관련 문서 링크가 있을까요?
이러면 저희는 에스크로 결제가 더 많은데 데이터를 자동화를 못시키니 매번 상점관리자 가서 수동으로 배송정보 및 수령인 등록하고 구매확정 또는 구매취소가 되도 싱크를 못마추니 매번 사람이 모니터링 해서 저희쪽 구매확정 상태도 바꿔줘야 하고...이게...너무 노가다성이 커서 pg사를 바꿔야 되는 상황이다 보니 답답합니다 ㅠㅠ
에스크로 API 는 XPAY 만 제공하고 있습니다. 이부분은 포트원이 저희를 연동하지 않아서 발생하는 것 같네요. 자동화 하시려면 XPAY 방식을 사용하시는 수밖에 없어 보입니다.
다만 XPAY 방식이 restful 이 아닐뿐이지 그냥 파라미터를 get 으로 보내는 방식이라 해보시면 그렇게 어렵지는 않으실겁니다. 다만 포트원에서 저희가 관리하는 주문번호를 그대로 확인 가능한지는 확인해 보셔야 할겁니다. 아마 저희 주문번호를 포트원에서 안보내주는 것으로 알고 있어서요.
https://docs.google.com/document/d/1N8oe5uzUcAbds-xADKquz2aFJld-yzhk/edit
아 그말은 xpay를 저희는 reactjs 환경인데 따로 jsp나 php로 화면을 구축하는게 아니라
저 문서에 있는
https://pgweb.tosspayments.com/pg/wmp/mertadmin/jsp/escrow/rcvdlvinfo.jsp
해당 url을 이용해 백엔드 단에서 가능하다는 말씀이신거죠?
Google Docs
XPAY[기타]에스크로_v.2.0.docx
Xpay-기타-에스크로 Protocol and Core Function Specification Version 2.0 2023.07 목차 에스크로 서비스의 개요 3 연동 샘플 파일 구조 4 API를 통한 배송정보 등록 및 배송완료 등록 4 API URL 4 배송정보 등록 요청 파라미터 5 배송완료 등록 요청 파라미터 6 ▪ 배송정보 등록 및 배송완료 등록 응답 파라미터 6 처리결과 수신 7 처리결과 수신페이지 URL 등록 7 처리결과 전송 파라미터 7 Appendix. 발송택배사 코드...
네 에스크로는 별도의 모듈 없이 URL 에 파라미터만 호출해 주시면 됩니다.
다만 말씀드린대로 포트원 주문번호하고 저희 주문번호가 다를 것으로 보이는데 이부분 확인해주시면 됩니다. 파라미터 값으로 저희 주문번호를 보내주셔야 해요.
포트원 자체에 저희가 생성한 유니크한 아이디를 주문 아이디로 보고 토스토 그 주문아이디 동일한걸로 압니다
첫번째가 포트원 결제내역 두번째가 토스페이먼츠


네..저도 그랬던 히스토리를 3개월전인가 들었어서 근데 저 xpay가 제가 오해를 했었는데 저희도 뭔가 화면단을 jsp 나 php로 구축하는게 아닌 걍 토스의 jsp 링크에 파라메터를 던지는 식이면 백엔드단에서 해볼만 할거 같습니다 저희가 짐 포트원 모듈 버전 바꾸는 공수보다
앗 저는 백엔드 개발자라 정확히 짐 소스를 볼수는 없어서
https://developers.portone.io/api/rest-v2/payment?v=v2#get%20%2Fpayments%2F%7BpaymentId%7D
이거 이용중입니다 v2로 했어요
ㅠㅠ 넵 그래서 포트원한테 토스 빠르게좀 지원해달라 했었는데 아직 안되길래 방법을 찾을려고 했는데 xpay가 오해였군요 가능할것 같네요 함 해보겠습니다
도움주신분들 감사합니다 일단 xpay로 해봐야 겠네요
하나만 번외 질문합니다
우선 가상계좌(에스크로) 는 구매확정 전에 전체 취소는 되는데 부분취소는 안되는걸 테스트를 통해 확인했습니다.
근데 개인신용카드는 간혹 카드사에 따라 선택적으로 사용자가 에스크로를 적용할수 있는데
개인신용카드(에스크로)는 구매확정전에도 부분취소가 되고 있더라구요 이게.. 정책적으로 맞는걸까요?
토스페이먼츠 결제연동팀
아 넵 감사합니다
혹시 xpay는 테스트 에스크로 결제에 대해서도 가능한걸까요?
아 넵 그래서 운영으로 함 해봤는데요 에러 메세지 이해가 잘 안가서요 ㅠㅠ
이렇게 보냈는데
{
"mId": "im_pdevus601a",
"lastTransactionKey": "C91AA50DD3C40A8CBB00FC992C09FE1F",
"paymentKey": "im_pd20240925144807CrHj3",
"orderId": "20240925144805889_32137",
"orderName": "포스트제너럴 브라스 후크 & 코드릴",
"taxExemptionAmount": 0,
"status": "WAITING_FOR_DEPOSIT",
"requestedAt": "2024-09-25T14:48:07+09:00",
"approvedAt": null,
"useEscrow": true,
"cultureExpense": false,
"card": null,
"virtualAccount": {
"accountNumber": "56389073771242",
"accountType": "일반",
"bank": "국민",
"bankCode": "06",
"customerName": "기형남",
"dueDate": "2024-09-26T14:48:03+09:00",
"expired": false,
"settlementStatus": "INCOMPLETED",
"refundStatus": "NONE",
"refundReceiveAccount": null
},
"transfer": null,
"mobilePhone": null,
"giftCertificate": null,
"cashReceipt": null,
"cashReceipts": null,
"discount": null,
"cancels": null,
"secret": "ps_yZqmkKeP8gakPKpkDO2KVbQRxB9l",
"type": "NORMAL",
"easyPay": null,
"country": "KR",
"failure": null,
"isPartialCancelable": true,
"receipt": {
"url": "https://pgweb.tosspayments.com:9091/MpFlowCtrl?eventDiv1=search&eventDiv2=getCasReceiptList&trxid=im_pd20240925144807CrHj3&SYSTEM=NEW"
},
"checkout": {
"url": "https://api.tosspayments.com/v1/payments/im_pd20240925144807CrHj3/checkout"
},
"transactionKey": "C91AA50DD3C40A8CBB00FC992C09FE1F",
"currency": "KRW",
"totalAmount": 8500,
"balanceAmount": 8500,
"suppliedAmount": 7727,
"vat": 773,
"taxFreeAmount": 0,
"method": "가상계좌",
"version": "2022-07-27",
"metadata": null
}
이게 토스 개발자 센터의 저 주문에 대한 토스측 api 로그인데요
productId를 어떤걸 넘겨야 하나요?
저기서 말하는 productId가 뭘 넘겨야 하나요? 저희 상품아이디일까요?
저희는 프론트단에서 에스크로 결제시에 뭐 저희 상품고유아이디를 넘기고 그런게 없었던걸로 알아서
참고로 저희는 프론트엔드단도 v2를 쓰긴합니다만...
그게..정확히..뭔지.. 결제할때부터 뭐 넘겨야 하는건가요 자바스크립트로..?
혹시 프론트단도 xpay를 이용할려면 v1으로 했어야 하나요?
잠시만요 프론트 개발자 분께 문의해볼게요
흑흑 저게...javascript sdk 마저 v1이용하는거면 안될텐데...ㅠㅠ 일단 짐 보고 있습니다
{
"storeId": "store-2d4101a7-b710-4287-abff-e184d60a663a",
"channelKey": "channel-key-992d44e7-a979-4fa4-8d0d-ab37b0d7cac5",
"orderName": "포스트제너럴 행잉 키 홀더 울프 브라운",
"totalAmount": 12000,
"isEscrow": false,
"currency": "CURRENCY_KRW",
"redirectUrl": "http://localhost:3001/order/complete",
"customer": {
"customerId": "7",
"fullName": "",
"phoneNumber": "01043465227"
},
"appScheme": "poinappdev://",
"card": {},
"payMethod": "CARD"
}
이게 현재 포트원 v2 sdk 에 넘기고 있는 정보였다 합니다
근데 포트원에도 위와 같은 저희 상품 객체를 넘기는게 존재는 했는데 보내고 있지는 않았다 합니다

아 넵넵 저 객체 넘겨 보라 할게요
❤️ 기술문의 경험이 어떠셨나요?!
간단히 코멘트 남겨주세요! 제품 발전에 큰 힘이 됩니다.
운영에서 해봐야 하니 배포까지..좀 시간이 걸려서..
아 로컬에서 저희 운영바라보고 해보겠다 하네요
참고로 SDK 방식의 에스크로는 시간이 좀 리는 것으로 알고 있습니다.
윽..포트원 sdk상에서 v2에 에스크로일경우 저 product 객체를 넘기면 포트원측에서 에러가 토스페이먼츠 에러가 내려온다고 하네요 400에 잘못된 요청이라고 나온다네요
{
"storeId": "store-2d4101a7-b710-4287-abff-e184d60a663a",
"channelKey": "channel-key-992d44e7-a979-4fa4-8d0d-ab37b0d7cac5",
"products": [
{
"amount": 12000,
"id": "1376",
"name": "포스트제너럴 유니버셜 클립 실버",
"quantity": 1
}
],
"orderName": "포스트제너럴 유니버셜 클립 실버",
"totalAmount": 12000,
"isEscrow": true,
"currency": "CURRENCY_KRW",
"redirectUrl": "http://localhost:3001/order/complete",
"customer": {
"customerId": "7",
"fullName": "",
"phoneNumber": "01043465227"
},
"appScheme": "poinappdev://",
"card": {},
"payMethod": "CARD"
}
INVALID_REQUEST 잘못된 요청입니다. The bad request.
포트원 v2가 지원을 안하는걸까요..?
신용카드는 저 products를 넘기면 잘된다는데
포트원측에 이 요청에 따라 저희쪽으로 넘긴 주문번호를 확인해 주시기 바랍니다.
지금 보내주신 정보로는 저희가 로그를 확인할수가 없네요.
tranjactionId말하는걸까요?
에초에 클라이언트 단에서 bad request인거 보니 어디에도 로그가 안남았을거 같아요
그럼 결제를 시도하신 시점은 정확히 아시나요ㅕ?
마지막 실패한 시점이 15:53 51초라 합니다
흠 저희 로그상으로는 INVALID_REQUEST 가 해당 시간대에 나간 로그가 확인되지 않습니다.
포트원이 저희쪽으로 문의 하도록 해주세요. 지금 가맹점쪽 정보로는 저희가 로그를 트래킹 할수가 없습니다 (중간에 포트원이 자체적으로 정보를 생성해서 저희와 comm 하고 있어서요)
일단 신용카드 에스크로 일경우는 저 products 넘겨서 잘되고 있더라구요
{
"mId": "im_pdevus601a",
"lastTransactionKey": "6A5AC1B6D0E7A577546719B5208C649C",
"paymentKey": "im_pd20240925155845CNLx3",
"orderId": "20240925155844603_82433",
"orderName": "포스트제너럴 유니버셜 클립 화이트",
"taxExemptionAmount": 0,
"status": "DONE",
"requestedAt": "2024-09-25T15:58:45+09:00",
"approvedAt": "2024-09-25T16:01:12+09:00",
"useEscrow": true,
"cultureExpense": false,
"card": {
"company": "국민",
"issuerCode": "11",
"acquirerCode": "11",
"number": "94912374**703*",
"installmentPlanMonths": 0,
"isInterestFree": false,
"interestPayer": null,
"approveNo": "30000028",
"useCardPoint": false,
"cardType": "체크",
"ownerType": "법인",
"acquireStatus": "READY",
"receiptUrl": "https://dashboard.tosspayments.com/receipt/redirection?transactionId=im_pd20240925155845CNLx3&ref=PX",
"amount": 12000
},
"virtualAccount": null,
"transfer": null,
"mobilePhone": null,
"giftCertificate": null,
"cashReceipt": null,
"cashReceipts": null,
"discount": null,
"cancels": null,
"secret": "ps_PBal2vxj81LwbRPX6mokr5RQgOAN",
"type": "NORMAL",
"easyPay": null,
"country": "KR",
"failure": null,
"isPartialCancelable": true,
"receipt": {
"url": "https://dashboard.tosspayments.com/receipt/redirection?transactionId=im_pd20240925155845CNLx3&ref=PX"
},
"checkout": {
"url": "https://api.tosspayments.com/v1/payments/im_pd20240925155845CNLx3/checkout"
},
"transactionKey": "6A5AC1B6D0E7A577546719B5208C649C",
"currency": "KRW",
"totalAmount": 12000,
"balanceAmount": 12000,
"suppliedAmount": 10909,
"vat": 1091,
"taxFreeAmount": 0,
"method": "카드",
"version": "2022-07-27",
"metadata": null
}
근데 넘겼던 productId정보는 토스 api 로그에도 안보이기는 하는데..
걍 저희가 넘겼던 id를 xpay 파라메터에 넘겨볼까요?
신용카드는 잘된다면 저희는 신용카드와 다른 결제 수단의 파라미터가 다르지 않기 때문에 포트원쪽에서 구현을 잘못하셨을 가능성이 높아 보입니다.
이부분은 말씀 드린대로 포트원쪽에서 저희 쪽으로 직접 문의 하도록 해주세요.
에스크로 배송 정보 등록하는 걸 지원하지 않는거지
지금 적광님이 문의 하고 계신건 결제 생성시에 product 정보를 넣는 부분이라 다른 내용입니다.
히스토리가 xpay를 이용해 배송정보를 등록시 파라메터중에 productId가 있어서 이거를 문의하다보니
애초에 결제시부터 product정보를 넘겨야 한다라고 해서
짐 추가적으로 넘겨보고 있는 상황인데
신용카드는 넘겼을시 에러 없이 다 잘 되고 있고 가상계좌는 포트원측에서 400 bad request를 내려주고 있습니다
그래서 우선 신용카드 product 넘겨서 잘된 토스의 api 로그을 봐도 위에처럼 useEscrw true로 잘갔는데 뭔가 내려오는것중에 저희가 넘긴 products 정보는 안보여서
일단 xpay jsp에 한번 시도해보려 합니다
그런데 이거 product ID 는 어떻게 넣으신건가요?

저에러는 해시코드를 잘못 넣으신 겁니다.
이미지 다시 보냈습니다
이전거여서 상품아이디를 찾을수 없다 합니다
넵 맞아요
@적광 님 지금 보면 포트원에서 저희쪽으로 product ID 정보가 안넘어 오고 있습니다.
포트원에서 안넘겨서 에러가 발생하지 않은 겁니다.
저희 프론트 개발자분을 초대해보겠습니다
포트원에서 안보내신거라 개발자분 초대하셔도 하실수 있는 게 없습니다.
넵 위에 전문이 포트원에 가상계좌이면서 에스크로이면서 product객체 넘기면 애초에 400 bad request
네 그부분은 포트원에서 저희쪽으로 데이터를 잘못 보내시는 것 같아요.
그래서 포트원 개발자가 요청하신 데이터를 가지고 저희한테 문의를 해주셔야 합니다.
네 내부 슬랙 채널이 있어서 포트원에서 확인하신후 저희쪽에 문의 할게 있으시면 연락 주실겁니다.
그 이후에 @적광 님 쪽에서 추가 테스트를 진행하셔야 합니다.
안녕하세요 ~! 더블루아워 프론트개발자 입니다 ~!
지금은 가맹점 쪽에서는 하실수 있는게 없어요.
넵 이방에서 대기해보고 있겠습니다
아 번외 질문이 제가 저 xpay jsp에 파라메터 hash데이터를 잘못한거죠? 전 걍 문서대로 스트링 붙힌건데 저걸 md5인코딩해서 로직으로 해서 보내야 했던거죠?
im_pdevus601a //상점아이디
20240925155844603_82433 //주문번호
01 //구분값
202409251400 //실수령일자
해서 jsp에 파라메터 다 제대로 보낸거 같은데
위와 같이 에러가 떠서요 제가 뭐 잘못한게 있나 싶네요 ㅠㅠ

아 mertkey만 조합하지 말고 다시 md5 인코딩해서 넘겨보란 말씀이시죠? 넵 잠시만요
앗 아항
넵 얼른 지웠어요 ㅠㅠ
얍얍
감사
일단 왜 fail이 뜰까요 ㅠㅠ
ㅠㅠ 넵..다 맞는데....흠..
넵넵
포트원 v2 sdk 를 통해서
가상계좌 선택 + 에스크로 적용 + payload 내 products 배열 을 넣었을 경우 발생합니다
위와 같은 조건에서 products 배열을 빼면 정상 동작 하구요
네네
오우
저희쪽에 상품정보 넘기면서 성공했던 신용카드(에스크로)는
xpay 로 성공했네요
배송완료로도 잘 바뀌었네요
아까 제가 mertkey를 다른 상점아이디껄 쓰고 있었네요 ㅠㅠ


이제 그 가상계좌시 상품아이디 넘기는거 포트원측 안되는것만..해결되면..
허허 이게 제가 혹시나 해서 productId 안넘기던 버전으로 가상계좌 에스크로 결제 일으키고 xpay로 배송정보 등록 해보니 잘됬어여...
애초에 제가 xpay 잘 못해서 에러나던거였는데 productId가 없다는 메세지에 여기까지 온거 같긴한데...
아 넵 혹시나 해서 가상계좌로 구매했던 상품이 두개라 &productId=111,222 일케 xpay에 넘겨봤더니..딱히 에러 없이 ok 떨어지긴해서... 저희 이전 상품정보 안넘기던...버전으로
넵 그래도 되면 정석이 맞을거 같으니..답 기다리겠습니다
일단 포트원에서 카드는 상품정보를 안넘기시는 것으로 보입니다.
가상계좌쪽은 지금확인중인데 연동에 좀 이슈가 있어서 포트원에서 수정하시면 될것 같아요.
네 잠시만요 프엔 개발자분 다시 들어오라 할게요
맞습니다 코드 옵셔널한 값인거같아서 안보내고 있었는데 보내볼게요 !
오우 잘 됬네요 포트원에..가능하시면 문서에 필수라고 좀 수정좀..
code 값 추가하고서는 아까 에러나던 부분에서 정상 동작 했습니다 ~! 🙂
감사합니다 !
그럼 저희가 하나의 주문에 판매자 a 상품과 b 상품이 송장이 다를경우 저 xpay 파라메터에 productId를 두개 콤마 구분해서 넣아야 두 제품이 모두 배송완료시 판단되서 구매확정 프로세스가 진행되나요?
아직 뭘로 할지 정하진 않았는데 03은 송장을 하나만 넣는거 같아서
이러면 제가 말하는 개념이 안될거 같아서요
그래서 어제 비슷한 질문하니 그럼 이런케이스는 걍 주문의 마지막 상품이 배송완료시 01개념으로 하라고 하긴 하시더라구요
짐 이문제는 저 파라메터 producId와는 전혀 무관한건지..
넵 주문 A 에 판매자 a,b 제품이 배송이 택배사 송장부터 각각 이루어져야 되는데 배송정보 등록을 송장기반으로 하면 하나만 등록해야 해서 시스템이건 수동이건 마지막 배송나간 판매자 제품이 배송완료되는걸 저희가 판단해서 xpay를 01이건 03이건 해야하는 수밖에..없는거 같은데..제가 이해한게 맞는지..
넵 아무튼 위 문제는 도움주셔서 정말 감사합니다 모두