반응형

 

 

쇼핑몰에서 제품을 등록할때 가장 많이 쓰는 방법중에 하나가 api를 통한 등록이다. 다른 업체에서 제공하는 api를 읽어와서 우리 쇼핑몰에 등록하는 것이다. 이런것을 인바운드 API라고 한다. 또는 Putter라고 한다. 

 

반대로 우리 쇼핑몰에 있는 제품을 다른 회사에 제공해줄때도 있다. 이런것을 아웃바운드 API라고 한다. 또는 Getter라고 한다.

 

Putter를 위한 api에서는 다른 업체의 api에 접속하여 작업을 하므로 해당 업체의 Api URL과 Api key가 필요하다. 해당 업체에서 직접 받아야한다. 그렇게 접속하면 대부분 JSON으로 된 데이터를 가져올 수 있다. 이렇게 가져온 데이터를 가공해서 우리 디비에 넣어주면 된다.

 

Getter를 위한 api에서는 다른 업체에게 알려줄 Api Url과 Api key를 알려주면 된다. 물론 그걸 만들고 난 이후 얘기다. 

 

api는 보통 Rest Api 라는걸 기준으로 만든다. 회사마다 만드는 기준이 있고 요구하는 문서들도 다양하다. 그런것들은 회사에서 일하면서 경험해보도록 하고 우선 Getter 하나를 만들고 그 getter를 통해 우리 쇼핑몰 데이터를 내 보내는 파일을 만들어보겠다. 다음에 putter도 만들어보자.

 

우선 파일을 만들어보자. 최소한의 Rest Api의 기준을 맞추기 위해 경로를 만들어보겠다.

 

/api/v1/getter/getter.php

 

이렇게 만든다. v1은 버전이다. 다음에 만들때는 v2로 하면된다. 소스를 보자.

<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );

header('Content-Type: text/html; charset=utf-8');

$headers = apache_request_headers();

$apikey = $headers['x-apikey'];//apikey 확인

$xapikey = hash('sha512', date("Ymd"));//상대방과 어떤 apikey를 사용할지 정해서 결정. 여기서는 날짜를 해쉬화했다.

if($apikey==$xapikey){//apikey가 맞으면

    $jsonData = file_get_contents('php://input');//외부에서 보내온 json 데이터
    $arrayData = json_decode($jsonData, true);//array로 디코드
    $cnt=0;
    foreach($arrayData as $ds){
        $query="select * from products where status=1 and cate like '%".$ds['cate']."%'";
        $result = $mysqli->query($query) or die("query error => ".$mysqli->error);
        while($rs = $result->fetch_object()){
            $returnArray[]=$rs;
            $cnt++;
        }
    }

    $result=array("success" => "true"
                , "code" => "200"
                , "message" => "OK"
                , "data" => $returnArray
                , "count" => $cnt
                );

}else{

    $result=array("success" => "true"
              , "code" => "401"
              , "message" => "Unauthorized"
              , "data" => array ()
              , "count" => 0
              );

}

echo stripslashes(json_encode($result, JSON_UNESCAPED_UNICODE));
?>

이렇게 만들어서 이 주소를 외부에서 api를 호출할 업체에게 보내주면 된다. 단 여기서 중요한것은 apikey다 apikey를 미리 지정해서 알려줘도 되고 소스처럼 매일 바뀌게 해도 된다. 그건 정하기 나름. 물론 인증방식은 이것말고도 많이 있다. 그중 가장 단순한 방식의 인증을 사용했다.

 

자 이렇게 만들었으면 그럼 이 api를 호출해서 값을 가져가는 상대방에서 만들어야되는 파일도 php로 만들어보자.

 

/api/v1/getter/getterSend.php

<?php
//   error_reporting(E_ALL);
//   ini_set("display_errors", 1);

    $apiKey = hash('sha512', date("Ymd"));
    $url = "http://localhost:8008/api/v1/getter/getter.php";

    $postdata = '[
        {"cate":"A0001"},
        {"cate":"A0002"}
        ]';

    $ch = curl_init(); // 리소스 초기화
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      'x-apikey: '.$apiKey,
      'Content-Type: application/json'
    ));
 
    $output = curl_exec($ch); // 데이터 요청 후 수신
    //echo $output;
    $rs=json_decode($output);
    curl_close($ch);  // 리소스 해제

    echo "<pre>";
    print_r($rs);

   
?>

 

이렇게 CURL을 이용하는 방법으로 만들면 된다. 이 부분은 php가 아니라도 어떤 언어로도 이런식으로만 만들면 된다. 다른 언어들도 대부분 CURL을 이용해 데이터를 가져오는 방법이 있다. 물론 꼭 CURL을 안써도 된다.

 

자 그럼 저 파일을 호출해 보자. 여기서 나는 사이트 주소가 http://localhost:8008 이어서 주소에 이게 붙는다. 다른 사람들은 자기가 지정한 주소로 하면 된다.

 

http://localhost:8008/api/v1/getter/getterSend.php

 

이런식으로 호출한다. 그러면 화면에 리턴값이 보인다.

 

stdClass Object
(
    [success] => true
    [code] => 200
    [message] => OK
    [data] => Array
        (
            [0] => stdClass Object
                (
                    [pid] => 20
                    [name] => test
                    [cate] => A0001B0001C0001
                    [content] =>

test

                    [thumbnail] => http://localhost:8008/pdata/20220329030809178595.jpeg
                    [price] => 5000000
                    [sale_price] => 3000000
                    [sale_ratio] => 0
                    [cnt] => 0
                    [sale_cnt] => 0
                    [isnew] => 1
                    [isbest] => 0
                    [isrecom] => 0
                    [ismain] => 0
                    [locate] => 0
                    [userid] => admin
                    [sale_end_date] => 2022-09-29 00:00:00
                    [reg_date] => 2022-03-29 10:08:09
                    [status] => 1
                    [delivery_fee] => 0
                )

            [1] => stdClass Object
                (
                    [pid] => 21
                    [name] => 오디오앰프
                    [cate] => A0001B0001C0001
                    [content] =>

오디오앰프

                    [thumbnail] => http://localhost:8008/pdata/20220329031038408140.jpg
                    [price] => 3000000
                    [sale_price] => 2000000
                    [sale_ratio] => 0
                    [cnt] => 0
                    [sale_cnt] => 0
                    [isnew] => 1
                    [isbest] => 0
                    [isrecom] => 0
                    [ismain] => 0
                    [locate] => 0
                    [userid] => admin
                    [sale_end_date] => 2022-09-29 00:00:00
                    [reg_date] => 2022-03-29 10:10:38
                    [status] => 1
                    [delivery_fee] => 0
                )

            [2] => stdClass Object
                (
                    [pid] => 54
                    [name] => 옵션많은노트북
                    [cate] => A0001B0001C0001
                    [content] => 옵션많은노트북
                    [thumbnail] => http://localhost:8008/pdata/20220329030809178595.jpeg
                    [price] => 2000000
                    [sale_price] => 1500000
                    [sale_ratio] => 0
                    [cnt] => 100
                    [sale_cnt] => 
                    [isnew] => 1
                    [isbest] => 0
                    [isrecom] => 1
                    [ismain] => 0
                    [locate] => 1
                    [userid] => admin
                    [sale_end_date] => 2022-09-20 00:00:00
                    [reg_date] => 2022-04-08 14:25:15
                    [status] => 1
                    [delivery_fee] => 0
                )

        )

    [count] => 3
)

 

이런식으로 보일것이다. JSON 데이터이다. 그러면 이 데이터를 가지고 상대방은 자기들 디비에 넣거나 할것이다. 그것까지 내가 신경쓸 필욘없고 우리 쇼핑몰의 데이터를 JSON으로 변환해서 뿌려주기만 하면된다.

 

위 소스에서는 products에 있는 값만 보내줬는데 옵션이나 추가 이미지등에 대한 값도 json에 포함시키는걸 해보자. 이건 직접 해보자.

 

해봤는가? 아래 소스를 같이 한번 보자

 

/api/v1/getter/getter.php

<?php session_start();
include $_SERVER["DOCUMENT_ROOT"]."/inc/dbcon.php";
ini_set( 'display_errors', '0' );

header('Content-Type: text/html; charset=utf-8');

$headers = apache_request_headers();

$apikey = $headers['x-apikey'];//apikey 확인

$xapikey = hash('sha512', date("Ymd"));//상대방과 어떤 apikey를 사용할지 정해서 결정.

if($apikey==$xapikey){//apikey가 맞으면

    $jsonData = file_get_contents('php://input');//외부에서 보내온 json 데이터
    $arrayData = json_decode($jsonData, true);//array로 디코드
    $cnt=0;
    foreach($arrayData as $ds){
        $query="select pid, name, cate, content, thumbnail, price, sale_price, sale_ratio, cnt, sale_cnt, isnew, isbest, isrecom, ismain, locate, sale_end_date, status, delivery_fee from products where status=1 and cate like '%".$ds['cate']."%'";
        $result = $mysqli->query($query) or die("query error => ".$mysqli->error);
        while($rs = $result->fetch_object()){
           
            //추가이미지를 불러와서 추가
            $pimg = array();
            $query2="select filename from product_image_table where status=1 and pid=".$rs->pid." order by imgid asc";
            $result2 = $mysqli->query($query2) or die("query error => ".$mysqli->error);
            while($rs2 = $result2->fetch_object()){
                $pimg[] = $rs2->filename;
            }
            $rs->product_images = $pimg;

            //옵션을 불러와서 추가
            $opts = array();
            $query3="select poid, cate, option_name, option_cnt, option_price, image_url from product_options where status=1 and pid=".$rs->pid." order by poid asc";
            $result3 = $mysqli->query($query3) or die("query error => ".$mysqli->error);
            while($rs3 = $result3->fetch_object()){
                $opts[] = $rs3;
            }
            $rs->product_options = $opts;

            //wms(재고)를 불러와서 추가
            $cnts = array();
            $query4="select wcode,cnt from wms where status=1 and pid=".$rs->pid." order by wid asc";
            $result4 = $mysqli->query($query4) or die("query error => ".$mysqli->error);
            while($rs4 = $result4->fetch_object()){
                $cnts[] = $rs4;
            }
            $rs->wms = $cnts;

            $returnArray[]=$rs;
            $cnt++;
        }
    }

    $result=array("success" => "true"
                , "code" => "200"
                , "message" => "OK"
                , "data" => $returnArray
                , "count" => $cnt
                );

}else{

    $result=array("success" => "true"
              , "code" => "401"
              , "message" => "Unauthorized"
              , "data" => array ()
              , "count" => 0
              );

}

echo stripslashes(json_encode($result, JSON_UNESCAPED_UNICODE));
?>

이렇게 해준다. 그러면 리턴값은

 

stdClass Object
(
    [success] => true
    [code] => 200
    [message] => OK
    [data] => Array
        (
            [0] => stdClass Object
                (
                    [pid] => 20
                    [name] => test
                    [cate] => A0001B0001C0001
                    [content] =>

test

                    [thumbnail] => http://localhost:8008/pdata/20220329030809178595.jpeg
                    [price] => 5000000
                    [sale_price] => 3000000
                    [sale_ratio] => 0
                    [cnt] => 0
                    [sale_cnt] => 0
                    [isnew] => 1
                    [isbest] => 0
                    [isrecom] => 0
                    [ismain] => 0
                    [locate] => 0
                    [sale_end_date] => 2022-09-29 00:00:00
                    [status] => 1
                    [delivery_fee] => 0
                    [product_images] => Array
                        (
                            [0] => http://localhost:8008/pdata/20220329030800919193.jpg
                            [1] => http://localhost:8008/pdata/20220329030800191315.jpg
                            [2] => http://localhost:8008/pdata/20220329030800779496.jpeg
                            [3] => http://localhost:8008/pdata/20220329030800188108.gif
                        )

                    [product_options] => Array
                        (
                        )

                    [wms] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [wcode] => 
                                    [cnt] => 100
                                )

                        )

                )

            [1] => stdClass Object
                (
                    [pid] => 21
                    [name] => 오디오앰프
                    [cate] => A0001B0001C0001
                    [content] =>

오디오앰프

                    [thumbnail] => http://localhost:8008/pdata/20220329031038408140.jpg
                    [price] => 3000000
                    [sale_price] => 2000000
                    [sale_ratio] => 0
                    [cnt] => 0
                    [sale_cnt] => 0
                    [isnew] => 1
                    [isbest] => 0
                    [isrecom] => 0
                    [ismain] => 0
                    [locate] => 0
                    [sale_end_date] => 2022-09-29 00:00:00
                    [status] => 1
                    [delivery_fee] => 0
                    [product_images] => Array
                        (
                            [0] => http://localhost:8008/pdata/20220329031017292182.jpg
                            [1] => http://localhost:8008/pdata/20220329031017210883.jpeg
                        )

                    [product_options] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [poid] => 29
                                    [cate] => 컬러
                                    [option_name] => 블루
                                    [option_cnt] => 
                                    [option_price] => 0
                                    [image_url] => http://localhost:8008/pdata/optiondata/20220329031038737067.jpg
                                )

                            [1] => stdClass Object
                                (
                                    [poid] => 30
                                    [cate] => 컬러
                                    [option_name] => 블랙
                                    [option_cnt] => 
                                    [option_price] => 0
                                    [image_url] => http://localhost:8008/pdata/optiondata/20220329031038104695.gif
                                )

                        )

                    [wms] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [wcode] => 29
                                    [cnt] => 100
                                )

                            [1] => stdClass Object
                                (
                                    [wcode] => 30
                                    [cnt] => 100
                                )

                        )

                )

            [2] => stdClass Object
                (
                    [pid] => 54
                    [name] => 옵션많은노트북
                    [cate] => A0001B0001C0001
                    [content] => 옵션많은노트북
                    [thumbnail] => http://localhost:8008/pdata/20220329030809178595.jpeg
                    [price] => 2000000
                    [sale_price] => 1500000
                    [sale_ratio] => 0
                    [cnt] => 100
                    [sale_cnt] => 
                    [isnew] => 1
                    [isbest] => 0
                    [isrecom] => 1
                    [ismain] => 0
                    [locate] => 1
                    [sale_end_date] => 2022-09-20 00:00:00
                    [status] => 1
                    [delivery_fee] => 0
                    [product_images] => Array
                        (
                        )

                    [product_options] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [poid] => 51
                                    [cate] => 컬러
                                    [option_name] => 블루
                                    [option_cnt] => 
                                    [option_price] => 0
                                    [image_url] => http://localhost:8008/pdata/20220329031038408140.jpg
                                )

                            [1] => stdClass Object
                                (
                                    [poid] => 52
                                    [cate] => 컬러
                                    [option_name] => 레드
                                    [option_cnt] => 
                                    [option_price] => 0
                                    [image_url] => http://localhost:8008/pdata/20220329030809178595.jpeg
                                )

                            [2] => stdClass Object
                                (
                                    [poid] => 53
                                    [cate] => 사이즈
                                    [option_name] => 대형
                                    [option_cnt] => 
                                    [option_price] => 500000
                                    [image_url] => 
                                )

                            [3] => stdClass Object
                                (
                                    [poid] => 54
                                    [cate] => 사이즈
                                    [option_name] => 소형
                                    [option_cnt] => 
                                    [option_price] => 0
                                    [image_url] => 
                                )

                        )

                    [wms] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [wcode] => 51_53
                                    [cnt] => 200
                                )

                            [1] => stdClass Object
                                (
                                    [wcode] => 51_54
                                    [cnt] => 150
                                )

                            [2] => stdClass Object
                                (
                                    [wcode] => 52_53
                                    [cnt] => 100
                                )

                            [3] => stdClass Object
                                (
                                    [wcode] => 52_54
                                    [cnt] => 50
                                )

                        )

                )

        )

    [count] => 3
)

이건 배열을 출력한 것이다. 이걸 json으로 변경해서 보내준다.

 

다시한번 말하지만 이런 방식의 api는 언어를 따지지 않는다. 지금은 PHP에 대한 강좌니까 PHP로 한거지 뭘로 해도 상관없다. 바꿔 말하면 상대방의 api에 접속해서 데이터를 가져오려고 할때도 상대방의 언어에 관계없이 PHP를 사용해도 된다는 것이다. CURL만 있으면 된다.

 

다음엔 상대방의 데이터를 가져와서 우리 쇼핑몰 디비에 입력한 인바운드(PUTTER)를 만들어보자.

반응형

+ Recent posts