결제 시스템

박태욱·2022년 1월 24일

결제

결제는 결제대행사의 개발센터에 가면 api를 가져올 수 있다. 네이버페이 개발자센터, 카카오페이 개발자센터등등 대행사 마다 방법을 달리하여 설정하면된다.

나이스페이먼츠라는 대행사를 사용하며 아임포트 결제 중계사를 사용한다. 나이스페이, 카카오페이, 네이버페이, 토스등 결제사에 하나하나 계약을 한 후 결제 중계사를 통해 결제를 한번에 연동하는 역할을 진행한다. 개발 과정을 최소화 하고 관리자를 위한 효율적인 운영을 할 수 있다.

아임포트 일반결제
client-side 주문 페이지에 아임포트 라이브러리를 추가한다.

<script type="text/javascript" src="https://cdn.iamport.kr/js/iamport.payment-1.1.8.js"></script>

결제 준비

var IMP = window.IMP;
IMP.init("imp54996960");

함수룰 선언하고 imp 객체를 초기화 한다.

결제 요청

let IamportObject = {
			    pg : pg,
			    pay_method : pay_method,22
			    escrow: boolean_escrow,
				merchant_uid: 'vidamerchant_' + new Date().getTime(),
			    name: itemname,
				amount: amount,
				buyer_email: buyer_email,
				buyer_name: buyer_name,
				buyer_tel: buyer_hp,
				buyer_addr: delivery_address1 + " " + delivery_address2,
				buyer_postcode: delivery_post,
				custom_data:IMPPayData,
				                       m_redirect_url:'https://m.market.vidacoffee.co.kr/android/code/main/pay/pay_result.html?usercode=' + usercode + "&access_token=" + access_token,//모바일 앱 에선 필수
				app_scheme: 'vidamarketiamportnice',
				naverMobileV2:true// 모바일앱에선 필수
			};

필요한 결제 정보로 IMP.request pay를 호출하여 결제 요청을 하던 pg사의 결제 페이지가 열린다.

결제 정보 전달
IMP.request_pay(IamportObject, function(rsp) {
if(rsp.success) {
console.log("결제 성공");
let imp_uid = rsp.imp_uid;
let merchant_uid = rsp.merchant_uid;

			}else {
				console.log("결제 실패");
				alert(rsp.error_msg);
			}

결제가 완료되면 응답 객체(rsp)의 결제 여부에 따라 결과 출력

webhook
아임포트 서버에 저장된 결제 정보를 가맹점 서버에 동기화하고 네트워크 불안정성을 보완하는 방법
정보를 바로 받아올 경우 소스코드에 문제가 생기면 결제가 오류가 발생할 수 있다.
그렇기 때문에 웹훅을 사용하여 아임포트에서 정보를 받아와 시스템을 호출한다.’

결제가 승인되었을 때

else if (status === 'paid' || status === 'cancelled') {
                            let url = 'https://marketapi.vidacoffee.co.kr:10619/api/etc/webhook/sellerpay/';
                            let options2 = {
                                headers: {'Content-Type': 'application/json'},
                                url: url,
                                body: JSON.stringify({
                                    "sellercode": sellercode,
                                    "paydata": JSON.stringify(paydata),
                                    "point": point,
                                    "amount": amount,
                                    "apply_num": apply_num,
                                    "bank_code": bank_code,
                                    "bank_name": bank_name,
                                    "buyer_addr": buyer_addr,
                                    "buyer_email": buyer_email,
                                    "buyer_name": buyer_name,
                                    "buyer_postcode": buyer_postcode,
                                    "buyer_tel": buyer_tel,
                                    "card_name": card_name,
                                    "card_quota": card_quota,
                                    "currency": currency,
                                    "custom_data": imp_custom_data,
                                    "imp_uid": imp_uid,
                                    "merchant_uid": merchant_uid,
                                    "name": name,
                                    "paid_amount": paid_amount,
                                    "paid_at": paid_at,
                                    "pay_method": pay_method,
                                    "pg_provider": pg_provider,
                                    "pg_tid": pg_tid,
                                    "pg_type": pg_type,
                                    "receipt_url": receipt_url,
                                    "status": status
                                })

결제 승인시 paid 관리자 콘솔에서 환불 cancelled
유저들의 데이터를 가져오고 에러 발생시 주문 입력 에러가 뜨게한다.

profile
개발 노트

0개의 댓글