EasyPay

새글쓰기

[간편결제 연동 기초 자료] toss, kakaopay, kginicis, paypal, naverpay
오프라인에서 물건을 사면 대개 카드를 사용한다. 사는 사람과 파는 사람이 이 거래에 관여한다. 현금거래와 달리 카드의 경우 사는 사람과 파는 사람 사이에 단말기를 통한 상호 인증과정이 필요하다. 소비자의 카드를 판매자가 받아 단말기로 인증 받아야만 거래가 성사된다. 이러한 카드 거래 과정을 인터넷 온라인상으로 옮기려면 어떻게 해야할까? 온라인 거래는 디지탈 프레임워크 혹은 어플리케이션이 단말기를 대신하게 된다. 이 어플리케이션을 개발해 판매자와 소비자를 중개하는 회사를 Payment Gateway 회사라고 한다. 줄여서 PG사라고 한다. PG사 마다 자신들이 개발한 어플리케이션 소스코드는 서로 다르다. 아마 전체적인 흐름과 구조는 유사할 것이다. 세계적인 PG사로는 엘론머스크가 창업에 관여한 페이팔이 있다. 한국에는 KG이니시스, 올더게이트, 네이버페이, 토스, 페이코 등이 있다. 이들 회사마다 비슷한 구성에도 불구하고 실제 코딩은 모두 다르다. 프로그래머에게 이런 코드가 필요해라고 주문하면 100명의 프로그래머가 100가지 프로그램을 짜온다는 이야기가 회자될 만큼 프로그래밍은 프로그래머 개인의 주관적 관점과 실력이 개입된다. 그로 인해 각 회사의 어플리케이션은 서로 다르다. 이 서로 다른 어플리케이션을 자사의 쇼핑몰에 연동하여 사용해야 한다. PG사의 수 만큼 다양한 어플리케이션을 사용해 쇼핑몰에 연동하려면 이 모두를 이해하는 개발자가 필요하다. 쇼핑몰을 만드는 프로그램 언어가 다르고 이를 만드는 개발자도 모두가 서로 다른 배경과 실력으로 인해 개발에는 꽤 많은 시간이 걸릴 수 밖에 없다. 그러다보니 최근에 이러한 진입장벽을 뛰어 넘게 하는 다양한 서비스가 시장에 소개되고 있다. 전지전능한 개발자가 아닌 다음에댜 결제 연동은 결코 쉬운 일이 아니다. 진입장벽이 높은 것이다. 0과 1을 토대로 한 디지털프레임의 소심한 특징을 완벽하게 맞추어주려면 머리에 쥐 나는 경우가 다반사다. 사실 풀어내놓고 보면 너무도 정확하게 들어맞는 구조였다는 것을 알게 되 허탈하다. 하지만 실행에 이르는 과정이 지난하다는 점은 그 누구도 부인하지 못할 것이다. 고생스러운 만큼 보람있다. 자 이제 그 길로 가보자. 먼저 KG이니시스의 신용카드 결제 시스템 연동으로 부터 시작하기로 한다. 그 다음으로 Toss와 KakaoPay그리고 PayPal등을 살펴보자. 네이버페이 개발 https://developer.pay.naver.com/ 가맹점관리자 https://admin.pay.naver.com/home?showPopup=interlock KG이니시스. 카카오페이 개발 https://developers.kakao.com, 카카오 가맹점 관리자 페이지 : https://pg.kakao.com 일반문의 pg@kakaocorp.com, 기술 문의 진평수님 kakaopay_pg@kakaocorp.com 토스 개발https://tossdev.github.io/index.html, 가맹점관리자. https://merchant.pay.toss.im/dashboards, KG이니시스 개발 https://manual.inicis.com 가맹점관리자, https://iniweb.inicis.com/nxaview/index.jsp 기술지원 문의 ts@kggroup.co.kr KG 이니시스는 MID외 알아야 할 key가 세 가지 있다. 1.웹결제 signkey ZTNDcStvMXZrOWhHaTdqZldsL1JyZz09 2.모바일금액위변조 hashykey 3.INAPI key 간편결제 PC 다이렉트 호출 옵션 * KPAY : gopaymethod = kpay * PAYCO : gopaymethod = onlypayco , acceptmethod = cardonly * 삼성페이 : gopaymethod = onlyssp , acceptmethod = cardonly * LPAY : gopaymethod = onlylpay , acceptmethod = cardonly * SSG페이 : gopaymethod = onlyssgcard , acceptmethod = cardonly * 카카오페이 : gopaymethod = onlykakaopay , acceptmethod = cardonly * 토스 : gopaymethod = onlytosspay , acceptmethod = cardonly * 네이버페이 : gopaymethod = onlynaverpay , acceptmethod = cardonly * CHAI pay : gopaymethod = onlychaipay , acceptmethod = cardonly * 간편결제 다이렉트 호출 시 '신용카드 전용화면' 계약이 되어있어야 합니다. * 당사 테스트 MID로 부분취소 진행 시 정책상 사유로 부분취소 진행 되지 않습니다. 실 MID로 테스트 부타드립니다. 간편결제 모바일 다이렉트 호출 옵션 간편결제 다이렉트 옵션× 1. 간편결제는 계약 시 통합범용창에 자동 노출됩니다. * KPAY: P_RESERVED = d_kpay=Y * PAYCO: P_RESERVED = d_payco=Y * 삼성페이: P_RESERVED = d_samsungpay=Y * LPAY: P_RESERVED = d_lpay=Y * SSG페이: P_RESERVED = d_ssgpay=Y * 카카오페이: P_RESERVED = d_kakaopay=Y * 토스: P_RESERVED = d_tosspay=Y * 네이버페이: P_RESERVED = d_npay=Y * CHAI pay: P_RESERVED = d_chaipay=Y payco 직접 연동시 https://www.nhn-commerce.com/echost/power/add/payment/payco-intro.gd 네이버페이, 토스, 카카오페이 등의 간편결제라 불리는 넷결제 방식을 데스크탑에 연동시키기 위해 2주간 삽질한 결과 토스와 카카오페이를 아임포트를 통하지 않고 직접 연동하는 방법을 찾았다. 네이버페이는 주문형이냐 결제형이냐의 문제가 해결되지 않아 아직 미결이긴 하다. 하지만 연동 방법은 쉬운 편이다. 토스는 curl 로 결제요청하면 받게되는 응답에서 필요한 부분을 리다이렉트하면 결제가 연동되는 방식이다. 요청 코드는 Content-type:json이다. 카카오페이 역시 curl로 결제준비하면 받게되는 응답에서 필요한 부분을 리다이렉트하면 결제가 연동되는 방식인데 요청 코드는 Content-type:pplication/x-www-form-urlencoded;charset=utf-8 을 사용한다. 둘 다 curl을 예시로 보여주므로 자신이 사용하는 프로그래밍 언어에 맞추어 코드를 변환하여 사용하면 된다. 이 부분이 어려운 부분이다. 그 전에 curl예시에 제시된 "Authorization: KakaoAK {APP_ADMIN_KEY}" 와 같은 내용은 KakaoAK {APP_ADMIN_KEY} 부분을 어떻게 입력해야할지가 내 경우 쉽지 않았다. 한 칸을 띠고 중괄호, left brace 열고 APP_ADMIN_KEY 쓰고 중괄호, right brace 닫고 인데 이게 이해가 되지 않는 부분이었다. 질의를 통해 kakaoAK jdkslahfklas-키값-28794379 이라고 쓰면 되는 식이었다. 초행길의 경우 바로 옆에 목적지가 있어도 잘 모르는 경우와 비슷하다. 여기에 대한 배려까지 있으면 너무 친절한건가? 이건 시작이고.. 내 경우 C# .NET을 사용하므로 toss와 kakaoPay 이 둘을 변환시키기 위해 여러 과정을 거쳤다. 우선 구글링으로 curl to C#을 통해 웹상에서 curl을 C# .NET으로 변환해주는 사이트를 찾았다. https://reqbin.com/req/csharp/c-w7oitglz/convert-curl-to-http-request 가 큰 도움이 됐다. toss의 경우 Content-Type: application/json 이고 kakaoPay는 application/x-www-form-urlencoded;charset=utf-8 이다. 따라서 이에 따라 위 변환사이트에서 변환하여 사용할 때 toss를 먼저 했었는데 toss의 경우 wrong: ""orderNo"":""${orderNo}"" right: ""id"": """+ idValue + @""" 와 같이 코드 형식을 맞추는 것이 힘들었다. 반면 kakaopay는 변환 Request 아래부분 curl -v -X POST "https://kapi.kakao.com/v1/payment/ready" \ -H "Authorization: KakaoAK {APP_ADMIN_KEY}" \ --data-urlencode "cid=TC0ONETIME" \ --data-urlencode "partner_order_id=partner_order_id" \ 후략 을 변환사이트 https://reqbin.com/req/csharp/c-w7oitglz/convert-curl-to-http-request 에 입력하고 curl -v -X POST "https://kapi.kakao.com/v1/payment/ready" \ -H "Authorization: KakaoAK {APP_ADMIN_KEY}" \ -d "cid=TC0ONETIME" \ -d "partner_order_id=partner_order_id" \ 로 코딩을 정리하는 작업 후에야 사용 가능한 코드결과가 도출되었다. 글로 미처 기록하지 못한 지난한 부분이 사이사이 있다. 그리고 나서 아임포트의 자료를 보았다. 아임포트에 KG이니시스가 기본 PG사로 등록되어 있다. 아임포트 시스템 설정에 들어가면 내정보에 가맹점 식별코드 REST API키와 비번이 있다. KG이니시스에 들어갈 때 사용하는 PG상점 아이디, MID 라고도 표기되는 내용이 아임포트의 PG설정(일반결제 및 정기결제)에 기록되어 있다. 결국, 간편결제를 위해 KG이니시스와 아임포트의 정책 그리고 간편결제의 경우 네이버페이는 KG이니시스를 통해 서비스 되지 않는다고 하니까 게다가 결제형과 주문형이라고 하는 까다로운 절차가 네이버페이에는 있어서 신청 자체를 세 번 째 하는 짜증나는 상황이다. 토스, 카카오페이, 페이코 등을 KG이니시스에서 가능하다. 제휴가 되어 있다는 것이다. 이러한 배경을 이해하였었더라면 애초에 아임포트를 사용하지 않는 것이 편했을 상황이다. 특히 카카오 페이는. 하지만 페이코를 해보면 어떤 것이 편한지 알 수 있을 것이다. 아임포트와 카카오 페이에 각각의 상황을 메일로 문의하였다. 아임포트는 admin_key 대신 아임포트 메뉴얼대로 진행하거나 카카오페이를 통해 해결하라고 한다. 카카오페이는 호스팅사 변경이 가능하며 그를 위해 신청서와 새로 어플리케이션을 만들고 네이티브 앱키를 발송해달라는 메일이 왔다. 오늘은 여기까지.

미국 영국 Amazon에서 결제된 금액을 Payoneer를 통해 받을 수 있다고 하는데 어떤 과정이 필요한가?
20210914 PAYCO로 부터 방금 들은 전화내용에 따르면 다음과 같다<br /> PAYCO를 이용할 수 있는 방법은 두 가지, 첫 째 PAYCO에 직접 가맹점으로 가입해서 이용하는 법, 둘 째, 아임포트와 같은 제휴사를 통해 이용하는 방법이다. 둘 째의 경우에 있어 한 가지 의문은 KG이니시스에 연동된 결제창을 띠우면 PAYCO결제 항목 버튼이 있는데 그것을 아임포트가 연결해준다는 것인지 아니면 제휴한 PAYCO 와 탄쯔를 중간에서 연결하는 역할을 한다는 것인지가 의문이다.

네이버페이 가맹점 가입에 대해
네이버페이 가맹점 가입은 주문형과 결제형이 있다. 결제형은 결제만 제공해주는 개념으로 간편겔제 수단은 네이버페이 포인트, 간편결제(신용카드, 계좌)가 제공된다. 고객은 네이버 ID로 로그인하여 기등록된 결제수단이 있는 경우 비밀번호만으로 쉽고 빠르게 결제를 진행할 수 있다. 그러면 결제 방식에서 네이버페이를 누르고 결제하기를 누르면 혹은 네이버페이를 누르면 간편결제로 넘어간다는 것이다. 안녕하세요, 네이버 페이입니다. 신속한 확인 감사드립니다. 독립몰로 자체 사이트 구축으로 진행확인하여 이 후 절차 안내드립니다. 입점검토진행을 위해 아래 추가 정보 회신요청을 드립니다. 1. 통신판매중개사업자 재확인 신청양식 내 통신판매중개업으로 체크해주신바 정확한 확인을 위해 문의드립니다. 하위 판매자(혹은 개인)가 입점하여 운영되는 통신판매중개업에 해당하는 사이트인지 확인을 부탁드립니다. 2. 통합형(주문형+결제형) 운영문의 주문형 서비스 가입을 하신 이력이 확인되오나 이용정지 상태로 확인됩니다. 따라서 주문형 서비스는 이용의사가 없으며, 금번 결제형 입점 후 운영예정이 맞는지 문의드립니다. 위 내용들을 회신해주실 경우 입점검토 후 안내드리겠습니다. 감사합니다. 본 메일은 발신전용입니다. 상품에 대한 불만 및 분쟁처리, 기타 관련 사항은 고객센터(1588-3819) 또는 판매자에게 문의 바랍니다. 안녕하세요. 네이버페이입니다. 전달주신 내용 확인 후 절차 안내드립니다. *입점정보(탄쯔) 독립몰 자체사이트구축, 실물상품연동(발레바), 일반결제 월 평균 거래액 460만원, 서비스 제공기간 4일 위 정보를 바탕으로 입점조건 확인시 보증보험 가입이 진행되어야 입점이 가능합니다. 보증보험금액의 경우 월정산한도에 따라 상이하며, 보통 결제형 입점시 월정산한도는 월평균매출액의 약 10%수준으로 설정합니다. 따라서 희망하시는 월정산한도 금액에 대해 회신해주시면 이에 따른 보증보험 내용으로 안내드리겠습니다. 감사합니다. 본 메일은 발신전용입니다. 상품에 대한 불만 및 분쟁처리, 기타 관련 사항은 고객센터(1588-3819) 또는 판매자에게 문의 바랍니다. 네이버 페이 FAQ l 네이버 페이 이용약관 청약철회 등에 관한 사항 l 개인정보 취급방침 Copyright ⓒ NAVER Corp. All Rights Reserved.

탄쯔홈페이지 결제수단 선택 부터 정리 - 네이버페이 간편 결제 연동
1.간편결제 추가(네이버페이 외) 2.asp:RadioButtonList 를 Html로 대체 3. 버튼 이미지 교체 4. 간편결제 클릭하면 하부에 간편결제 메뉴가 나오고 5. 다른 결제수단을 누르면 신용/체크카드결제와 현금결제 그리고 휴대폰 결제 등이 나오도록 한다. 6. 현금결제를 클릭하면 무통장입금이 선택되어 있고 은행을 선택할 수 있는 풀다운 혹은 체크리스트가 나오도록 한다.

toss 결제연동시작 / 개발문서 / 가맹점 / 결제 API key / 테스트용 연동 키, 실거래용과 테스트용 두 가지를 가맹점 관리자에서 확인할 수 있다.
가맹점관리자 https://merchant.pay.toss.im/dashboards 토스 아이디와 비번을 쳐서 들어가면 결제 API key를 조회할 수 있다. 이 아이디와 비번이 시작이다. test key sk_test_e3kWlxRR21e3kW4abL21 개발문서 https://tossdev.github.io/index.html 를 참고한다. toss 연동 asp, java, aspx 다 시도했으나 감이 안잡힌다. 결제 데모 전화번호와 생년월일 넣는 것도 안되고 (나중에 보니 이것은 TOSS회원가입을 되어 있지 않아서 그런거다 )이에 대해 이메일로 질문을 했다. 답을 기다려 보고, 감추어진 블럭 보이게 하기는 왜 안되는지 확인을 요한다. temp작업 postSte[30.aspx 에서 확인할 것. {"code":0,"checkoutPage":"https://pay.toss.im/payfront/auth?payToken=example-payToken","payToken":"example-payToken"} {"code":0,"status":200,"payToken":"PG48IYqzwyzIlmJX0Zeke0","checkoutPage":"https://pay.toss.im/payfront/auth?payToken=PG48IYqzwyzIlmJX0Zeke0"} 구매자 인증을 완료했지만 가맹점 retUrl로 결제 결과가 오지 않는 경우나 토스 서버로부터 resultCallback결과를 받지 못한다면 먼저 방화별 설정을 살펴봐야 합니다. 출처-> https://tossdev.github.io/qna.html#faq-1

toss - Curl 요청과 응답예
대부분의 결제 연동은 Curl로 표현된다. 따라서 이를 이해해야만 결제연동 코딩이 가능하다. 요청 curl https://pay.toss.im/api/v2/payments \ -H "Content-Type: application/json" \ -d '{ "orderNo":"1111", "amount":10000, "amountTaxFree":0, "productDesc":"테스트결제", "apiKey":"sk_test_w5lNQylNqa5lNQe013Nq", "autoExecute":true, "resultCallback":"https://YOUR-SITE.COM/callback", "callbackVersion":"V2", "retUrl": "http://YOUR-SITE.COM/ORDER-CHECK?orderno=1", "retCancelUrl": "http://YOUR-SITE.COM/close" }' 응답 { "code": 0, "status": 200, "payToken": "kdLKiLDPqxBsYAZADgJl16", "checkoutPage": "https://pay.toss.im/payfront/auth?payToken=kdLKiLDPqxBsYAZADgJl16" }

toss 가맹점 방화벽의 outbound 정책에 아래 토스 IP추가 - 이 내용은 불필요한 것으로 판정되었다.
domain : pay.toss.im (port : 443) 58.229.176.202 58.229.176.210 117.52.3.202 117.52.3.210 211.115.96.202 211.115.96.210

toss 간편결제 절반의 진도
{"code":0,"status":200,"payToken":"PG48IYqzwyzIlmJX0Zeke0","checkoutPage":"https://pay.toss.im/payfront/auth?payToken=PG48IYqzwyzIlmJX0Zeke0"} 값을 받았습니다. 여기서 https://pay.toss.im/payfront/auth?payToken=PG48IYqzwyzIlmJX0Zeke0 을 API Response 로 응답받은 URL 로 구매자를 리다이렉트 시킵니다. 그렇게 하면 toss결제와 연결된다. 따라서 구매자 리다이렉트만 만들어주면 된다.

toss 결제연동과정에 대한 토스측의 설명 - 이해는 쉽지않다. 하지만 알고 보면 간단한 과정이다.
사용자와 가맹점 그리고 토스가 있다. 사용자가 구매요청을 하면 가맹점은 토스로 결제생성API를 호출한다. 그러면 토스는 가맹점에 생성응답과 함께 결제URL응답을 가맹점에 보낸다. 결제생성API curl https://pay.toss.im/api/v2/payments \ -H "Content-Type: application/json" \ -d '{ "orderNo":"1", "amount":10000, "amountTaxFree":0, "productDesc":"테스트결제", "apiKey":"sk_test_w5lNQylNqa5lNQe013Nq", "autoExecute":true, "resultCallback":"https://YOUR-SITE.COM/callback", "callbackVersion":"V2", "retUrl": "http://YOUR-SITE.COM/ORDER-CHECK?orderno=1", "retCancelUrl": "http://YOUR-SITE.COM/close" }' 결제URL응답 {"code":0,"status":200,"payToken":"nXN3f5LQO1XU555OPmBze6","checkoutPage":"https://pay.toss.im/payfront/auth?payToken=nXN3f5LQO1XU555OPmBze6"} 결제URL응답으로 결제URL을 호출하면 구매자가 자신의 아이폰이나 안드로이드폰으로 정보를 입력하고 인증을 하여 사용자 유효성을 검증한다. 이 떄 가맹점이 자동승인 즉, autoExecute = true로 설정하여 결제생성 API를 구한 경우 구매자가 정상인증하였을 경우 출금을 토스가 시도하고 retURL을 호출, 그 주소-가맹자가 설정한-로 이동한다. 즉 주문완료 페이지로 사용자를 안내한다. 결제결과는 가맹점과 토스가 공유한다. 이 때 가맹점은 이번 거래 오더에 대한 payToken을 기록해둘 필요가 있다. 이것은 가맹점 데이터베이스에 기록이 되어야 하는 내용이다. 만약 autoExecute=false로 결제생성 API를 가맹점이 토스에 호출한 경우라면 사용자의 정신인증완료시 retUrl 호출시 승인요청 API (execute)를 가맹점으로 보내고 이를 통해 토스출금시도및승인응답이 이루어지고 사용자를 주문완료페이지로 안내하게 된다. 토스결제연동은간단하다라는 말은 이러한 과정을 포함한다. 그러니 이를 사용하고자 하는 가맹점에게는 결코 토스결제연동은 간단하지 않다는 말로 바꾸는 것이 좋을 듯.

toss payToken : 가맹점은 payToken을 가맹점 데이터베이스에 저장하여야 한다.
토스 가맹점이 토스에 결제 생성 요청하면서 받은 {"code":0,"status":200,"payToken":"nXN3f5LQO1XU555OPmBze6","checkoutPage":"https://pay.toss.im/payfront/auth?payToken=nXN3f5LQO1XU555OPmBze6"} 값에서 payToken을 별도로 저장하여 결제승인 혹은 결제상태 확인에 사용할 수 있어야 한다. 이 저장을 위해서 해야 할일을 정리하자. payToken을 어디에 저장해야 할까? 우선 사용중인 데이테베이스 테이블에 컬럼 toss혹은 payToken이라는 이름으로 생성하여 저장하는 방법이 있다. 이를 위해서는 asp말고 aspx 즉 asp.net이 유리하다. 우선은 원래 사용중인 테이블에 컬럼을 추가하여야 한다.

Error - The request was aborted: Could not create SSL/TLS secure channel.
https://temp.tanz.co.kr/paymentmethod/toss/tosspay.aspx 를 실행하니 생기는 에러. 구글링해보니 https://kevinchalet.com/2019/04/11/forcing-an-old-net-application-to-support-tls-1-2-without-recompiling-it/ 가 답인 듯. 출처 : https://www.codeproject.com/Questions/1255767/Could-not-create-SSL-TLS-secure-channel 아래내용을 .cs에 추가하였다. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback = (snder, cert, chain, error) => true;

toss asp.net 결제 생성 요청 코드
public partial class tossPay : System.Web.UI.Page { public string tel; public string name; public string address; public string email; public string totalprice; public string barre; protected void Page_Load(object sender, EventArgs e) { // 에러 Could not create SSL/TLS secure channel. 가 나서 아래 세 줄을 출처 : https://www.codeproject.com/Questions/1255767/Could-not-create-SSL-TLS-secure-channel 에서 참고하여 추가함. 추가 후 에러 없음 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback = (snder, cert, chain, error) => true; // tel = Request.QueryString["tel"]; // name = Request.QueryString["name"]; // address = Request.QueryString["address"]; // email = Request.QueryString["email"]; totalprice = Request.QueryString["totalprice"]; barre = Request.QueryString["barre"]; var url = "https://pay.toss.im/api/v2/payments"; var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "POST"; httpRequest.ContentType = "application/json"; var data = @"{ ""orderNo"":""11"", ""amount"":10000, ""amountTaxFree"":0, ""productDesc"":""테스트결제"", ""apiKey"":""sk_test_e3kWlxRR21e3kW4abL21"", ""autoExecute"":true, ""resultCallback"":""https://temp.tanz.co.kr/PaymentMethod/toss/callback.html"", ""callbackVersion"":""V2"", ""retUrl"": ""https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderComplete.html"", ""retCancelUrl"": ""https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderCancel.html"" }"; using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream())) { streamWriter.Write(data); } var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); HttpContext.Current.Response.Write(result); // 이 값이 결제 생성 코드를 가져온다. 성공!!! 변수 result를 분해해서 asp에서처럼 리다이렉트 하면 된다. } //Console.WriteLine(httpResponse.StatusCode); HttpContext.Current.Response.Write(httpResponse.StatusCode); } }

toss C# String.Split 으로 구매자 요청 결제 request 주소 생성
{"code":0,"status":200,"payToken":"yANjTY59loeiAAAqgnPwf2","checkoutPage":"https://pay.toss.im/payfront/auth?payToken=yANjTY59loeiAAAqgnPwf2"} 나누기 result = "{"code":0,"status":200,"payToken":"yANjTY59loeiAAAqgnPwf2","checkoutPage":"https://pay.toss.im/payfront/auth?payToken=yANjTY59loeiAAAqgnPwf2"} " string[] results = result.Split(','); results[2]는 다음과 같다. "payToken":"yANjTY59loeiAAAqgnPwf2" string payToken = results[2].Substring(12, 22) 라고 하면 yANjTY59loeiAAAqgnPwf2 가 추출된다. 하지만 payToken이 22 개의 난수이어야만 한다. 만약 이 난수가 22개를 넘어선다면 에러가 발생할 것이다. var result = streamReader.ReadToEnd(); // 결제 생성으로 넘어온 값이 result에 저장된다. HttpContext.Current.Response.Write(result); // 결제 생성 코드.성공!!! 변수 result를 분해해서 asp에서처럼 리다이렉트 하면 된다. string[] results = result.Split(','); HttpContext.Current.Response.Write(results[2]); // "payToken":"yANjTY59loeiAAAqgnPwf2" 를 가져온다. var result2 = results[2]; // 이것을 result2에 저장하고 string[] results2 = result2.Split(':'); // result2를 : 기준으로 Split한다. var result3 = results2[1]; // "yANjTY59loeiAAAqgnPwf2" 를 가져온다. var result4 = result3.Trim('"'); // quoatation mark remove method 이 result4 가 "yANjTY59loeiAAAqgnPwf2 이다 string payToken = result4 ; // payToken string 변수에 result4를 대입한다. HttpContext.Current.Response.Write(payToken); Response.Redirect("https://pay.toss.im/payfront/auth?payToken=" + payToken); // 구매자에게 넘어가는 URL

toss payToken 저장? 가맹점 데이터베이스로.
ASP.NET을 사용해 넘어온 payToken을 내 데이터베이스에 저장한다. 기존 테이블에 컬럼을 추가하는 방법 새 테이블을 만드는 방법 - 복잡하다. 우선 데이터베이스에 연결하려면 tanz.co.kr의 경우 Bin 폴더에 있는 board.dll을 유의해 볼 필요가 있다. 내용은 board.cs를 보면 알 수 있다. 거기에 public class Database { private SqlConnection dbcon; public Database() { dbcon = new SqlConnection("server=2**.4*.2**.1**;database=데이터베이이름;pwd=비번; uid=tanzseason3;"); } private void DBOpen() { if (dbcon.State != ConnectionState.Open) dbcon.Open(); } private void DBClose() { if (dbcon.State != ConnectionState.Closed) dbcon.Close(); } public void ExecuteQuery(string query) { SqlCommand cmd = new SqlCommand(query, dbcon); DBOpen(); cmd.ExecuteNonQuery(); DBClose(); } public object ExecuteQueryResult(string query) { object return_val = null; SqlCommand cmd = new SqlCommand(query, dbcon); DBOpen(); return_val = cmd.ExecuteScalar(); DBClose(); return return_val; } public DataTable ExecuteQueryDataTable(string query) { DataSet ds = new DataSet(); DBOpen(); SqlDataAdapter da = new SqlDataAdapter(query, dbcon); da.Fill(ds, "tmp"); DBClose(); return ds.Tables[0]; } } 의 내용이 있다. 그러니 저장하고 사용하려면 Database db = new Database(); 로 시작한다.

toss orderNo - 독창적인 orderNo for toss 생성하기
toss pay를 위해 만들어야 하는 독창적 orderNo는 어떻게 생성할 것인가. orderNo string 필수 Max Length: 50 가맹점의 상품 주문번호 주문번호는 50자 이내여야 하고, '숫자, 영문자, 특수문자 _-:.^@'만 사용할 수 있습니다. 주문번호는 매회 유니크한 값으로 활용해 주셔야하며, 구매자 인증완료(PAY_STANDBY) 전의 주문번호는 재사용이 가능합니다. 단, 사용자 인증완료 후에는 재 사용이 불가합니다. 테스트와 라이브 환경 사이에서 중복되지 않도록 가맹점의 관리가 필요하며 중복되는 경우 오류가 발생합니다. 의 조건이 있다. // 현재 날짜 시간을 2018-02-24 12:23:45 형식으로 받기 string s3 =DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); [Reference] : WhiteAT, 「C# .NET 자료실 - 현재 날짜 시간 받아오기」 http://whiteat.com/?mid=WhiteAT_Csharp&document_srl=230048. 예를 들어 s3에 toss를 붙이는 식으로 하면 된다. 저장은 어디에 할 것인가? 그보단 현재시간에서 Trim을 사용해 빈난을 없애고 - 와 :도 없애면 어떨까? 예를 들어 20180224122345_tossOrderNo 하는 식으로 현재시각에 접미사 _tossOrderNo를 붙인다. pageStep30.aspx.cs 라인 1040께에서 마지막 parameter에 orderNo를 추가 Response.Redirect("pageStep40.aspx?strLanguage=" + strLanguage + "&codeOfMM=" + strCodeOfMM + "&codeOfSM=" + strCodeOfSM + "&email=" + email + "&name=" + name + "&address=" + address + "&tel=" + tel + "&bankName=" + bankName + "&totalprice=" + dblTotalPrice + "&discountRate=" + strDiscountRate + "&orderNo=" + intNum);//마지막에 *dblDiscountRate을 붙여 할인 금액이 넘어감. 마지막 추가 파람 orderNo은 toss를 위해 추가한 것임

toss 결제 성공 두 건 https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderComplete.html?status=PAY_COMPLETE&orderNo=7567&payMethod=TOSS_MONEY&bankCode=004
성공으로 넘어 온 값이다. https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderComplete.html?status=PAY_COMPLETE&orderNo=7567&payMethod=TOSS_MONEY&bankCode=004 두번쨰 테스트 https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderComplete.html?status=PAY_COMPLETE&orderNo=7568&payMethod=TOSS_MONEY&bankCode=004 세번째 테스트 https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderComplete.html?status=PAY_COMPLETE&orderNo=7569&payMethod=TOSS_MONEY&bankCode=004

toss : 결제상태확인
결제생성 : ASP와 C#/.NET으로 완성한 상태. tossPay.asp, tossPay.aspx, tossPay.aspx.cs 다만 payToken의 저장이 문제다. 이 값을 가져오는 것도 그렇고. orderNo 도 intNum에 날짜를 추가했다. string today = DateTime.Now.ToString("MM/dd/yyyy HH:mm"); orderNoForToss = orderNo + today; // orderNo를 독창적으로 만든다. 따라서 toss에 저장되는 탄쯔 toss결제는 고유성을 확보하였다. 결제 상태 확인 : tossPayStateCheck.asp https://temp.tanz.co.kr/paymentMethod/toss/tossPayStateCheck.asp?orderNo=7568 응답 ' {"code":0,"payToken":"0PRGTPxg2mmSjjDM277Nab","orderNo":"7568","payStatus":"PAY_COMPLETE","payMethod":"TOSS_MONEY","amount":31500,"discountedAmount":0,"paidPoint":0,"paidAmount":31500,"refundableAmount":31500,"amountTaxable":28636,"amountTaxFree":0,"amountVat":2864,"amountServiceFee":0,"transactions":[{"stepType":"PAY","transactionId":"277cccca-89d6-4700-82d0-658d559d8e61","paidAmount":31500,"transactionAmount":31500,"discountAmount":0,"pointAmount":0,"regTs":"2021-10-09 18:10:32"}],"createdTs":"2021-10-09 18:07:30","paidTs":"2021-10-09 18:10:32"} 질의 https://temp.tanz.co.kr/paymentMethod/toss/tossPayStateCheck.asp?orderNo=7569 응답 ' {"code":0,"payToken":"YXjPfRe84eBF117M93P93e","orderNo":"7569","payStatus":"PAY_COMPLETE","payMethod":"TOSS_MONEY","amount":420000,"discountedAmount":0,"paidPoint":0,"paidAmount":420000,"refundableAmount":420000,"amountTaxable":381818,"amountTaxFree":0,"amountVat":38182,"amountServiceFee":0,"transactions":[{"stepType":"PAY","transactionId":"44327bb1-9551-49e8-aadb-77886166e793","paidAmount":420000,"transactionAmount":420000,"discountAmount":0,"pointAmount":0,"regTs":"2021-10-09 18:21:19"}],"createdTs":"2021-10-09 18:20:30","paidTs":"2021-10-09 18:21:19"} 결제환불 : 불필요하다고 판단되어 아직 비생성

toss, autoExecute=true or false, Which is adequate for me / 가맹점 결제 승인(false or true) 사용에 대해
false를 하면 approved로 가맹점 결제 승인을 사용하는 것이 번거로울 수 있으나 한 편 고객이 결제를 했다고 하더라도 가맹점의 형편, 즉 고객이 원하는 상품이 없을 경우 고객에게 상품이 없어 이번 결제는 취소한다는 식의 양해를 구하거나 혹은 상품 준비에 시간이 걸리는 것에 대해 양해를 구한 후 이것이 받아들여졌을 때 결제 승인을 가맹점 쪽에서 할 수 있다는 점에서 유리한 부분이 있다. 다만 번거롭다고 하는 작업도 아래와 같이 payToken과 가맹점 apiKey만으로 해결할 수 있으므로 어려운 일은 아니다. 요구 curl "https://pay.toss.im/api/v2/execute" \ -H "Content-Type: application/json" \ -d '{ "payToken":"example-payToken", "apiKey":"sk_test_w5lNQylNqa5lNQe013Nq" }' 답변 { "code": 0, "mode": "LIVE", "orderNo": "TossTest20190718", "amount": 2000, "approvalTime": "2019-07-18 11:28:02", "discountedAmount": 0, "paidAmount": 2000, "payMethod": "CARD", "payToken": "example-payToken", "transactionId": "2da1ca05-d91d-410f-976d-7a610242da8a", "cardCompanyCode": 3, "cardCompanyName": "삼성", "cardAuthorizationNo": "87654321", "spreadOut": 0, "noInterest": false, "salesCheckLinkUrl": "https://pay.toss.im/payfront/web/external/sales-check?payToken=example-payToken&transactionId=2da1ca05-d91d-410f-976d-7a610242da8a", "cardMethodType": "CREDIT", "cardNumber": "536100******9087" } true를 하면 complete로 답이 온다. 어느 것을 취해야 하나? false로 하면 가맹점에서 한 번 더 결제를 요구하는 것이다. 자동 승인 설정을 false로 사용하는 가맹점에서만 처리하는 로직입니다. 구매자 인증 완료 상태(PAY_APPROVED)의 결제 건을 가맹점이 주체가 되어 최종 승인하고 결제를 완료 처리합니다. 결제 승인에 관한 자세한 내용은 아래 문서를 참고하세요. 토스 결제 시작하기 > 결제 승인하기 필수 파라미터는 딱 2가지 입니다. '어느 가맹점'에서 '어떤 결제건'을 최종 승인할지 알려주세요. 필요에 따라 결제건의 유효성 검증을 할 수 있습니다.

toss, 결제 페이지 tossPayComplete.html / aspx
결제 페이지는 고객의 결제 결과를 보여주고 쇼핑 페이지로 이동할 수 있도록 구성한다. 결제상태확인 요청 curl "https://pay.toss.im/api/v2/status" \ -H "Content-Type: application/json" \ -d '{ "payToken":"example-payToken", "apiKey":"sk_test_w5lNQylNqa5lNQe013Nq" }' 결과 { "code": 0, "payToken": "example-payToken", "orderNo": "1", "payStatus": "REFUND_SUCCESS", "payMethod": "TOSS_MONEY", "amount": 15000, "discountedAmount": 0, "paidAmount": 0, "amountTaxable": 0, "amountTaxFree": 0, "amountVat": 0, "amountServiceFee": 0, "transactions": [ { "stepType": "PAY", "transactionId": "3243c76e-e9cf-4669-881b-33a3b82ddf49", "transactionAmount": 15000, "discountAmount": 300, "paidAmount": 14700, "regTs": "2020-03-01 12:33:20" }, { "stepType": "REFUND", "transactionId": "2da1ca05-d91d-410f-976d-7a610242da8a", "paidAmount": -14700, "transactionAmount": -15000, "discountAmount": -300, "regTs": "2020-03-01 12:34:11" } ], "createdTs": "2020-03-01 12:33:04", "paidTs": "2020-03-01 12:33:20" }

toss 결제상태 요청 페이지에 대해 : payToken 과 orderNo질의 모두 동일한 답을 가져온다.
cURL은 curl "https://pay.toss.im/api/v2/status" \ -H "Content-Type: application/json" \ -d '{ "payToken":"example-payToken", "apiKey":"sk_test_w5lNQylNqa5lNQe013Nq" }' ASP는 data = "apiKey=sk_test_w5lNQylNqa5lNQe013Nq" data = data & "&orderNo=1" 로 되어 있어 cURL의 payToken과 달리 orderNo 로 Request 를 하도록 되어 있다. 실행해본 결과 두 가지 다 결제상태확인이 가능하다. 그렇다면 cURL과 ASP 가 payToken 혹은 orderNo 중 하나로 통일되어 있어야 하지 않을까? http://tossdev.github.io/api.html#status 페이지를 감안하면 ASP 역시 payToken으로 설명이 되어 있는 것이 좀더 합리적이어서 가맹점 디벨로퍼가 헷갈리지 않을 거 같다. 보니까 PHP에도 orderNo가 되어 있다. 왜지? 결제 생성 : orderNoForToss 를 string today = DateTime.Now.ToString("MM/DD/yyyy HH:mm:ss")로 만들어 생성하였다. https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderComplete.html?status=PAY_COMPLETE&orderNo=10102021183033&payMethod=TOSS_MONEY&bankCode=004 - 질의 with payToken curl "https://pay.toss.im/api/v2/status" \ -H "Content-Type: application/json" \ -d '{ "payToken":"aXNqfOVjKwYTMMk4qROG0b", "apiKey":"sk_test_e3kWlxRR21e3kW4abL21" }' 토스응답 { "code": 0, "payToken": "aXNqfOVjKwYTMMk4qROG0b", "orderNo": "10102021183033", "payStatus": "PAY_COMPLETE", "payMethod": "TOSS_MONEY", "amount": 31500, "discountedAmount": 0, "paidPoint": 0, "paidAmount": 31500, "refundableAmount": 31500, "amountTaxable": 28636, "amountTaxFree": 0, "amountVat": 2864, "amountServiceFee": 0, "transactions": [{ "stepType": "PAY", "transactionId": "edc5bed0-f11b-4640-8bdc-b97e02d7ff7c", "paidAmount": 31500, "transactionAmount": 31500, "discountAmount": 0, "pointAmount": 0, "regTs": "2021-10-10 18:32:20" }], "createdTs": "2021-10-10 18:30:31", "paidTs": "2021-10-10 18:32:20" } - 질의 with orderNo ( orderNoForToss라고 명명하여 전달된) curl "https://pay.toss.im/api/v2/status" \ -H "Content-Type: application/json" \ -d '{ "orderNo":"10102021183033", "apiKey":"sk_test_e3kWlxRR21e3kW4abL21" }' 토스의 응답: 이것이 payToken 으로 질의한 것과 동일한 답이 왔음을 알 수 있다. { "code": 0, "payToken": "aXNqfOVjKwYTMMk4qROG0b", "orderNo": "10102021183033", "payStatus": "PAY_COMPLETE", "payMethod": "TOSS_MONEY", "amount": 31500, "discountedAmount": 0, "paidPoint": 0, "paidAmount": 31500, "refundableAmount": 31500, "amountTaxable": 28636, "amountTaxFree": 0, "amountVat": 2864, "amountServiceFee": 0, "transactions": [{ "stepType": "PAY", "transactionId": "edc5bed0-f11b-4640-8bdc-b97e02d7ff7c", "paidAmount": 31500, "transactionAmount": 31500, "discountAmount": 0, "pointAmount": 0, "regTs": "2021-10-10 18:32:20" }], "createdTs": "2021-10-10 18:30:31", "paidTs": "2021-10-10 18:32:20" }

toss, 테이블 orderForm2 content컬럼에 payToken과 orderNo를 content내용 위로 추가로 저장하기
어떻게 // select content from orderform2 where num='7573' 등의 쿼리로 현재 content내용을 가져온다. 그리고 여기에 payToken과 orderNo를 추가한다. string queryContent = "SELECT content FROM orderform2 WHERE num =" + orderNo + ""; DataTable dt = db.ExecuteQueryDataTable(queryContent); string contentResult = dt.Rows[0]["content"].ToString(); contentResult = contentResult.Trim(); 를 추가하고 // payToken과 orderNoForToss 를 content에 저장하면 어떨까? 예){"payToken":"payToken", "orderNoForToss":"~","content":"원래contents내용"} 즉 원래 content에 추가 접두사로 붙이는 방식. Database db = new Database(); // Database는 Bin폴더에 있는 board.dll즉 board.cs를 dll로 만든 것 안에 있는 클래스로 tanz.co.kr에 통용된다. Bin폴더 board.cs를 응용할 것 // select content from orderform2 where num='7573' 등의 쿼리로 현재 content내용을 가져온다. 그리고 여기에 payToken과 orderNo를 추가한다. string queryContent = "SELECT content FROM orderform2 WHERE num =" + orderNo + ""; DataTable dt = db.ExecuteQueryDataTable(queryContent); string contentResult = dt.Rows[0]["content"].ToString(); contentResult = contentResult.Trim(); string savePayToken = "UPDATE orderform2 set content='" + payToken + "/" + orderNoForToss + "/" + contentResult + "' WHERE num =" + orderNo + ""; //payToken은 ''안에 명기되어야 한다. db.ExecuteQuery(savePayToken); 이렇게 실행해서 아래와 같이 실행 성공 https://temp.tanz.co.kr/PaymentMethod/toss/tossOrderComplete.html?status=PAY_COMPLETE&orderNo=10102021191527&payMethod=TOSS_MONEY&bankCode=004

toss - callback(resultCallback)은 언제 어떻게 하는 것인가? [미결]
toss에 따르면 callback request는 아래와 같다. Example Request { "status": "PAY_COMPLETE", "payToken": "example-payToken", "orderNo": "1", "payMethod": "CARD", "amount": 3000, "discountedAmount": 600, "paidAmount": 2300, "paidTs": "2020-04-03 14:22:37", "transactionId" : "dc3b951a-9781-462e-ab5a-b8a0bea0222a", "cardCompanyCode": 3, "cardAuthorizationNo": "87654321", "spreadOut": 0, "noInterest": false, "cardMethodType": "CREDIT", "salesCheckLinkUrl": "https://pay.toss.im/payfront/web/external/sales-check?payToken=example-payToken&transactionId=2da1ca05-d91d-410f-976d-7a610242da8a" } 이게 아직 뭔지 모르겠다.

toss 결제상태확인 - tossPayStatus
결제상태확인 요청 https://temp.tanz.co.kr/paymentmethod/toss/tosspayStatus.aspx?payToken=8VXZS7ZgBdMFxxYK0kk764 결과 {"code":0,"payToken":"8VXZS7ZgBdMFxxYK0kk764","orderNo":"10102021191527","payStatus":"PAY_COMPLETE","payMethod":"TOSS_MONEY","amount":745000,"discountedAmount":0,"paidPoint":0,"paidAmount":745000,"refundableAmount":745000,"amountTaxable":677272,"amountTaxFree":0,"amountVat":67728,"amountServiceFee":0,"transactions":[{"stepType":"PAY","transactionId":"7714a262-3f93-4411-8aed-d514fdcbd838","paidAmount":745000,"transactionAmount":745000,"discountAmount":0,"pointAmount":0,"regTs":"2021-10-10 19:16:37"}],"createdTs":"2021-10-10 19:15:25","paidTs":"2021-10-10 19:16:37"} 결제 요청 curl: -payToken과 apiKey가 필요하다. curl "https://pay.toss.im/api/v2/status" \ -H "Content-Type: application/json" \ -d '{ "payToken":"example-payToken", "apiKey":"sk_test_w5lNQylNqa5lNQe013Nq" }' tossPayStatus.aspx.cs public partial class tossPayStatus : System.Web.UI.Page { public string payToken; protected void Page_Load(object sender, EventArgs e) { payToken = Request.QueryString["payToken"]; var url = "https://pay.toss.im/api/v2/status"; var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "POST"; httpRequest.ContentType = "application/json"; var data = @"{ ""payToken"":""" + payToken + @""", //""payToken"":""example-payToken"", <<- 이런식으로 주석을 달면 에러가 발생한다. ""apiKey"":""sk_test_e3kWlxRR21e3kW4abL21"" }"; using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream())) { streamWriter.Write(data); } var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); HttpContext.Current.Response.Write(result); } HttpContext.Current.Response.Write(httpResponse.StatusCode); } } 요청 https://temp.tanz.co.kr/paymentMethod/toss/tossPayStatus.aspx?payToken=1A5rTjpnrddupp8G3RDB2b 결과 The request was aborted: Could not create SSL/TLS secure channel. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel. Source Error: Line 41: } Line 42: Line 43: var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); Line 44: using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) Line 45: { 해결 protected void Page_Load(object sender, EventArgs e) { // 에러 Could not create SSL/TLS secure channel. 가 나서 아래 세 줄을 출처 : https://www.codeproject.com/Questions/1255767/Could-not-create-SSL-TLS-secure-channel 에서 참고하여 추가함. 추가 후 에러 없음 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; ServicePointManager.ServerCertificateValidationCallback = (snder, cert, chain, error) => true; 추가하여 해결

toss, 가맹점 결제 승인 tosspayFromApproveToComplete.aspx?payToken=examplePayToken 요청시 달라지는 것
false로 결제 요청했다 그리고 해당 payToken으로 결제 상태 확인 요청했다. https://temp.tanz.co.kr/paymentmethod/toss/tosspayStatus.aspx?payToken=EgEkfBx0D0eFkkard7dR34 결과1는 {"code":0,"payToken":"EgEkfBx0D0eFkkard7dR34","orderNo":"10112021134830","payStatus":"PAY_APPROVED","payMethod":"TOSS_MONEY","amount":1165000,"discountedAmount":0,"paidPoint":0,"paidAmount":1165000,"refundableAmount":1165000,"amountTaxable":1059090,"amountTaxFree":0,"amountVat":105910,"amountServiceFee":0,"transactions":[],"createdTs":"2021-10-11 13:48:28","paidTs":"2021-10-11 13:48:27"}OK 와 같이 "payStatus":"PAY_APPROVED" 다 이에 해당 payToken에 대해 결제 승인했다. https://temp.tanz.co.kr/paymentmethod/toss/tosspayFromApproveToComplete.aspx?payToken=EgEkfBx0D0eFkkard7dR34 결과는 {"code":0,"mode":"TEST","orderNo":"10112021134830","amount":1165000,"approvalTime":"2021-10-11 13:55:37","stateMsg":"결제 완료","discountedAmount":0,"paidAmount":1165000,"payMethod":"TOSS_MONEY","payToken":"EgEkfBx0D0eFkkard7dR34","transactionId":"7b02368b-ea96-411e-bf66-e6a7e681482d","paidPoint":0} 와 같이 trasactionId가 나왔다. 이 결과를 토대로 다시 한번 결제 상태 확인 요청을 https://temp.tanz.co.kr/paymentmethod/toss/tosspayStatus.aspx?payToken=EgEkfBx0D0eFkkard7dR34 하면 결과1과 달리 transactions부분의 내용이 달라진(내용 추가)된 결과를 볼 수 있다. {"code":0,"payToken":"EgEkfBx0D0eFkkard7dR34","orderNo":"10112021134830","payStatus":"PAY_COMPLETE","payMethod":"TOSS_MONEY","amount":1165000,"discountedAmount":0,"paidPoint":0,"paidAmount":1165000,"refundableAmount":1165000,"amountTaxable":1059090,"amountTaxFree":0,"amountVat":105910,"amountServiceFee":0,"transactions":[{"stepType":"PAY","transactionId":"7b02368b-ea96-411e-bf66-e6a7e681482d","paidAmount":1165000,"transactionAmount":1165000,"discountAmount":0,"pointAmount":0,"regTs":"2021-10-11 13:55:37"}],"createdTs":"2021-10-11 13:48:28","paidTs":"2021-10-11 13:55:37"}OK 이것을 callback하려면 어떻게?

kakaopay 결제준비 curl을 C#/.NET으로 변환
이 문서전에 31번을 참고한다. 순서가 뒤죽박죽이 되었다. curl -v -X POST "https://kapi.kakao.com/v1/payment/ready" \ -H "Authorization: KakaoAK 9e23f09fa2d36ff44c6acd990a7cb908" \ --data-urlencode "cid=TC0ONETIME" \ --data-urlencode "partner_order_id=partner_order_id" \ --data-urlencode "partner_user_id=partner_user_id" \ --data-urlencode "item_name=초코파이" \ --data-urlencode "quantity=1" \ --data-urlencode "total_amount=2200" \ --data-urlencode "vat_amount=200" \ --data-urlencode "tax_free_amount=0" \ --data-urlencode 'approval_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ --data-urlencode 'fail_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ --data-urlencode 'cancel_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' 를 C#/.NET으로 변환한다. 방법은 https://reqbin.com/req/csharp/c-w7oitglz/convert-curl-to-http-request 을 사용 위를 curl -v -X POST "https://kapi.kakao.com/v1/payment/ready" \ -H "Authorization: KakaoAK 9e23f09fa2d36ff44c6acd990a7cb908" \ -d "cid=TC0ONETIME" \ -d "partner_order_id=partner_order_id" \ -d "partner_user_id=partner_user_id" \ -d "item_name=초코파이" \ -d "quantity=1" \ -d "total_amount=2200" \ -d "vat_amount=200" \ -d "tax_free_amount=0" \ -d 'approval_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ -d 'fail_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ -d 'cancel_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' 로 수정하여 C#/.NET 변환요청하여 var url = "https://kapi.kakao.com/v1/payment/ready"; var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "POST"; httpRequest.Headers["Authorization"] = "KakaoAK 9e23f09fa2d36ff44c6acd990a7cb908"; httpRequest.ContentType = "application/x-www-form-urlencoded"; var data = "cid=TC0ONETIME&partner_order_id=partner_order_id&partner_user_id=partner_user_id&item_name=초코파이&quantity=1&total_amount=2200&vat_amount=200&tax_free_amount=0&approval_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay&fail_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay&cancel_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay"; using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream())) { streamWriter.Write(data); } var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); } Console.WriteLine(httpResponse.StatusCode); 의 결과를 얻었다. 이 부분을 통해 toss와는 달리 카카오 페이는 Content-type: application/x-www-form-urlencoded;charset=utf-8을 사용하므로 Content-type: application/json을 사용하는 경우와 다른 코딩방식을 사용하여야 한다. 관건은 Content-type고 이에 따른 코딩이 달라야 한다는 점이 주안점.

kakaopay, KakaoAK {APP_ADMIN_KEY} 는 어디서 가져오고 어떻게 풀어쓰나?
카카오페이 연동을 하려하는데, CID말고 header에 app_admin_key를 넣어야 authorization이 동작한다고 문서에 나와 있습니다. 이 키를 어디서 확인할 수 있을까요?(저희 회사랑 카카오 제휴는 되어 있는 상태입니다) 추가로 테스트 CID 인 TC0ONETIME 로 테스트하는데 필요한 app_admin_key 는 어디서 확인할 수 있을까요? 답 안녕하세요~ 카카오 디벨로퍼스에서 내 애플리케이션 > 앱설정> 요약정보에 있습니다~ curl -v -X POST "https://kapi.kakao.com/v1/payment/ready" \ -H "Authorization: KakaoAK {APP_ADMIN_KEY}" \ --data-urlencode "cid=TC0ONETIME" \ --data-urlencode "partner_order_id=partner_order_id" \ --data-urlencode "partner_user_id=partner_user_id" \ --data-urlencode "item_name=초코파이" \ --data-urlencode "quantity=1" \ --data-urlencode "total_amount=2200" \ --data-urlencode "vat_amount=200" \ --data-urlencode "tax_free_amount=0" \ --data-urlencode "approval_url=https://developers.kakao.com/success" \ --data-urlencode "fail_url=https://developers.kakao.com/fail" \ --data-urlencode "cancel_url=https://developers.kakao.com/cancel" -H "Authorization: KakaoAK {APP_ADMIN_KEY}" \ 이 부분을 부고 > -H "Authorization: KakaoAK 9e23f09fa2d36ff44c6acd990a7cb908" \ 이런식으로 써야 되는 것을 아는 것은 쉽지 않다. 이메일문의에 이렇게 쓰라는 답이 왔다. 이제 하나 해결.

kakaopay, OAuth Redirect URI는 무엇?
https://developers.kakao.com/console/app/647381/product/login 에서 Redirect URI를 등록하라고 나오고 여러개의 URI를 줄바꿈으로 추가해주세요. (최대 10개) REST API로 개발하는 경우 필수로 설정해야 합니다. 예시: (O) https://example.com/oauth (X) https://www.example.com/oauth 라고 설명되어 있는데 (O) https://example.com/oauth (X) https://www.example.com/oauth 이 무엇을 의미하는지 모르겠다. www가 붙으면 안된다는 것인데..

kakaopay, 카카오페이 결제준비 코드와 적용 그리고 실행결과 // 테스트 CID : TC0ONETIME
결제준비 Request : kakaoPay기술문서 https://developers.kakao.com/docs/latest/ko/kakaopay/single-payment 로 부터 curl -v -X POST "https://kapi.kakao.com/v1/payment/ready" \ -H "Authorization: KakaoAK {APP_ADMIN_KEY}" \ --data-urlencode "cid=TC0ONETIME" \ --data-urlencode "partner_order_id=partner_order_id" \ --data-urlencode "partner_user_id=partner_user_id" \ --data-urlencode "item_name=초코파이" \ --data-urlencode "quantity=1" \ --data-urlencode "total_amount=2200" \ --data-urlencode "vat_amount=200" \ --data-urlencode "tax_free_amount=0" \ --data-urlencode "approval_url=https://developers.kakao.com/success" \ --data-urlencode "fail_url=https://developers.kakao.com/fail" \ --data-urlencode "cancel_url=https://developers.kakao.com/cancel" 를 토대로 아래와 같이 탄쯔사에 맞추어 curl요청을 정리하였다. 이 정리에는 -H "Authorization: KakaoAK {APP_ADMIN_KEY}" \ 부분에서 KakaoAK {APP_ADMIN_KEY} 를 쓰는 것이 관건이다. APP_ADMIN_KEY는 카카오로부터 받은 CID 로 부터 시작된다. 현재 아래 적용한 cid, TC0ONETIME는 테스트 용으로 사용된다. KakaoAK {APP_ADMIN_KEY} 는 아래와 같이 사용한다. curl -v -X POST "https://kapi.kakao.com/v1/payment/ready" \ -H "Authorization: KakaoAK 9261028b91067ae7775c5a347df58f76" \ --data-urlencode "cid=TC0ONETIME" \ --data-urlencode "partner_order_id=partner_order_id" \ --data-urlencode "partner_user_id=partner_user_id" \ --data-urlencode "item_name=초코파이" \ --data-urlencode "quantity=1" \ --data-urlencode "total_amount=2200" \ --data-urlencode "vat_amount=200" \ --data-urlencode "tax_free_amount=0" \ --data-urlencode 'approval_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ --data-urlencode 'fail_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ --data-urlencode 'cancel_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' 답변 at Mac terminal Note: Unnecessary use of -X or --request, POST is already inferred. * Trying 203.133.166.33... * TCP_NODELAY set * Connected to kapi.kakao.com (203.133.166.33) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: /etc/ssl/cert.pem CApath: none * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS handshake, Server hello (2): * TLSv1.2 (IN), TLS handshake, Certificate (11): * TLSv1.2 (IN), TLS handshake, Server key exchange (12): * TLSv1.2 (IN), TLS handshake, Server finished (14): * TLSv1.2 (OUT), TLS handshake, Client key exchange (16): * TLSv1.2 (OUT), TLS change cipher, Client hello (1): * TLSv1.2 (OUT), TLS handshake, Finished (20): * TLSv1.2 (IN), TLS change cipher, Client hello (1): * TLSv1.2 (IN), TLS handshake, Finished (20): * SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384 * ALPN, server accepted to use http/1.1 * Server certificate: * subject: C=KR; ST=Jeju-do; L=Jeju-si; O=Kakao Corp.; CN=kapi.kakao.com * start date: Sep 27 00:00:00 2021 GMT * expire date: Sep 30 23:59:59 2022 GMT * subjectAltName: host "kapi.kakao.com" matched cert's "kapi.kakao.com" * issuer: C=US; O=DigiCert Inc; OU=www.digicert.com; CN=Thawte TLS RSA CA G1 * SSL certificate verify ok. > POST /v1/payment/ready HTTP/1.1 > Host: kapi.kakao.com > User-Agent: curl/7.54.0 > Accept: */* > Authorization: KakaoAK 9e23f09fa2d36ff44c6acd990a7cb908 > Content-Length: 390 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 390 out of 390 bytes < HTTP/1.1 200 OK < Date: Wed, 13 Oct 2021 06:49:32 GMT < Server: Apache < Quota-Type: INC_AND_CHECK < Content-Type: application/json;charset=UTF-8 < Content-Length: 791 < * Connection #0 to host kapi.kakao.com left intact {"tid":"T2952598340618657034","tms_result":false,"next_redirect_app_url":"https://mockup-pg-web.kakao.com/v1/88b6bc8d2668587dc2085fa5891c2c3ffd8e165fad32195d25e32f5a9f3d5fb7/aInfo","next_redirect_mobile_url":"https://mockup-pg-web.kakao.com/v1/88b6bc8d2668587dc2085fa5891c2c3ffd8e165fad32195d25e32f5a9f3d5fb7/mInfo","next_redirect_pc_url":"https://mockup-pg-web.kakao.com/v1/88b6bc8d2668587dc2085fa5891c2c3ffd8e165fad32195d25e32f5a9f3d5fb7/info","android_app_scheme":"kakaotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/88b6bc8d2668587dc2085fa5891c2c3ffd8e165fad32195d25e32f5a9f3d5fb7/order","ios_app_scheme":"kakaotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/88b6bc8d2668587dc2085fa5891c2c3ffd8e165fad32195d25e32f5a9f3d5fb7/order","created_at":"2021-10-13T15:49:32"}BYUNGILs-Mac-mini:~ byungillee$ 결제준비 코드 변환 C#/.NET var url = "https://kapi.kakao.com/v1/payment/ready"; var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "POST"; httpRequest.Headers["Authorization"] = "KakaoAK 9e23f09fa2d36ff44c6acd990a7cb908"; httpRequest.ContentType = "application/x-www-form-urlencoded"; var data = "cid=TC0ONETIME&partner_order_id=partner_order_id&partner_user_id=partner_user_id&item_name=초코파이&quantity=1&total_amount=2200&vat_amount=200&tax_free_amount=0&approval_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay&fail_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay&cancel_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay"; using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream())) { streamWriter.Write(data); } var httpResponse = (HttpWebResponse)httpRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); } Console.WriteLine(httpResponse.StatusCode);

kakaopay, 카카오페이 일반문의 pg@kakaocorp.com, 기술 문의 진평수님 kakaopay_pg@kakaocorp.com
기술문의

toss, 카카오페이를 하던 중간에 드뎌!, toss결제 탄쯔 홈페이지에 추가하기
pageStep30.aspx pageStep30.aspx.cs pageStep40.aspx pageStep40.aspx.cs PaymentMethod>toss폴더전체 위의 다섯 가지를 tanz.co.kr, www.tanz.co.kr에 카피하고 pageStep30.aspx 에서 결제 방법선택에서 우선 네이버페이는 삭제한다 pageStep40.aspx.cs에서 temp.tanz.co.kr로 되어 있는 부분을 각각에 맞게 수정한다. 그 외 toss folder에 있는 각각의 test key를 live key로 바꾼다. api key는 가맹점 사이트에 들어가 확인한다. 가맹점 들어가기 주소 https://merchant.pay.toss.im/dashboards tossPay.aspx.cs에 autoexec:false여서 결제 후 다음과 같이 결제승인요청하자. https://tanz.co.kr/PaymentMethod/toss/tosspayFromApproveToComplete.aspx?payToken=rDNYiV2B1JLFNN9kqAjAbf {"result":0,"msg":"충전계좌의 잔액이 부족하여 토스머니 충전이 불가합니다.","code":-1,"errorCode":"COMMON_NOT_ENOUGH_CASH","status":200} 로 나온다. pageStep30.aspx에 temp.tanz.co.kr이 카피되어 이를 각각에 맞게 수정해야 주소쓰기가 된다. 주요사항 : 주소 수정과 apiKey 라이브로 바꾸는 것. autoexec:true로 해서 탄쯔에서 결제를 승인요청하는 일은 없도록 하였다.

kakaoPay 결제 준비 요청에 대한 응답사례코드
맥터미날, Cygwin 처럼 curl요청을 쓸 수 있는 어플리케이션으로 아래와 같은 요청을 한 결과 응답을 얻었다. 이로써 이 요청을 C#/.NET으로 변환하면 된다. 응답은 확인 결과 tid, tms_result, next_redirect_app_url, next_redirect_mobile_url, next_redirect_pc_url, android_app_scheme, ios_app_scheme, created_at 등의 정보를 담고 있다. 요청 curl --location --request POST 'https://kapi.kakao.com/v1/payment/ready' \ --header 'Authorization: KakaoAK 9e23f09fa2d36ff44c6acd990a7cb908' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'cid=TC0ONETIME' \ --data-urlencode 'partner_order_id=partner_order_id' \ --data-urlencode 'partner_user_id=partner_user_id' \ --data-urlencode 'item_name=초코파이' \ --data-urlencode 'quantity=1' \ --data-urlencode 'total_amount=2200' \ --data-urlencode 'vat_amount=200' \ --data-urlencode 'tax_free_amount=0' \ --data-urlencode 'approval_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ --data-urlencode 'fail_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' \ --data-urlencode 'cancel_url=https://www.tanz.co.kr/PaymentMethod/kakaoPay' 응답 {"tid":"T2952495708080151410","tms_result":false,"next_redirect_app_url":"https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/aInfo","next_redirect_mobile_url": "https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/mInfo","next_redirect_pc_url":"https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7e d389d8588f6373e16d1c9ca/info","android_app_scheme":"kakaotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/order","ios_app_scheme":"kak aotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/order","created_at":"2021-10-13T09:11:16"} {"tid":"T2952495708080151410", "tms_result":false, "next_redirect_app_url":"https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/aInfo", "next_redirect_mobile_url": "https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/mInfo", "next_redirect_pc_url":"https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7e d389d8588f6373e16d1c9ca/info", "android_app_scheme":"kakaotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/order", "ios_app_scheme":"kak aotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/order", "created_at":"2021-10-13T09:11:16"}

toss, kakaopay, REST API -> C#변환시 difference between Content-Type: application/x-www-form-urlencoded vs Content-Type: application/json
toss와 kakaoPay는 각각 curl에서 요청시 제목과 같은 차이가 있다. Content-Type에. 이에 응대하는 C# 코딩 변환은? https://stackoverflow.com/questions/9870523/what-are-the-differences-between-application-json-and-application-x-www-form-url 에 따르면 {"Name": "John Smith", "Age": 23} 이 json방식 Name=John+Smith&Age=23 은 인코딩 방식이 필요하다.

kakaoPay 결제요청 - 결제준비에서 받은 응답 중에서 선택해 redirect한다. / 결제승인 과정에 필요한 내용 더 진행할 것
결제준비에 대한 응답 {"tid":"T2952495708080151410", "tms_result":false, "next_redirect_app_url":"https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/aInfo", "next_redirect_mobile_url": "https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/mInfo", "next_redirect_pc_url":"https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7e d389d8588f6373e16d1c9ca/info", "android_app_scheme":"kakaotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/order", "ios_app_scheme":"kak aotalk://kakaopay/pg?url=https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7ed389d8588f6373e16d1c9ca/order", "created_at":"2021-10-13T09:11:16"} 위에서 "next_redirect_pc_url":"https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7e d389d8588f6373e16d1c9ca/info", https://mockup-pg-web.kakao.com/v1/bfe5efa05f4e47a3ecc233cf1a7f1848fe6fd4d7e d389d8588f6373e16d1c9ca/info 를 리다이렉트하면 결제 준비가 된다. 중략 - 고객 간편결제 과정 진행 결제 승인 curl -v -X POST "https://kapi.kakao.com/v1/payment/approve" \ -H "Authorization: KakaoAK {APP_ADMIN_KEY}' \ --data-urlencode "cid=TC0ONETIME" \ --data-urlencode "tid=T1234567890123456789" \ --data-urlencode "partner_order_id=partner_order_id" \ --data-urlencode "partner_user_id=partner_user_id" \ --data-urlencode "pg_token=xxxxxxxxxxxxxxxxxxxx" QUESTION "partner_order_id=partner_order_id" \ partner_order_id String 가맹점 주문번호, 최대 100자 "partner_user_id=partner_user_id" \partner_user_id String 가맹점 회원 id, 최대 100자 ANSWER 여기에 대한 준비가 있고 이 값은 저장되어야 한다. orderform2에 tid와 함께 저장이 되어야 한다. 생성은? partner_order_id는 toss처럼 독특한 번호를 날짜와 시간으로 생성하여 저장하였다. partner_user_id는 현재 회원제가 아니어서 어떻게 생성하고 저장할지가 문제다. 사람 이름만 있을 텐데 임으로 partner_order_id 에 user를 접두사로 붙여 사용하는 방법을 생각해보아야 할 거 같다.

bin 폴더내 board.cs, board.dll, temp.tanz.co.kr을 프로젝트로 살린 후 자동으로 생성된 bin폴더 안에 board.cs와 board.dll을 카피하였다.
이게 kakaoPay.aspx에서 충돌하였다. 이에 00_임시저장소 폴더를 만들고 이 안에 board.dll을 옮기고 bin 폴더에 board.cs만 남겼다. 구 asp.net과는 다른 상황이다. 구 asp.net에서는 bin폴더에 board.dll을 사용하는 것으로 이해하고 있다.

kakaopay, 카카오페이 permission denied - 마지막 삽질에 대한 카카오페이의 대답
https://devtalk.kakao.com/t/cid-permission-denied/61462 안녕하세요. 테스트 CID(TC0ONETIME)로 테스트할때는 결제준비, 결제승인 모두 정상적으로 완료되었습니다. 제휴CID로 바꿔서 진행하니 결제준비에서부터 Sending ‘POST’ request to URL : https://kapi.kakao.com/v1/payment/ready 4 Response Code : 403 {“msg”:“permission denied”,“code”:-5} 와 같은 결과만 전달받고있습니다. 데브톡 검색해서 비슷한 글을 발견하고 답변에있던 kakaopay_partner@kakaocorp.com 메일로 문의도 해봤는데 돌아오는건 담당자 휴가중이라는 자동응답메일이었구요. 다시 전달 후에 피드백이 전혀 없는 상태입니다. 카카오페이 기술문의는 데브톡으로밖에 못하는건가요? yoonhunduc '18 11월 페이먼트 담당자분과 통화로 해결할 수 있을것같습니다. 해당 원인은 제휴계약시 카카오페이측에 전달했던 네이티브 앱키를 소유한 계정과 제가 전달받은 계정정보가 달라서 발생했다고하네요. 해결이되서 삭제하려했는데, 삭제는 안되나보군요… kakaopay_pg 카카오페이 '18 11월 안녕하세요. 카카오페이입니다. {“msg”:“permission denied”,“code”:-5} 메시지는 헤더에 KakaoAK 어드민키 셋팅하는 부분에 존재하지 않는 어드민키를 셋팅한 것 같습니다. 실제 CID가 아니고 테스트 CID의 경우 카카오계정에 존재하는 어드민키인지만 체크하지만 실제 CID는 발행요청 당시에 계정인지 체크합니다. 가맹점이신 경우 CID발급당시의 계정인지 한번더 체크해주세요. 세부문의는 발행요청한 정보와 함께 kakaopay_pg@kakaocorp.com 쪽으로 보내주세요. 내용 참고하여 진행 부탁드립니다. 감사합니다. 안녕하세요. 카카오페이 진평수입니다. 아임포트의 해당 내용은 안내문구인거 같네요. 발급된 CID : CAAFAU0TQI 는 아임포트를 통해 카카오페이에서 발급된 CID이며 정상 사용가능합니다. 아임포트를 통해 발급되었기 때문에 아임포트의 Admin_key 를 사용해주셔야하며, 관련 Admin_key는 아임포트에 문의를 해주셔야합니다. (저희가 임의로 전달이 어려운점 양해부탁드립니다.) 아임포트의 네이티브 앱키를 공유드리자면 "047d98fa2ae7f47e0045af19cc7137c8" 이며 해당 앱키로 아임포트에 Admin_key가 무엇인지 확인하시어 해당 Admin_key 로 결제를 올려주시기 바랍니다. 또한 아임포트의 해당 키정보에 탄쯔의 사이트 URL이 등록되어야 합니다. https://www.tanz.co.kr/ https://temp.tanz.co.kr/ 관련 URL도 등록요청해주셔야 합니다. 정리드리자면, 아임포트에 문의 내용은 1. CAAFAU0TQI 로 카카오페이 결제요청을 위한 admin_key 확인요청 2. 해당 admin_key 에 탄쯔의 사이트 url 등록 요청 ㄴ 결제요청시 approval_url, cancel_url, fail_url 에 대하여 admin_key 내에 등록된 사이트인지 검증하기 때문 감사합니다.

kginicis, payco, 사용 / 아임포트용 이니시스MID / KG이니시스를 통한 간편결제 신청함 결과는 3일내, 17일 전까지 확인 요망
KG이니시스 상점관리자페이지 ( https://iniweb.inicis.com/ ) 아임포트용 이니시스MID 로그인 > 우측 상단 [변경/추가] > 1.2.1 지불수단 추가 및 변경 - 6. 간편결제 에서 이용하실 간편결제서비스 체크 후 [신청하기] KG 이니시스에서 귀사의 발급 MID는 아래와 같습니다. 로그인한 상점 ID제외 NCE0060399 로 신청 그러자 팝업창이 뜬다. 고객님 서비스 신청이 정상적으로 완료되었습니다. 1.처리 결과 확인: 고객지원>서비스추가및 변경?6.서비스 신청현황 2.처리소요기간:업무처리는 일반적으로 3일 내외로 소요됩니다. 단, 원천사 제휴 및 심사 필요 업무는 신청 메뉴에 안내된 기일이 소요되니 이점 참고 바랍니다. 3.수수료 확인: 상점정보>계약정보>결제수단정보에서 확인 가능합니다 수수료는 처리완료 후 반드시 확인 바랍니다. 참 복잡하다. KG이니시스의 답변을 기다려야 한다. 아임포트를 사용하는 것도 가맹점 입장에서는 우선 기본 PG사 등록이 되어 있어야 하고, 아임포트 사용절차를 알아야 한다. 그것은 메타버스나 레스트에이피아이 처럼 쉽게 접근 가능한 개념이 아니다.

kginicis, 지불수단 추가 및 변경
오른쪽 상단 변경/추가 > 지불수단 추가 및 변경> 신용카드, 계좌이체, 가상계좌, 휴대폰 소액결제, 상품권, 간편결제, 신에스크로, 구에스크로, 신용카드 ARS, 휴대폰 선지급 등 열가지가 있다. 여기서 신용카드는 현제 사용중이고, 계좌이체와 가상계좌를 신청했다. 간편결제에 페이코를 신청했다. 토스와 카카오페이는 현재 직접 신청한 셈이다.

kakaoPay 플랫폼, redirect url에 상세 주소를 쓰면 동작이 되나?
https://www.tanz.co.kr/PaymentMethod/kakaoPay https://tanz.co.kr/PaymentMethod/kakaoPay https://temp.tanz.co.kr/PaymentMethod/kakaoPay 이것은 동작이 된다. 결제가 되었을 때 돌아오는 주소에 대한 부분에 대한 정리 필요

kakaopay, 카카오 가맹점 관리자 페이지 : https://pg.kakao.com

kakaoPay - 결제승인 Response , Money and Card each case
curl -v -X POST "https://kapi.kakao.com/v1/payment/approve" \ -H "Authorization: KakaoAK 1f6bfe629caf9acd15e5e5f68e9f34a9}' \ --data-urlencode "cid=TC0ONETIME" \ --data-urlencode "tid=T2954148969841403022" \ --data-urlencode "partner_order_id=10172021200648" \ --data-urlencode "partner_user_id=Member10172021200648" \ --data-urlencode "pg_token=ad91df2395852ec5f166" Response: 결제 수단 MONEY일 때 성공 HTTP/1.1 200 OK Content-type: application/json;charset=UTF-8 { "aid": "A5678901234567890123", "tid": "T1234567890123456789", "cid": "TC0ONETIME", "partner_order_id": "partner_order_id", "partner_user_id": "partner_user_id", "payment_method_type": "MONEY", "item_name": "초코파이", "quantity": 1, "amount": { "total": 2200, "tax_free": 0, "vat": 200, "point": 0, "discount": 0 }, "created_at": "2016-11-15T21:18:22", "approved_at": "2016-11-15T21:20:47" } Response: 결제 수단 CARD일 때 성공 HTTP/1.1 200 OK Content-type: application/json;charset=UTF-8 { "cid": "TC0ONETIME", "aid": "A5678901234567890123", "tid": "T1234567890123456789", "partner_user_id": "partner_user_id", "partner_order_id": "partner_order_id", "payment_method_type": "CARD", "item_name": "카페아메리카노", "quantity": 1, "amount": { "total": 3200, "tax_free": 0, "vat": 0, "discount": 0, "point": 0 }, "card_info": { "interest_free_install": "N", "bin": "621640", "card_type": "체크", "card_mid": "123456789", "approved_id": "12345678", "install_month": "00", "purchase_corp": "비씨카드", "purchase_corp_code": "01", "issuer_corp": "수협카드", "issuer_corp_code": "13", "kakaopay_purchase_corp": "비씨카드", "kakaopay_purchase_corp_code": "104", "kakaopay_issuer_corp": "수협은행", "kakaopay_issuer_corp_code": "212" }, "created_at": "2019-05-21T11:18:24", "approved_at": "2019-05-21T11:18:32" } Sample: 결제 수단 CARD 일 때 실패 HTTP/1.1 400 Bad Request Content-type: application/json;charset=UTF-8 { "code": -780, "msg": "approval failure!", "extras": { "method_result_code": "USER_LOCKED", "method_result_message": "진행중인 거래가 있습니다. 잠시 후 다시 시도해 주세요." } } 드뎌 받은 결제 승인, 브라보 be1cb31ef8bde16081b8 {"aid":"A2954153333528754342","tid":"T2954153217563785647","cid":"TC0ONETIME","partner_order_id":"10172021202317","partner_user_id":"Member10172021202317","payment_method_type":"MONEY","item_name":"__Foot Massager / ","quantity":1,"amount":{"total":31500,"tax_free":0,"vat":200,"point":0,"discount":0},"created_at":"2021-10-17T20:23:16","approved_at":"2021-10-17T20:23:42"} "partner_user_id":"Member10172021202317"

kakaoPay pg_token
카카오페이 결제요청이 고객을 통해 성공적으로 진행되면 결제요청에서 보낸 param중 approval_url로 돌아오는 값이다. 아래와 같이 온다 예 https://temp.tanz.co.kr/PaymentMethod/kakaoPay/kakaoPay_approval.aspx?pg_token=be1cb31ef8bde16081b8 pg_token=be1cb31ef8bde16081b8 이 바로 pg_token이다.

kakaoPay 결제승인 후 redirect 페이지는 어디로? kakaopay_approval.aspx로 지정한 상태 by kakaoPay.aspx.cs에 approval_url param에 지정되어 있음
approval_url=https://temp.tanz.co.kr/PaymentMethod/kakaoPay/kakaoPay_approval.aspx 로 지정하여 kakaoPay_approval.aspx로 간다. 실로 kakaoPay_approval.aspx에서는 여러가지 일이 일어난다. 결제 승인 parameter를 달아 결제 승인을 요청하면 {"aid":"A2954153333528754342","tid":"T2954153217563785647","cid":"TC0ONETIME","partner_order_id":"10172021202317","partner_user_id":"Member10172021202317","payment_method_type":"MONEY","item_name":"__Foot Massager / ","quantity":1,"amount":{"total":31500,"tax_free":0,"vat":200,"point":0,"discount":0},"created_at":"2021-10-17T20:23:16","approved_at":"2021-10-17T20:23:42"} 값이 kakaoPay로 부터 전달된다. 여기서 두 가지 redirect방향이 있을 수 있다. 1안. 메인페이지로 가게 한다. kakaoPay_approval.aspx 에 toss처럼 loader를 달아 메인페이지로 가게 하는 것이다. 2안. 구매내역 설명하고 클릭한 후 메인페이지로 갈 수 있게 한다. approval로 전달된 json data는 아래와 같다. 0_{"aid":"A2954794434707091433", 1_"tid":"T2954793129036458698", 2_"cid":"TC0ONETIME", 3_"partner_order_id":"10192021134629", 4_"partner_user_id":"Member10192021134629", 5_"payment_method_type":"MONEY", 6_"item_name":"__Foot Massager / ", 7_"quantity":1, 8_"amount":{"total":31500,"tax_free":0,"vat":200,"point":0,"discount":0},"created_at":"2021-10-19T13:46:27","approved_at":"2021-10-19T13:51:43"} 9_"partner_user_id":"Member10192021134629"

toss 결제 후 redirect page, 고객은 어느 페이지로 가나?
tossOrderComplete.aspx페이지로 간다. retUrl = tossOrderComplete.aspx 로 지정 (* 거기에 고객안내 정보를 적은 후에 고객이 redirect페이지를 지정할 수 있도록 하는게 더 좋은 방법이라 생각된다.) tossOrderComplete.aspx에 loader를 달아 toss결제가 완료되었습니다. 메인페이지로 이동합니다. 해서 메인페이지로 이동하도록 설정한 상태다.

kginicis, 결제연동 개발가이드 : https://manual.inicis.com/main/ PC(웹표준) 결제 –> https://manual.inicis.com/stdpay/ 모바일 결제 –> https://manual.inicis.com/mobile/ 취소/부분취소 –> https://manual.inicis.com/iniapi/
개발가이드 : https://manual.inicis.com/main/ PC(웹표준) 결제 –> https://manual.inicis.com/stdpay/ 모바일 결제 –> https://manual.inicis.com/mobile/ 취소/부분취소 –> https://manual.inicis.com/iniapi/ KG inicis 모바일의 결제 진행 현재 탄쯔홈페이지에선 mx_startweb.asp -> mx_rnext.asp -> thankyouForMobilePay.asp로 진행된다.

kakaoPay 실제결제 문제
결제방법:kakaoPay,tid:T2954476452326520914,partner_order_id:10182021171736,partner_user_id:Member10182021171736,고객요구사항:test var httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.Method = "POST"; httpRequest.Headers["Authorization"] = "KakaoAK 1f6bfe629caf9acd15e5e5f68e9f34a9"; httpRequest.ContentType = "application/x-www-form-urlencoded"; var data = ""; data = data + "cid=TC0ONETIME&"; data = data + "tid="+tid+"&"; data = data + "partner_order_id="+partnerOrderid+"&"; data = data + "partner_user_id="+partnerUserid+"&"; data = data + "pg_token="+pg_token+""; https://temp.tanz.co.kr/PaymentMethod/kakaoPay/kakaoPay_approval.aspx?pg_token=df7f1306671456b654fd curl -v -X POST "https://kapi.kakao.com/v1/payment/approve" \ -H "Authorization: KakaoAK 1f6bfe629caf9acd15e5e5f68e9f34a9' \ -d "cid=TC0ONETIME" \ -d "tid=T2954476452326520914" \ -d "partner_order_id=10182021171736" \ -d "partner_user_id=Member10182021171736" \ -d "pg_token=df7f1306671456b654fd" 어제 잘되던 실행결제에 문제가 생긴 이유는 toss는 tossOrderComplete.aspx와 kakaoPay쪽 kakaoPay_approval.aspx에 loader를 달아서 그렇다. 이것을 버리고 코드를 변경시키니 다음과 같이 결제가 진행되었다. temp쪽 {"aid":"A2954484578586491380","tid":"T2954484363837610532","cid":"TC0ONETIME","partner_order_id":"10182021174819","partner_user_id":"Member10182021174819","payment_method_type":"MONEY","item_name":"__Foot Massager / ","quantity":1,"amount":{"total":31500,"tax_free":0,"vat":200,"point":0,"discount":0},"created_at":"2021-10-18T17:48:17","approved_at":"2021-10-18T17:49:09"} "partner_user_id":"Member10182021174819" www쪽(카드결제가 실행된 상황을 보여준다) {"aid":"A2954485420216734608","tid":"T2954485347201754377","cid":"CT50533027","partner_order_id":"10182021175208","partner_user_id":"Member10182021175208","payment_method_type":"CARD","item_name":"__Foot Massager / ","quantity":1,"amount":{"total":31500,"tax_free":0,"vat":200,"point":0,"discount":0},"card_info":{"approved_id":"00362832","bin":"402857","card_mid":"134756102","card_type":"신용","install_month":"00","issuer_corp":"현대카드","issuer_corp_code":"08","purchase_corp":"현대카드","purchase_corp_code":"08","interest_free_install":"N","kakaopay_purchase_corp":"현대카드","kakaopay_purchase_corp_code":"706","kakaopay_issuer_corp":"현대카드","kakaopay_issuer_corp_code":"106"},"created_at":"2021-10-18T17:52:06","approved_at":"2021-10-18T17:52:30"} "partner_user_id":"Member10182021175208"

kginicis, 페이코, 계좌이체, 가상계좌 사용할 수 있음 - 개발 매뉴얼 https://manual.inicis.com
어떻게 붙일 것인가? https://manual.inicis.com pageStep40에 분기가 나온다. 참고하고 INIStdPayReturn.aspx가 결제 후 보이는 페이지다. 이 페이지를 카카오나 토스 컴플리트 보이듯이 수정하면 되겠다. 모바일 안되는거 되게 할 거.

kakaopay, [정보]kakaoPay Mobile과 PC 분기 direct 적용 : kakaoPay.aspx.cs
kakaoPay 사용자가 Mobile일 경우 카카오는 이를 감지해 모바일 redirect주소로 분기한다. 이를 kakaoPay.aspx.cs에 적용하였다. 적용 코드는 다음과 같다. /* * 모바일의 경우 분기가 필요하다. */ string u = Request.ServerVariables["HTTP_USER_AGENT"]; Regex b = new Regex(@"(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino", RegexOptions.IgnoreCase | RegexOptions.Multiline); Regex v = new Regex(@"1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-", RegexOptions.IgnoreCase | RegexOptions.Multiline); if ((b.IsMatch(u) || v.IsMatch(u.Substring(0, 4)))) //모바일이면 { Response.Redirect(redirectMobile_url); // 모바일의 경우 kakao에 결제 요청 } Response.Redirect(redirectPC_url); // 데즈크탑의 경우kakao에 결제 요청 한 가지 문제는 남는다. app 결제의 경우가 그것이다.

[공통] toss, kakaopay 새 홈페이지에 toss와 kakaoPay의 데이터 저장을 어떻게 적용할 것인가?
toss 의 경우: 저장할 데이터는 payToken이다. kakaoPay의 경우:저장할 데이터는 tid:T2955112781977525722, partner_order_id:10202021102654, partner_user_id:Member10202021102654 이 세가지다.

kginicis, [질문] ts@kggroup.co.kr로 문의할 것. KG이니시스의 signkey는 어디서? - 세 개의 key가 있다. MID외에
가맹점관리자페이지를 통해 MID 와 매칭되는 signkey 를 확인합니다. 가맹점관리자페이지 https://iniweb.inicis.com/ 에서 상점정보 > 계약정보 > 부가정보 > 웹결제signkey 생성조회 결제요청페이지(INIStdPayRequest.xxx) 내 세팅한 MID 와 상점관리자페이지에서 확인한 signkey 가 정확히 세팅되어야 합니다. KG 이니시스는 MID외 알아야 할 key가 세 가지 있다. 1.웹결제 signkey ZTNDcStvMXZrOWhHaTdqZldsL1JyZz09 2.모바일금액위변조 hashykey 3.INAPI key 이렇게 세 가지다.

kginicis, 모바일 결제의 경우 euc-kr만 지원한다는 뜻
[이메일 질문 to ]: ts@kggroup.co.kr 날짜: 2021. 10. 21. 오후 10:39 제목: 모바일 결제 연동에 사용하는 euc-kr 발송 도메인:: tanz.co.kr KG이니시스 사용 가맹점 결제 연동중인 주식회사 탄쯔 이병일입니다. 연동 개발가이드에 따르면 모바일 연동은 euc-kr을 사용한다고 되어 있습니다. 꽤 오래 전 부터 KG이니시스를 사용하다가 홈페이지를 업그레이드하게 돼 살펴보고 있는 중입니다. 앞으로도 KG 이니시스 모바일 연동은 euc-kr을 사용하는 현재의 연동 정책이 지속될건지, 아니면 향후 변경 계획이 있는지 궁금합니다. [이니시스답변] 인코딩 관련된 사항은 VAN사 , 원천사(카드사, 금결원 등) 등에서도 동일 인코딩을 사용하고 있으므로 현재 정책이 유지될 예정입니다. 모바일의 경우 결제요청은 EUC-KR 로 진행되어야 하지만, 인증결과, 승인결과는 UTF-8 로도 전달 가능한 옵션이 존재하오니 참고 부탁드립니다. 참고 : https://manual.inicis.com/mobile/#pay > 선택파라미터 탭 시스템 생성 대체 텍스트: P CHARSET 결과 수신 인크 딩 (utf8,euc-krl 0하Su는 euc-kr P_CHARSET.value = "utf8" - 옵션 적용시 P_NEXT_URL로 인증/승인결과 utf-8로 전송됩니다.

kginicis, 가상계좌와 계좌이체 탄쯔홈페이지에 추가하기
신용카드 Card 실시간계좌이체 DirectBank 가상계좌(무통장입금) VBank 현재 KG이니시스는 신용카드만 사용중임 이것을 실시간계좌이체와 가상계좌 추가할 것. [질문] 신용카드, 실시간계좌이체, 가상계좌 중에서 선택했을 때 팝업창에 해당 결제 방법이 활성화되는게 가능한가? 가능하다. 요청지불수단 gopaymethod 파라미터에 Card, DirectBank, VBank중에 선택하면 된다. 그렇다면 Payco는? [질문] 웹표준 결제 중 취소했을 때 가는 페이지 지정방법은? temp에서 바꾼 파일 pageStep30.aspx pageStep30.aspx.cs pageStep40.aspx INIStdPayrequest.aspx INIStdPayrequest.aspx.cs 이 다섯가지로 기억된다.

kginicis, cn.tanz.co.kr에 paymethod적용
1.paymethod위치 tanz의 경우 pageStep30.aspx -> pageStep40.aspx -> 분기 결제 호출 -> 지정리턴페이지로

[공통]kakaopay, toss [질문] 데이터베이스 어느 부분에, cn.tanz.co.kr의, 결제방법과관련된 키밸류(tid외)를 넣을 것인가?
Order table 에 아래 세 개의 컬럼이 있다. OrderId OrderDate ShippingDetailsId 여기에 결제방법과 결제 키밸류를 넣으면 되겠다. PaymentMethod 테이블의 PaymentMethodId를 FK로 그리고 keyValue 컬럼을 추가한다. name, keyValue는 어떤가? 구 탄쯔 홈페이지에 저장했던 내용 결제방법:kakaoPay,tid:T2956414028035321591,partner_order_id:10232021223622,partner_user_id:Member10232021223622, 결제방법:toss,payToken:zoNDuwNwl4DHwwNGJ4BA1d,orderNo:10232021223615, 을 저장하면 된다. Order table에 keyValue와 PaymentMethodId(FK)로 컬럼 두 개를 추가하였다. keyValue는 NVARCHAR(100) 이다. 위 결제 방법을 그대로 저장할 수 있는 크기다.

kginicis, [질문] KG이니시스 모바일과 PC에서 각각 신용카드, 실시간계좌이체, 가상계좌이체를 이용할 때 코딩
모바일과 PC는 분기가 다르고 Value도 다르다. 모바일은 CARD, BANK, VBANK 이고 PC는 Card, DirectBank, VBank이며 폴더와 파일도 다르다. 이것은 [질문]to ts@kggroup.co.kr 안녕하세요. 모바일에서 가상계좌와 계좌이체를 사용하면 아래와 같은 에러가 뜹니다. IMG_B6DFE0D22D6C-1.jpeg 모바일에서 가상계좌와 실시간 계좌 이체를 사용할 수 있는 방법이 있습니까? [답변] 안녕하세요 이니시스 기술지원입니다. 해당의 경우, 모바일 기기에서 PC웹표준 모듈을 호출한 경우 발생되는 경우입니다. 당사 모듈은 PC모듈과 모바일 모듈이 구분되어 있습니다. 따라서, 모바일 기기에서 결제 진행하기 위해서는 별도로 모바일 모듈을 연동해주셔야 합니다. 하기 웹메뉴얼 참고하여 모바일 모듈로 연동 부탁드립니다. 웹메뉴얼 : https://manual.inicis.com/mobile/ 추가 문의사항 회신 주시면 확인 도와드리겠습니다. 감사합니다. [해설]pageStep40.aspx.cs의 분기에 모바일과 PC를 분기하여 KG이니시스 결제하여야 하는데 오류가 있었다. 오류는 모바일과 pc를 분기함으러써 해결됐다.

payco, 직접연동시, KG이니시스를 거치지 않고, https://www.nhn-commerce.com/echost/power/add/payment/payco-intro.gd
PAYCO에 애플리케이션 barreinabag 만듬 https://www.tanz.co.kr 페이코결제와 로그인 모두 연동 애플리케이션 관리자는 peter@barreinabag.com이다 페이코(PAYCO) 결제 서비스는 별도의 PG없이 쇼핑몰에 연동하여 편리하게 사용 가능하며, PG 형태의 ‘간편결제’와 체크아웃 형태의 ‘바로구매’가 있습니다. NHN COMMERCE 회원가입 페이코계정으로 인증. 내전화번호와 Aa1~!

payco 다이레트 호출 [팁] PAYCO 다이렉트 결제 호출하기, 모바일과 데스크탑에
pc에 payco direct호출 옵션은 어디? manual.inicis.com/stdpay -> STEP1.결제요청 옆 결제창 옵션을 클릭한 후 PAYCO를 누르면 간편결제 다이렉트 호출 옵션이 보인다. mobile은 P_RESERVED 파라미터에 P_payco=Y를 추가한다. 이것은 실제 해보지 않으면 결코 알 수 없다. 대부분의 결제 시스템이 그렇다. 간편결제 PC 다이렉트 호출 옵션 * KPAY : gopaymethod = kpay * PAYCO : gopaymethod = onlypayco , acceptmethod = cardonly * 삼성페이 : gopaymethod = onlyssp , acceptmethod = cardonly * LPAY : gopaymethod = onlylpay , acceptmethod = cardonly * SSG페이 : gopaymethod = onlyssgcard , acceptmethod = cardonly * 카카오페이 : gopaymethod = onlykakaopay , acceptmethod = cardonly * 토스 : gopaymethod = onlytosspay , acceptmethod = cardonly * 네이버페이 : gopaymethod = onlynaverpay , acceptmethod = cardonly * CHAI pay : gopaymethod = onlychaipay , acceptmethod = cardonly * 간편결제 다이렉트 호출 시 '신용카드 전용화면' 계약이 되어있어야 합니다. * 당사 테스트 MID로 부분취소 진행 시 정책상 사유로 부분취소 진행 되지 않습니다. 실 MID로 테스트 부타드립니다. 간편결제 모바일 다이렉트 호출 옵션 간편결제 다이렉트 옵션× 1. 간편결제는 계약 시 통합범용창에 자동 노출됩니다. * KPAY: P_RESERVED = d_kpay=Y * PAYCO: P_RESERVED = d_payco=Y * 삼성페이: P_RESERVED = d_samsungpay=Y * LPAY: P_RESERVED = d_lpay=Y * SSG페이: P_RESERVED = d_ssgpay=Y * 카카오페이: P_RESERVED = d_kakaopay=Y * 토스: P_RESERVED = d_tosspay=Y * 네이버페이: P_RESERVED = d_npay=Y * CHAI pay: P_RESERVED = d_chaipay=Y

kginicis [정보] [결제완료페이지로 가기 위한 리턴값 설정 문제] - KG이니시스 신용카드 : 모바일과 PC : 결제 후 리턴값
아래 MID 와 signkey는 개발을 위해 사용하라는 키로 manual.inicis.com에 있다. INIpayTest SU5JTElURV9UUklQTEVERVNfS0VZU1RS PC 결제의 경우 ->INIStdPayRequest.aspx.cs MID와 signkey다 MID는 INIStdPayRequest.aspx.cs에 저장한다. signkey는 어디? 맨 아래 부분에 있다. string signkery 라고 있다. 모바일 결제의 경우->mx_startweb.asp에 P_MID가 hidden값으로 있다. signkey는 사용하지 않는 것으로 보인다. [질문] 가맹점 측에서 판매와 관련된 가맹점키 값(id, int변수)을 KG inicis 모바일과 피씨에서 결제창이 완료된 후 리턴 창에 까지 전달되게 하는 방법이 있을까요? 그 키 값으로 고객에게 가맹점 측 결제정보를 제공하려합니다. (현재 피씨는 KGinicis로부터 제공받은 aspx로 개발되어 있고 모바일은 asp로 개발이 정리되어 있습니다.) 답변 안녕하세요 이니시스 기술지원입니다. 문의주신 내용 확인 시, 가맹점 측의 가맹점 필드 값을 (결제창 종료 후)리턴 페이지로 전달 받을 수 있는지에 대해 문의로 확인됩니다. 하기 요청 파라미터를 통해 가능합니다. - 웹표준 : merchantData={가맹점 임의 데이터} - 모바일 : P_NOTI={가맹점 임의 데이터} 위 요청파라미터에 대한 value 값은 결제창 종료 후 웹표준:returnUrl , 모바일:P_NEXT_URL로 인증결과 전달 시, 함께 전달됩니다. 상세 확인은 웹메뉴얼에서 확인 가능하오니, 참고 부탁드리며, 한글 데이터의 경우는 urlencode하여 전달 부탁드립니다. <웹메뉴얼 참고> 웹표준 : https://manual.inicis.com/stdpay/#pay -> 결제요청 상세파라미터 규격 확인 -> 선택파라미터 (merchantData) 모바일 : https://manual.inicis.com/mobile/#pay -> 결제요청 상세파라미터 규격 확인 -> 선택파라미터 (P_NOTI) 질문 답변을 토대로 진행해보았습니다.  INIStdPayRequest.aspx?merchantData=123 식으로 보내면 returnurl로 지정한 INIStdPayReturn.aspx에 INIStdPayReturn.aspx?merchantData=123 하는 식으로 값이 리턴되는건가요? 이 리턴값을 INIStdPayReturn.aspx.cs 에서 Request.Querystring["merchantData"]  과 parameters.Get("merchantData")  두 가지 방법으로 merchantData를 리턴 받으려 했으나 값을 받지 못하고 있습니다.  어떻게 해야 리턴값을 받을 수 있을까요? 답변 안녕하세요 이니시스 기술지원입니다 문의주신 부분은 웹표준 샘플 내 포함되어 있는 코드이며, merhantData 필드는 인증결과 내 포함되어 있는 점 참고 부탁드립니다. 질문 포함되어 있는 merchantData값이 가맹점이 보낸 값이 맞는가? 그럼 merchantData값은 어떻게 사용할 수 있나. 변수 처리가 쉽지 않은 상황. 감사합니다. 문제의 발견 Request->Return Request측에 sid를 설정할 때 merchantData와 shippingDetailsId 두 가지로 변수를 지정하는 오류를 범했다. Request.aspx로 돌아온 값 parameters.Get("merchantData")는 아무런 문제가 없이 돌아왔다. 애초에 가지 않은 것이다. Request 상에서 두 가지 변수로 변수 지정을 잘못하여 값이 아예 전달되지 않았던 것이 문제였다. 크~

kginicis, 결제창이 바로 진행되게 하기 / body onload=함수
body onload= 를 사용하면 된다. onload에 함수를 넣는다.

kginicis, PC웹표준결제창 로고 삽입
1. PC웹표준 결제창 내 로고 삽입이 가능합니다. 아래 파라미터에 이미지 도메인주소를 세팅해주시기 바랍니다. logo_url - 메인로고 삽입 [size: 89*18] logo_2nd - 서브로고 삽입 [size: 64*13]

kakaopay, cn.tanz.co.kr 연동시 kakaopay.aspx.cs 400 오류 발생 - 이틀 동안 원인을 발견하지 못해 파일 첨부해서 문의까지 했던.
asp.net WebForm 으로 만든 www.tanz.co.kr에 kakaopay 단건결제를 연동하여 사용중입니다. https://www.tanz.co.kr/PaymentMethod/kakaoPay/ 에 kakaoPay.aspx와 kakaoPay_approval.aspx, kakaoPay_fail.aspx, kakaoPay_cancel.aspx 등이 있습니다. https://www.tanz.co.kr로 접속해 보시면 kakaopay 단건결제가 잘 되는 것을 확인하실 수 있을 겁니다. 현재 사용중인 www.tanz.co.kr의 kakaopay 단건 결제 파일을 카피해 닷넷MVC방식으로 작업중인 https://cn.tanz.co.kr에 kakaopay 단건결제를 연동하려 하려 합니다. WebForm이나 MVC나 다 aspx파일을 사용할 수 있으므로 www.tanz.co.kr의 kakaoPay.aspx와 kakaoPay_approval.aspx, kakaoPay_fail.aspx, kakaoPay_cancel.aspx 을 이용해 cn.tanz.co.kr에 적용중입니다. cn.tanz.co.kr은 VS2017로 작업중인데 MVC 인 만큼 콘트롤러와 뷰 폴더등이 자동으로 생기고 라우팅이 WebForm과는 차이가 있습니다. 하지만 aspx파일을 사용할 수 있기 때문에 코드 내 주소외에는 별달리 바꾸어 작업해야 할 일이 없다고 생각해 편하게 생각하고 연동작업을 했는데 이틀 째 원격 서버에서 (400) 잘못된 요청 오류를 반환했습니다. 오류가 뜹니다 우선은 제 쪽에서 보내는 자료의 문제이므로 꼼꼼하게 살펴봤지만 문제를 찾지 못하고 있는 상황입니다. 문제의 주소는 아래와 같습니다. https://www.tanz.co.kr/PaymentMethod/kakaoPay/kakaoPay.aspx? 와 https://cn.tanz.co.kr/PG/kakaoPay/kakaoPay.aspx?로 각각 연동이 시작됩니다. 둘 다 파일명도 같고 aspx WebForm을 사용하므로 문제가 없을 거 같고 이틀째 살펴보았지만 코드에는 이상이 없는 거 같습니다. 두 개의 파일(되는 www.tanz.co.kr쪽과 , 오류가나는 cn.tanz.co.kr쪽 파일)을 첨부합니다. 보시고 문제를 확인하실 수 있을까요? 부탁드립니다.

kginicis, 모바일 연동 리턴 값. 결제 후 탄쯔 쪽에 고객이 볼 수 있는 결제 창 볼 수 있는 shippingdetailid건네고 받기 P_OID로
Mobile은 P_NOTI라고 했으나 P_OID로 처리해야만 했다. KGinicis Mobile관련 페이지는 네 개가 있는데 그 중 두 개만 세팅하면 되는 것으로 우선은 이해된다. 모바일은 classic asp를 사용중이다.

kakaopay, 400오류 cn.tanz.co.kr에 연동하면서 kakaopay_approval.aspx로 받았던 400 오류의 원인
cid=TC0ONETIME&tid=T2963266841812956262&partner_order_id=1030&partner_user_id=Member11-11-2021094846&pg_token=d5772c08ba86f7e25506 결제 완료 이것을 보고선 이유를 추측할 수 없다. kakaopay.aspx.cs로 가면 partner_order_id를 shippingdetailsid 를 받아서 ShippingDetails 테이블 pgtoken에 저장하고 이를 찾아쓰는 식인데 애초에 저장은 ordernoforkakaopay라고 하는 변수로 날짜를 이용하여 저장하고 보내는 것으로 REST API data에 지정이 되어 있는 상황이었다. 그런데 막상 ShippingDetails테이블 pgtoken에는 shipiingdetailsid를 저장하도록 되어 있었다. 그러니 이 두 개의 데이터가 kakaopay에는 ordernoforkakaopay로 들어갔는데 kakaopay.aspx.cs restapi data로 그런데 인증을 하는 kakaopay_approval.aspx.cs에서는 테이블에 저장된 것을 불러오면서 shippingdetailid를 가져와 data 로 인증을 받으려 하니 400오류가 발생한 것이다. 길게 써서 미안하다. 애초의 변수 partner_order_id에 카카오에는 value ordernoforkakaopay를 보내고 가맹점 탄쯔 테이블에 저장은 value shippingdetailid를 하였다. 동일한 value를 가져야 할 partner_order_id가 두 개가 된 것이다. 카카오 partner_order_id를 kakaopay_approval.aspx.cs페이지에서 인증할 때 가맹점 탄쯔 테이블에 저장된 밸류 shippingdetailid를 partner_order_id로 인증하려고 하니 카카오 partner_order_id의 경우 저장된 밸류 ordernoforkakaopay 와 가맹점 측 partner_order_id 밸류 shippingdetailid 가 일치하지 않으므로 400 에러를 보낸 것이다.

kginicis Mobile 결제 취소 시 가는 창이 잘못됐다. 마치 결제가 된 것으로 착각하고 완료페이지로 간다.
www.tanz.co.kr mx_rnext.asp, mx_rnoti.asp 마지막줄 코드에 의함 https://www.tanz.co.kr/KGinicisMobile/kgMobileCompleted.aspx?P_AMT=&P_UNAME= ' ///////////////////////////////////////////////////////////////////////////// ' ///// 이병일 추가 20170917 //// ' ///// mx_rnext.asp페이지가 모바일 결제 후에 보이므로 //// ' ///// 아래 reponse.redirect("http://www.tanz.co.kr/모바일결제감사임시페이지")로 보내는 것으로 한다. ' ///////////////////////////////////////////////////////////////////////////// response.Redirect("https://www.tanz.co.kr/KGinicisMobile/kgMobileCompleted.aspx?P_AMT="+P_AMT+"&P_UNAME="+P_UNAME+"") cn.tanz.co.kr mx_rnext.asp, mx_rnoti.asp 마지막 줄 코드에 의함 ' ///////////////////////////////////////////////////////////////////////////// ' ///// 이병일 추가 2021 11 10 //// ' ///// P_OID는 shippingdetailsid값이다. KG쪽에서는 P_NOTI를 알려줬으나 ' ///////////////////////////////////////////////////////////////////////////// response.Redirect("https://cn.tanz.co.kr/PGselect/Complete/"&P_OID) https://cn.tanz.co.kr/PGselect/Complete/ 위를 단서로 할 때 1. mx_startweb.asp -> mx_rnext.asp 2. mx_startweb.asp -> mx_rnoti.asp 인지 추정이 가능 답은 1로 가는 것으로 확인됐다. 그러면 결제 취소시 mx_rnext.asp가 이를 인지하고 결제가 취소됐다는 식의 안내를 할 수 있는 페이지로 이동하도록 유도가 필요하다.

npay, 연동 기초 정보 Custom Version, Simple Version
결제창 호출 Simple version, Custom version https://developer.pay.naver.com/docs/v2/api#payments-payments_flow 결제 승인 URL POST https://{API 도메인}/{파트너 ID}/naverpay/payments/v2.2/apply/payment Content-Type : application/x-www-form-urlencoded 요청 코드 예 curl -X POST https://dev.apis.naver.com/naverpay-partner/naverpay/payments/v2.2/apply/payment \ -H X-Naver-Client-Id:{발급된 client id} \ np_vpzay535096 -H X-Naver-Client-Secret:{발급된 client secret} \ Aa~2! -d paymentId={네이버페이가 발급한 결제 번호} \ ClientId ClientSecret merchantUserKey : 가맹점 사용자 식별키 merchantPayKey 안녕하세요, 네이버 페이입니다. 신속한 확인 감사드립니다. 독립몰로 자체 사이트 구축으로 진행확인하여 이 후 절차 안내드립니다. 입점검토진행을 위해 아래 추가 정보 회신요청을 드립니다. 1. 통신판매중개사업자 재확인 신청양식 내 통신판매중개업으로 체크해주신바 정확한 확인을 위해 문의드립니다. 하위 판매자(혹은 개인)가 입점하여 운영되는 통신판매중개업에 해당하는 사이트인지 확인을 부탁드립니다. 2. 통합형(주문형+결제형) 운영문의 주문형 서비스 가입을 하신 이력이 확인되오나 이용정지 상태로 확인됩니다. 따라서 주문형 서비스는 이용의사가 없으며, 금번 결제형 입점 후 운영예정이 맞는지 문의드립니다. *입점정보(탄쯔) 독립몰 자체사이트구축, 실물상품연동(발레바), 일반결제 월 평균 거래액 460만원, 서비스 제공기간 4일 위 정보를 바탕으로 입점조건 확인시 보증보험 가입이 진행되어야 입점이 가능합니다. 보증보험금액의 경우 월정산한도에 따라 상이하며, 보통 결제형 입점시 월정산한도는 월평균매출액의 약 10%수준으로 설정합니다. 따라서 희망하시는 월정산한도 금액에 대해 회신해주시면 이에 따른 보증보험 내용으로 안내드리겠습니다. 감사합니다. 답변회신입니다. 통신판매중개사업자 아닙니다. 그냥 일반 통신판매업자로 독립몰 운영중입니다. 주문형 서비스는 운영의사 없습니다. 결제형 입점 후 운영예정입니다. 결제형 입점 후 월정산한도 금액은 오백만원(5,000,000)입니다. 현재 문의 상태임

네이버페이 일대일문의중 - 결제형 가입 회신 옴
해당 업체는 결제형 입점제휴협의 단계에 있는곳으로 확인됩니다. 네이버 페이 결제형 입점절차에 경우 이전 진행하신 담당자와 ​조건협의 후 입점권한을 드리는 절차에서 최근 업체가 직접 ​온라인 가입신청 후 바로 심사가 진행되는것으로 변경이 되었습니다. 단, 판매자님은 이전 제휴담당자를 통해 조건에 대해 협의 된 부분이 있기때문에 그간 협의 된 정보에 대해 아래 기재드리며, 온라인 가입신청 후 하단 입점정보 참고하시어 작성하시어 신청을 해주시면 됩니다. - 온라인 가입신청 : https://admin.pay.naver.com/join/step1/select *입점정보(탄쯔) 독립몰(홈페이지) 자체사이트구축, 실물상품연동(발레바), 일반결제 월 평균 거래액 460만원, 서비스 제공기간 4일 정산기준 결제일, 정산주기 결제일+7영업일, 포인트 결제일+15일 적립 월정산한도 500만원, 보증보험증권 가액 500만원 통신판매중개업 대상아님 ※단, 월 평균 거래액은 이전 기준 460만원으로 최근 기준 거래액으로 신청을 바랍니다. 아울러, 주문형으로 입점 계획이 없으신 경우 주문형으로 입점 신청하신 계정은 아래의 필요정보를 기재하여 탈퇴 요청하여 주시기 바랍니다. ■ 탈퇴요청 시 필요정보 - 페이센터ID : - 가맹점명 : - 담당자명 : - 요청사유 : 네이버페이를 이용해 주셔서 대단히 감사합니다.

KG inicis 해외카드결제 연동과 관련된 문의와 답변
1.해외결제 가능하도록 신청한다. 2. 신청이 완료되었다. 3. 관련해서 연동하는데 생긴 문제 문의하고 답변을 받았다. 탄쯔 탄쯔홈페이지 해외 사이트를 만드는 중에 있습니다. 결제연동은 해외카드 결제를 가능하도록 요청하여 완료되었습니다. 현재 탄쯔 한국 사이트는 https://www.tanz.co.kr입니다만 영어권 사이트는 https://www.barreinabag.com 입니다. 궁금한 것은 https://www.barreinabag.com의 결제연동에 관한 것입니다. https://www.tanz.co.kr에서 이니시스 결제 연동한 코드에서 연결 URL을 https://www.barreinabag.com으로만 바꾸어주면 연동이 가능한지요? 아시는대로 현재 이니시스와의 계약은 https://www.tanz.co.kr로 되어 있습니다. 답변 부탁드립니다. 이니시스 안녕하세요 이니시스 기술지원입니다. 현재 이니시스 결제 처리가 가능한 서버(결제 모듈이 구성된)는 동일하고, 도메인만 추가 하는 방식이라면 모듈 구성은 그대로 사용하시고, 결제요청도메인과 returnUrl, closeUrl 도메인만 일치시켜주시면 됩니다. (요청도메인과 returnUrl, closeUrl 도메인이 상이할 경우 오류가 발생됩니다.) 혹, 처리되는 서버 및 구성 정보 변경이 필요할 경우, 아래 사항에 대해 체크가 필요합니다. - 가맹점측 서버 OUTBOUND 설정 : https://manual.inicis.com/stdpay/std-info.php#firewall - MID 를 새로 발급받아 사용할 경우, MID 에 매칭되는 signKey 변경 등 추가 궁금하신 사항이 있으실 경우 회신주시면 가이드 드리겠습니다. 탄쯔 빠른 답변에 감사드립니다. 계속 오류가 나서 원인을 찾아보았습니다. 다음과 같은 의심이 들어 질문드립니다. https://www.barreinabag.com의 경우 화폐단위가 미화 달라를 기준으로 합니다. 혹시 결제 단위가 달라로 바뀌었을 경우 원화와 달리 소수점 이하의 달라화 단위로 결제를 요청할 경우 오류가 발생할 수 있을까요?. 이니시스 안녕하세요 이니시스 기술지원입니다. 달러 단위로 결제 요청을 하실 경우, 아래 사항을 체크 부탁드립니다. 1. 통화구분 ["WON":한화,"USD":달러] 설정 예) 괄호열고 input name="currency" value="USD" 괄호닫기 2. 금액 설정 [소수점 없이 100단위로 설정, 1달러 = 100] 예) price = 225 --> 2.25 달러 위 사항에도 특이점이 없으실 경우라면, 발생되는 오류 내용과 해당 오류가 발생되는 결제요청정보를 추가 전달 부탁드립니다. 탄쯔 위 답변 2.금액설정 에 따르면 price를 2.25라고 적는게 아니라 225라고 소숫점을 뺀 체 연동값으로 보내야 한다는 설명이신가요? 해외판매용 홈페이지에서는 달라의 단위인 2.25로 상품값이 기재되어 있고 이 값을 바로 연동하는 구조이거든요. 설명대로라면 2.25달라 상품의 경우 225로 이니시스 연동값을 보낼 수 있는 구조로 변경해야 한다는 것으로 이해됩니다만 그게 맞습니까? 탄쯔 위의 내용을 테스트 한 결과(CartController에서) 지금 2.금액설정과 같은 방식으로 하니 되네요. 잘 해결되었습니다. 금일 해외 결제와 관련하여 데스크탑의 경우 aspx와 aspx.cs코드에 답변 주신 내용 아래 1과 2 -- 1. 통화구분 ["WON":한화,"USD":달러] 설정 예) 괄호열고 input name="currency" value="USD" 괄호닫기 2. 금액 설정 [소수점 없이 100단위로 설정, 1달러 = 100] 예) price = 225 --> 2.25 달러 -- 를 적용하여 결제가 정상적으로 달라화 결제가 되는 것을 확인하였습니다. 첫 질문, 추가로 모바일의 경우 asp코드에서 이상과 같은 내용을 적용할 길이 없어서 질문드립니다. 모바일 결제에서 asp를 사용하는 경우 어떻게 적용 해야 하나요? 둘 째 질문, 해외 사용자들이 자국에서 결제하려고 할 때 이니시스의 해외 카드 이용에 관한 특약에 따르면 VISA, MASTER JCB 세 가지가 특약으로 이용하게 되어 있습니다. 해외 사용자들이 사용하고자 할 때 세 개의 카드를 각각 클릭하게 해야 하는지요? 아니면 신용카드를 클릭한 후 해외 사용자가 이 세 개의 카드를 보고 선택하게 되는건지 궁금합니다. 답변 안녕하세요 이니시스 기술지원입니다. 문의주신 내용 아래 답변드립니다. 첫 질문, 추가로 모바일의 경우 asp코드에서 이상과 같은 내용을 적용할 길이 없어서 질문드립니다. 모바일 결제에서 asp를 사용하는 경우 어떻게 적용 해야 하나요? >> 모바일 모듈에서는 정책상 원화 결제만 가능한 점 참고 부탁드립니다. 둘 째 질문, 해외 사용자들이 자국에서 결제하려고 할 때 이니시스의 해외 카드 이용에 관한 특약에 따르면 VISA, MASTER JCB 세 가지가 특약으로 이용하게 되어 있습니다. 해외 사용자들이 사용하고자 할 때 세 개의 카드를 각각 클릭하게 해야 하는지요? 아니면 신용카드를 클릭한 후 해외 사용자가 이 세 개의 카드를 보고 선택하게 되는건지 궁금합니다. >> 결제창 내 신용카드로 진행하여 해외카드사를 각각 선택하도록 구성되어 있습니다. 특약(카드발급사 개인카드 인증등록) 관련된 부분은 이용자분이 별도로 진행해 주셔야 합니다. 감사합니다.