[npay/네이버페이] 쇼핑몰 네이버페이 연동. 프로그래밍
2018.03.09 14:21 Edit
준비물
1. 네이버페이 신청
2. 신청후 승인후 인증키받기
3. 메뉴얼 보기.
가맹점 ID : gu
가맹점 인증키 : FFFFFFFF
버튼 인증키 : AAAAAA
네이버공통인증키 : BBBBBBB
1 - 네이버페이 submit form 붙이기
<form name='npayform' method='get'> <input type='hidden' name='ORDER_ID'> <input type='hidden' name='SHOP_ID'> <input type='hidden' name='TOTAL_PRICE'> </form> <form name='npaywishform' method='get'> <input type="hidden" name="SHOP_ID"> <div id="npaywishformDiv"></div> </form>
2 - 네이버페이 버튼 붙이기 ( 버튼 붙일곳에.... )
<!--// 네이버페이 START //--> <? if( $this->config->item('npay_mode') == 'service' ) { ?> <script type="text/javascript" src="http://pay.naver.com/customer/js/naverPayButton.js" charset="UTF-8"></script> <? } else if( $this->config->item('npay_mode') == 'test' ) { ?> <script type="text/javascript" src="http://test-pay.naver.com/customer/js/naverPayButton.js" charset="UTF-8"></script> <? } ?> <script type="text/javascript"> naver.NaverPayButton.apply({ BUTTON_KEY: "AAAAAA", // 네이버페이에서 제공받은 버튼 인증 키 입력 TYPE: "A", // 버튼 모음 종류 설정 COLOR: 1, // 버튼 모음의 색 설정 COUNT: 2, // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력. <? if( $item_count > 0 ) { ?> // 재고가 있을경우 ENABLE: "Y", BUY_BUTTON_HANDLER: buy_nc, WISHLIST_BUTTON_HANDLER:wishlist_nc, <? } else { ?> // 재고가 없을경우 ENABLE: "N", BUY_BUTTON_HANDLER: not_buy_nc, WISHLIST_BUTTON_HANDLER:not_buy_nc, <? } ?> "":"" }); function buy_nc() { goods_no = $("#goods_no").val(); goods_cnt = $("#goods_cnt").val(); goodsinfo = goods_no+","+goods_cnt; $.ajax({ url:'common/npay', type:'post', data: { 'ntype': 'detail' ,'goodsinfo': goodsinfo }, dataType: 'text', success:function(data){ var npayArr = data.trim().split("|"); if(npayArr[0] != "ok") { alert("err"); return; } document.npayform.action = npayArr[1]; document.npayform.target = "_blank"; document.npayform.ORDER_ID.value = npayArr[2]; document.npayform.SHOP_ID.value = npayArr[3]; document.npayform.TOTAL_PRICE.value = npayArr[4]; document.npayform.submit(); } }) } function not_buy_nc() { alert("죄송합니다. 네이버페이로 구매가 불가한 상품입니다."); return; } function wishlist_nc() { goodsinfo = $("#goods_no").val(); $.ajax({ url:'common/npay_wish', type:'post', data: { 'ntype': 'detail' ,'goodsinfo': goodsinfo }, dataType: 'text', success:function(data){ var npayArr = data.trim().split("|"); if(npayArr[0] != "ok") { alert("err"); return; } window.open("","npayformpop","width=500,height=500"); document.npaywishform.action = npayArr[1]; document.npaywishform.target = "npayformpop"; document.npaywishform.SHOP_ID.value = npayArr[2]; var itemids = npayArr[3].split(","); //alert(itemids.length); npaywishdivv = ""; for(i=0;i<itemids.length;i++) { npaywishdivv += "<input type='hidden' name='ITEM_ID' value='"+itemids[i]+"'>"; } $("#npaywishformDiv").html(npaywishdivv); document.npaywishform.submit(); } }) } </script> <!--// 네이버페이 END //-->
3. 구매 버튼 눌렀을때 ajax 액션
function npay(){ $this->load->model('product/productModel'); $shopId = 'gu'; $certiKey = 'FFFFFFFF'; if( $this->config->item('npay_mode') == 'service' ) { $orderUrl = "https://pay.naver.com/customer/order.nhn"; } else if( $this->config->item('npay_mode') == 'test' ) { $orderUrl = "https://test-pay.naver.com/customer/order.nhn"; } $ret = ""; $headers = ""; $bodys = ""; $totalMoney = 0; $ntype = $this->input->post('ntype'); $goodsinfov = $this->input->post('goodsinfo'); foreach(explode('|', $goodsinfov) as $goodsinfo) { $goodsArr = explode(',', $goodsinfo); $goods_no = $goodsArr[0]; $goods_cnt = $goodsArr[1]; $productInfo = $this->productModel->getProductInfo($goods_no); $id = $goods_no; $name = $productInfo->name; $uprice = $productInfo->price; $count = $goods_cnt; $tprice = $uprice * $count; $totalMoney += $tprice; $ret .= '&ITEM_ID=' . urlencode($id); $ret .= '&ITEM_NAME=' . urlencode($name); $ret .= '&ITEM_COUNT=' . $count; $ret .= '&ITEM_TPRICE=' . $tprice; $ret .= '&ITEM_UPRICE=' . $uprice; $ret .= '&EC_MALL_PID=' . $goods_no; } $shippingType = 'PAYED'; $shippingPrice = 2500; // 배송비무료일때 //$shippingType = 'FREE'; //$shippingPrice = 0; $totalPrice = (int)$totalMoney + (int)$shippingPrice; if($ntype == "detail"): $backUrl = "http://lemon421.cafe24.com/".$goods_no; else: $backUrl = "http://lemon421.cafe24.com/cart"; endif; $queryString = 'SHOP_ID='.urlencode($shopId); $queryString .= '&CERTI_KEY='.urlencode($certiKey); $queryString .= '&SHIPPING_TYPE='.$shippingType; $queryString .= '&SHIPPING_PRICE='.$shippingPrice; $queryString .= '&RESERVE1=&RESERVE2=&RESERVE3=&RESERVE4=&RESERVE5='; $queryString .= '&BACK_URL='.$backUrl; //$queryString .= '&SA_CLICK_ID='.$_COOKIE["NVADID"]; //CTS //CPA스크립트 가이드 설치 업체는 해당 값 전달 $queryString .= '&CPA_INFLOW_CODE='.urlencode(@$_COOKIE["CPAValidator"]); $queryString .= '&NAVER_INFLOW_CODE='.urlencode(@$_COOKIE["NA_CO"]); $queryString .= $ret; $queryString .= '&TOTAL_PRICE='.$totalPrice; if( $this->config->item('npay_mode') == 'service' ) { $req_addr = 'ssl://pay.naver.com'; } else if( $this->config->item('npay_mode') == 'test' ) { $req_addr = 'ssl://test-pay.naver.com'; } $req_url = 'POST /customer/api/order.nhn HTTP/1.1'; // utf-8 // $req_url = 'POST /customer/api/CP949/order.nhn HTTP/1.1'; // euc-kr if( $this->config->item('npay_mode') == 'service' ) { $req_host = 'pay.naver.com'; } else if( $this->config->item('npay_mode') == 'test' ) { $req_host = 'test-pay.naver.com'; } $req_port = 443; $nc_sock = @fsockopen($req_addr, $req_port, $errno, $errstr); if ($nc_sock) { fwrite($nc_sock, $req_url."\r\n" ); fwrite($nc_sock, "Host: ".$req_host.":".$req_port."\r\n" ); fwrite($nc_sock, "Content-type: application/x-www-form-urlencoded; charset=utf-8\r\n"); //fwrite($nc_sock, "Content-type: application/x-www-form-urlencoded;charset=CP949\r\n"); fwrite($nc_sock, "Content-length: ".strlen($queryString)."\r\n"); fwrite($nc_sock, "Accept: */*\r\n"); fwrite($nc_sock, "\r\n"); fwrite($nc_sock, $queryString."\r\n"); fwrite($nc_sock, "\r\n"); // get header while(!feof($nc_sock)){ $header=fgets($nc_sock,4096); if($header=="\r\n"){ break; } else { $headers .= $header; } } // get body while(!feof($nc_sock)){ $bodys.=fgets($nc_sock,4096); } fclose($nc_sock); $resultCode = substr($headers,9,3); if ($resultCode == 200) { // success $orderId = $bodys; } else { // fail echo $bodys; exit; } } else { echo "$errstr ($errno)<br>\n"; exit(); //에러처리 } echo "ok"."|".$orderUrl."|".$orderId."|".$shopId."|".$totalPrice; } function npay_wish(){ $this->load->model('product/productModel'); $shopId = 'gu'; $certiKey = 'FFFFFFFF'; if( $this->config->item('npay_mode') == 'service' ) { $wishlistPopupUrl = "https://pay.naver.com/customer/wishlistPopup.nhn"; } else if( $this->config->item('npay_mode') == 'test' ) { $wishlistPopupUrl = "https://test-pay.naver.com/customer/wishlistPopup.nhn"; } $ret = ""; $headers = ""; $bodys = ""; $ntype = $this->input->post('ntype'); $goodsinfov = $this->input->post('goodsinfo'); foreach(explode('|', $goodsinfov) as $goods_no) { $productInfo = $this->productModel->getProductInfo($goods_no); $uid = $goods_no; $name = $productInfo->name; $uprice = $productInfo->price; $image = "http://".$_SERVER["HTTP_HOST"].$productInfo->image; $thumb = "http://".$_SERVER["HTTP_HOST"].$productInfo->tumb; $url = "http://lemon421.cafe24.com/".$goods_no; $ret .= '&ITEM_ID=' . urlencode($uid); $ret .= '&ITEM_NAME=' . urlencode($name); $ret .= '&ITEM_UPRICE=' . $uprice; $ret .= '&ITEM_IMAGE=' . urlencode($image); $ret .= '&ITEM_THUMB=' . urlencode($thumb); $ret .= '&ITEM_URL=' . urlencode($url); } $queryString = 'SHOP_ID='.urlencode($shopId); $queryString .= '&CERTI_KEY='.urlencode($certiKey); $queryString .= '&RESERVE1=&RESERVE2=&RESERVE3=&RESERVE4=&RESERVE5='; $queryString .= $ret; if( $this->config->item('npay_mode') == 'service' ) { $req_addr = 'ssl://pay.naver.com'; } else if( $this->config->item('npay_mode') == 'test' ) { $req_addr = 'ssl://test-pay.naver.com'; } $req_url = 'POST /customer/api/wishlist.nhn HTTP/1.1'; // utf-8 // $req_url = 'POST /customer/api/CP949/wishlist.nhn HTTP/1.1'; // euc-kr if( $this->config->item('npay_mode') == 'service' ) { $req_host = 'pay.naver.com'; } else if( $this->config->item('npay_mode') == 'test' ) { $req_host = 'test-pay.naver.com'; } $req_port = 443; $nc_sock = @fsockopen($req_addr, $req_port, $errno, $errstr); if ($nc_sock) { fwrite($nc_sock, $req_url."\r\n" ); fwrite($nc_sock, "Host: ".$req_host.":".$req_port."\r\n" ); fwrite($nc_sock, "Content-type: application/x-www-form-urlencoded; charset=utf-8\r\n"); //fwrite($nc_sock, "Content-type: application/x-www-form-urlencoded;charset=CP949\r\n"); fwrite($nc_sock, "Content-length: ".strlen($queryString)."\r\n"); fwrite($nc_sock, "Accept: */*\r\n"); fwrite($nc_sock, "\r\n"); fwrite($nc_sock, $queryString."\r\n"); fwrite($nc_sock, "\r\n"); // get header while(!feof($nc_sock)){ $header=fgets($nc_sock,4096); if($header=="\r\n"){ break; } else { $headers .= $header; } } // get body while(!feof($nc_sock)){ $bodys.=fgets($nc_sock,4096); } fclose($nc_sock); $resultCode = substr($headers,9,3); if ($resultCode == 200) { // success $itemIds = trim($bodys); } else { // fail echo $bodys; exit; } } else { echo "$errstr ($errno)<br>\n"; exit(); //에러처리 } echo "ok"."|".$wishlistPopupUrl."|".$shopId."|".$itemIds; }
작업완료.
타사 pg에 비해 월등히 쉽다.
이유는... DB처리를 안하기때문에....
- Tag :
- 네이버페이 , npay , naverpay , 네이버pay , 독립몰 네이버페이 , 네이버페이 개발 , npay 개발 , npay php , 네이버페이 php , 네이버페이 소켓통신 , 네이버페이 fsockopen