테스트 사이트 - 개발 중인 베타 버전입니다

네이버 체크아웃 연동 개발자버전

· 14년 전 · 1364 · 7
네이버 체크아웃을 연동하는 방법을 소개합니다.
 
실제 운영하는 사이트에 적용 해보지는 않았으므로 적용후 많은 테스트를 거치시기 바랍니다.
 
이 코드와 관련된 질문은 아래 코멘트로 남겨 주십시오.
 
 
extend/naver_checkout.extend.php 파일을 생성합니다.
 
<?
// 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음
define("_GNUBOARD_", TRUE);
// 체크아웃 사용 : true , 미사용 : false (미사용의 경우 아래 설정은 무용지물임)
$checkout['use'] = true;
// 체크아웃 테스트 : true , 실제운영 : false
$checkout['test'] = true;
// 체크아웃 도메인
if ($checkout['test'])
    $checkout['domain'] = "test-checkout.naver.com"; // 테스트 도메인
else
    $checkout['domain'] = "checkout.naver.com"; // 실제운영 도메인
// 체크아웃 쇼핑몰아이디
$checkout['shop_id'] = "네이버체크아웃아이디";
// 체크아웃 가맹점 인증키
$checkout['certi_key'] = "네이버에서 알려줍니다";
// 체크아웃 버튼 인증키
$checkout['button_key'] = "네이버에서 알려줍니다";
?>
 
shop/item.php 을 수정합니다.
 <?
$arr_option = array();
// 선택옵션 출력
for ($i=1; $i<=6; $i++)
{
    // 옵션에 문자가 존재한다면
    $str = get_item_options(trim($it["it_opt{$i}_subject"]), trim($it["it_opt{$i}"]), $i);
    if ($str)
    {
        echo "<tr height=25>";
        echo "<td>&nbsp;&nbsp;&nbsp; · ".$it["it_opt{$i}_subject"]."</td>";
        echo "<td align=center>:</td>";
        echo "<td style='word-break:break-all;'>$str</td></tr>\n";
        echo "<tr><td colspan=3 height=1 background='$g4[shop_img_path]/dot_line.gif'></td></tr>\n";
        if (preg_match("#<select#", $str))
            $arr_option[] = "checkOption(form.it_opt{$i}, '".$it["it_opt{$i}_subject"]."')";
    }
}
$check_option = implode(" && ", $arr_option);
?>
<? if ($checkout['use']) { ?>
<!-- 네이버 체크아웃 코드 -->
<script type="text/javascript" >
//<![CDATA[
function checkOption(selectBox, optionName)
{
    if (selectBox.value == '' || selectBox.value == '선택') {
        alert("상품 옵션을 선택해 주세요. (" + optionName + ")");
        return false;
    }
    return true;
}
function buy_nc(url)
{
    var form = document.fitem;
    var check = <?=isset($check_option)?($check_option?$check_option:1):-1; // 옵션이 있으면 옵션검사 코드, 없으면 무조건 true ?>;
    if ( check ) {
        // 네이버 체크아웃으로 주문 정보를 등록하는 가맹점 페이지로 이동.
        // 해당 페이지에서 주문 정보 등록 후 네이버 체크아웃 주문서 페이지로 이동.
        var option = "";
        var delimiter = "";
        for (var i=1; i<=6; i++) {
            if (document.getElementById("it_opt"+i)) {
                option += delimiter
                        + document.getElementById("it_opt"+i+"_subject").value
                        + ":"
                        + document.getElementById("it_opt"+i).value;
                delimiter = "/";
            }
        }
        var opt = document.createElement('input');
        opt.type = 'text';
        opt.name = 'option';
        opt.value = option;
        form.appendChild(opt);
        amount_change();
        var amount = parseInt(document.getElementById("it_amount").value);
       
        form.action = "./naver_checkout.php";
        form.target = "checkout";
        form.submit();
    } else if (check == -1) {
        alert("상품옵션의 변수가 제대로 선언되지 않아 오류가 발생하였습니다.");
    }
    return false;
}
function wishlist_nc(url)
{
    // 네이버 체크아웃으로 찜 정보를 등록하는 가맹점 페이지 팝업 창 생성.
    // 해당 페이지에서 찜 정보 등록 후 네이버 체크아웃 찜 페이지로 이동.
    window.open(url,"wishlist","scrollbars=yes,width=400,height=267");
    var form = document.fitem;
    form.action = url;
    form.target = "wishlist";
    form.submit();
    return false;
}
function not_buy_nc()
{
    alert("죄송합니다. NAVER Checkout으로 구매가 불가한 상품입니다.");
    return false;
}
//]]>
</script>
<?
// 재고수량 구함
$stock_qty = get_it_stock_qty($it_id);
$is_buy_button = $stock_qty ? "Y" : "N"; // 체크아웃에서 사용
if (get_amount($it) <= 0) $is_buy_button = "N";
?>
<br />
<iframe name="checkout" style="display:none;"></iframe>
<script type="text/javascript" src="http://checkout.naver.com/customer/js/checkoutButton2.js" charset="UTF-8"></script>
<script type="text/javascript" >
//<![CDATA[
    nhn.CheckoutButton.apply({
        BUTTON_KEY:"<?=$checkout['button_key']?>", // 체크아웃에서 제공받은 버튼 인증 키 입력
        TYPE: "A", // 버튼 모음 종류 설정
        COLOR: 1, // 버튼 모음의 색 설정
        COUNT: 2, // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
        ENABLE: "<?=$is_buy_button?>", // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
        BUY_BUTTON_HANDLER: <?=($is_buy_button=="Y")?"buy_nc":"not_buy_nc";?>, // 구매하기 버튼 이벤트 Handler 함수 등록. 품절인 경우 not_buy_nc 함수 사용
        WISHLIST_BUTTON_HANDLER:wishlist_nc, // 찜하기 버튼 이벤트 Handler 함수 등록
        WISHLIST_BUTTON_LINK_URL:"<?=$g4[shop_path]?>/naver_wishlist.php", // 찜하기 팝업 링크 주소
        "":""
    });
//]]>
</script>
<!-- /네이버 체크아웃 코드 -->
<? } ?>
 
shop/cartsub.inc.php 를 수정합니다.
 $option = "";
$delimiter = "";
for ($k=1; $k<=6; $k++) {
    if ($row["it_opt{$k}"]) {
        $option .= $delimiter . $row["it_opt{$k}_subject"] . ":" . $row["it_opt{$k}"];
        $delimiter = "/";
    }
}
$option = get_text($option);
$arr_it_id[] = "it_id=".$row[it_id];
if ($i > 0)
    echo "<tr><td colspan='$colspan' height=1 bgcolor=#E7E9E9></td></tr>";
                                  
echo "<tr>";
echo "<td align=left style='padding:5px;'>$image</td><td>";
echo "\n<input type=hidden name='ct_id[$i]'     value='$row[ct_id]'>";
echo "\n<input type=hidden name='it_id[$i]'     value='$row[it_id]'>";
echo "\n<input type=hidden name='option[$i]'    value='$option'>";
echo "\n<input type=hidden name='it_amount[$i]' value='$row[ct_amount]'>";
//echo "\n<input type=hidden name='ap_id[$i]'    value='$row[ap_id]'>";
//echo "\n<input type=hidden name='bi_id[$i]'    value='$row[bi_id]'>";
echo "\n<input type=hidden name='it_name[$i]'   value='".get_text($row[it_name])."'>";
echo $it_name;
echo "</td>\n";
 <? if ($checkout['use']) { ?>
<!-- 네이버 체크아웃 코드 -->
<script type="text/javascript" >
//<![CDATA[
function checkOption(selectBox, nonSelectedIndex, optionName)
{
    if (selectBox.selectedIndex == nonSelectedIndex) {
        alert("상품 옵션을 선택해 주세요. (" + optionName + ")");
        return false;
    }
    return true;
}
function buy_nc(url)
{
    var form = document.frmcartlist;
    var check = 1;
    if ( check ) {
        form.action = "./naver_checkout.php";
        form.target = "checkout";
        form.submit();
    }
    return false;
}
function wishlist_nc(url)
{
    window.open(url,"wishlist","scrollbars=yes,width=400,height=267");
    var form = document.frmcartlist;
    form.action = url;
    form.target = "wishlist";
    form.submit();
    return false;
}
function not_buy_nc()
{
    alert("죄송합니다. NAVER Checkout으로 구매가 불가한 상품입니다.");
    return false;
}
//]]>
</script>
<?
if ($goods_count > -1) $is_buy_button = "Y";
?>
<br />
<iframe name="checkout" style="display:none;"></iframe>
<script type="text/javascript" src="http://checkout.naver.com/customer/js/checkoutButton2.js" charset="UTF-8"></script>
<script type="text/javascript" >//<![CDATA[
    nhn.CheckoutButton.apply({
        BUTTON_KEY:"<?=$checkout['button_key']?>", // 체크아웃에서 제공받은 버튼 인증 키 입력
        TYPE: "A", // 버튼 모음 종류 설정
        COLOR: 1, // 버튼 모음의 색 설정
        COUNT: 2, // 버튼 개수 설정. 구매하기 버튼만 있으면(장바구니 페이지) 1, 찜하기 버튼도 있으면(상품 상세 페이지) 2를 입력.
        ENABLE: "<?=$is_buy_button?>", // 품절 등의 이유로 버튼 모음을 비활성화할 때에는 "N" 입력
        BUY_BUTTON_HANDLER: <?=($is_buy_button=="Y")?"buy_nc":"not_buy_nc";?>, // 구매하기 버튼 이벤트 Handler 함수 등록. 품절인 경우 not_buy_nc 함수 사용
        WISHLIST_BUTTON_HANDLER:wishlist_nc, // 찜하기 버튼 이벤트 Handler 함수 등록
        WISHLIST_BUTTON_LINK_URL:"<?=$g4[shop_path]?>/naver_wishlist.php", // 찜하기 팝업 링크 주소
        "":""
    });
//]]>
</script>
<!-- /네이버 체크아웃 코드 -->
<? } ?>
 
 
shop/naver_checkout.php 을 생성합니다.
shop/naver_wishlist.php 을 생성합니다.


추가합니다
lib/shop.lib.php 를 수정합니다.

// 상품 옵션
function get_item_options($subject, $option, $index)
{
    $subject = trim($subject);
    $option  = trim($option);

    if (!$subject || !$option) return "";

    $str = "";
    
    $arr = explode("\n", $option);
    // 옵션이 하나일 경우
    if (count($arr) == 1) 
    {
        $str = $option;
    } 
    else 
    {
        $str = "<select id=\"it_opt{$index}\" name=\"it_opt{$index}\" onchange='amount_change()'>\n";
        for ($k=0; $k<count($arr); $k++) 
        {
            $arr[$k] = str_replace("\r", "", $arr[$k]);
            $opt = explode(";", trim($arr[$k]));
            $str .= "<option value='$arr[$k]'>{$opt[0]}";
            // 옵션에 금액이 있다면
            if ($opt[1] != 0) 
            {
                $str .= " (";
                // - 금액이 아니라면 모두 + 금액으로
                //if (!ereg("[-]", $opt[1])) 
                if (!preg_match("/[-]/", $opt[1])) 
                    $str .= "+";
                $str .= display_amount($opt[1]) . ")";
            }
            $str .= "</option>\n";
        }
        $str .= "</select>\n<input type=hidden id=\"it_opt{$index}_subject\" name=\"it_opt{$index}_subject\" value='$subject'>\n";
    }

    return $str;
}

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 7개

몇일 직접 해보니...
이게 쉬운거 같아도 쉬운게 아니네요..
지금 네이버 체크아웃 테스트 계정을 테스트 중인데...(심사를 하는듯 합니다)
네이버 담당자가 요구하는 것도 몇가지 있고... 테스트를 거친 이후에 승인이 되는듯 합니다..
한번에 패스가 되었으면 하네요..
혹시 네이버 체크아웃 연동에 대해서 궁금하신게 있으시면 쪽지나 메일 주세요...
네이버 체크아웃 오늘로 8일째 심사중이네여...에휴~~
1차 심사는 승인이 났는데...
2차에서 문제가 발생 되었는데...
네이어체크아웃 심사 상담원과 통화를 했습니다.

상담원 이야기는...
"네이버 체크아웃은 비주기적으로 상품 정보를 업데이트하기 위해, 가맹점 사이트에 HTTP로 상품 정보 요청을 보낸다. 가맹점은 요청받은 상품 정보를 XML로 전송하는 페이지를 생성해야 한다." 라고 합니다.

그러면서 독립몰 연동가이드 PDF파일 33, 34페이지를 보고 xml 파일을 만들어서 해당 url를 보내달라고 합니다.
바쁘시겠지만.. 등록하신 개발자연동 파일에 추가로 xml 파일 생성파일도 올려주시면 감사하겠습니다.
http://sir.co.kr/bbs/board.php?bo_table=yc4_qa&wr_id=41601
여기에 올려 놓았습니다.
관리자님 도움으로 정상적으로 네이버체크아웃 오픈을 완료 하였습니다.
감사합니다.~~
해결하셨다니 다행입니다.
13년 전
아름빠님 말씀이 잘 이해가 안갔는데 .... 완료해 보니 이해가 되네요.^^b

감.사.합.니.다.
shop/cartsub.inc.php 수정관련하여

다음 문장의 it_opt{$k}_subject가 정상적으로 처리되기 위해서는
$option .= $delimiter . $row["it_opt{$k}_subject"] . ":" . $row["it_opt{$k}"];

shop/cartsub.inc.php 상단의 쿼리에 b.it_opt1_subject 에서 b.it_opt6_subject 까지의 내용이 추가되어야 합니다.
다음 쿼리 참고하세요.

$sql = " select a.ct_id,
a.it_opt1,
a.it_opt2,
a.it_opt3,
a.it_opt4,
a.it_opt5,
a.it_opt6,
b.it_opt1_subject,
b.it_opt2_subject,
b.it_opt3_subject,
b.it_opt4_subject,
b.it_opt5_subject,
b.it_opt6_subject,
a.ct_amount,
a.ct_point,
a.ct_qty,
a.ct_status,
a.ic_id,
a.ic_name,
b.it_id,
b.it_name,
b.ca_id
from $g4[yc4_cart_table] a,
$g4[yc4_item_table] b
where a.on_uid = '$s_on_uid'
and a.it_id = b.it_id
order by a.ct_id ";

게시글 목록

번호 제목
1440
1434
1433
1428
1421
1397
1396
1388
1379
1378
1377
1367
1365
1362
1348
1343
1335
1318
1311
1310