[npay/네이버페이] 쇼핑몰 네이버페이 연동. 프로그래밍

준비물

 

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 :

Leave Comments