반응형

 

 

이번엔 푸터를 만들어보자. 다른 업체에서 우리가 만든 api를 호출해서 우리 쇼핑몰 디비에 제품을 등록하는 것이다. 물론 앞서 작업했던 getter처럼 상대방 쇼핑몰의 api에 getter로 접속해서 데이터를 가져온 후 디비에 입력할 수도 있다. 다만 그런 비슷한건 앞에서 해 봤으니 이번엔 putter를 해보자는 것이다.

 

상대방이 우리 api에 접속하면 우리 디비에 상품이 등록되는 방식이다. 이런 api들은 매뉴얼이 있고 상대방에게 그 매뉴얼을 주어 정확한 데이터를 보내달라고 하는 것이 중요하다. 이런 api는 여러 업체에서 쓰기때문에 매뉴얼은 정확하게 만들어주고 테이블이 변경되면 즉시 현행화하는 것이 중요하다.

 

우선 getter 할때와 마찬가지로 데이터를 전송하는 send부터 만들어보자. 

 

/api/v1/putter/putterSend.php

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

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

    $postdata = '[
        {
            "name":"API 테스트상품"
            ,"cate":"A0001B0001C0001"
            ,"content":"테스트상품"
            ,"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":[
                "http://localhost:8008/pdata/20220329030800919193.jpg"
                ,"http://localhost:8008/pdata/20220329030800191315.jpg"
                ,"http://localhost:8008/pdata/20220329030800779496.jpeg"
                ,"http://localhost:8008/pdata/20220329030800188108.gif"
            ]
            ,"product_options":[]
            ,"wms":[
                    {
                        "wcode":""
                        ,"cnt":"100"
                    }
                ]
            },
        {
            "name":"API 옵션많은노트북"
            ,"cate":"A0001B0001C0001"
            ,"content":"옵션많은노트북"
            ,"thumbnail":"http://localhost:8008/pdata/20220329030809178595.jpeg"
            ,"price":"2000000"
            ,"sale_price":"1500000"
            ,"sale_ratio":"0"
            ,"cnt":"100"
            ,"sale_cnt":0
            ,"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":[]
            ,"product_options":[
                {"poid":"51","cate":"컬러","option_name":"블루","option_price":"0","image_url":"http://localhost:8008/pdata/20220329031038408140.jpg"}
                ,{"poid":"52","cate":"컬러","option_name":"레드","option_price":"0","image_url":"http://localhost:8008/pdata/20220329030809178595.jpeg"}
                ,{"poid":"53","cate":"사이즈","option_name":"대형","option_price":"500000","image_url":null}
                ,{"poid":"54","cate":"사이즈","option_name":"소형","option_price":"0","image_url":null}
            ]
            ,"wms":[
                {"wcode":"51_53","cnt":"200"}
                ,{"wcode":"51_54","cnt":"150"}
                ,{"wcode":"52_53","cnt":"100"}
                ,{"wcode":"52_54","cnt":"50"}
            ]
        },
        {"name":"Api오디오앰프","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":["http://localhost:8008/pdata/20220329031017292182.jpg","http://localhost:8008/pdata/20220329031017210883.jpeg"],"product_options":[{"poid":"29","cate":"컬러","option_name":"블루","option_cnt":null,"option_price":"0","image_url":"http://localhost:8008/pdata/optiondata/20220329031038737067.jpg"},{"poid":"30","cate":"컬러","option_name":"블랙","option_cnt":null,"option_price":"0","image_url":"http://localhost:8008/pdata/optiondata/20220329031038104695.gif"}],"wms":[{"wcode":"29","cnt":"100"},{"wcode":"30","cnt":"100"}]}
        ]';

    $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);

   
?>

3가지 데이터를 전송한다. 옵션이 없는거, 옵션분류가 한개인거, 옵션분류가 2개인거 그리고 재고도 각각 구분해서 만들었다. 자 이데이터를 받아서 디비에 입력해주는 api를 만들어보자.

 

/api/v1/putter/putter.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){

        $sale_cnt = 0;//판매량
        $query="INSERT INTO products
        (name, cate, content, thumbnail, price, sale_price, sale_ratio, cnt, sale_cnt, isnew, isbest, isrecom, ismain, locate, userid, sale_end_date, reg_date, delivery_fee)
        VALUES('".$ds['name']."'
        , '".$ds['cate']."'
        , '".$ds['content']."'
        , '".$ds['thumbnail']."'
        , '".$ds['price']."'
        , '".$ds['sale_price']."'
        , '".$ds['sale_ratio']."'
        , ".$ds['cnt']."
        , ".$ds['sale_cnt']."
        , '".$ds['isnew']."'
        , '".$ds['isbest']."'
        , '".$ds['isrecom']."'
        , '".$ds['ismain']."'
        , '".$ds['locate']."'
        , 'API'
        , '".$ds['sale_end_date']."'
        , now()
        , '".$ds['delivery_fee']."'
        )";

        $rs=$mysqli->query($query) or die($mysqli->error);
        $pid = $mysqli -> insert_id;

        if(count($ds['product_images'])>0){
            foreach($ds['product_images'] as $p){
                $insquery="INSERT INTO product_image_table
                (pid, userid, filename) VALUES(".$pid.", 'api', '".$p."')";
                $fs=$mysqli->query($insquery) or die($mysqli->error);
            }
        }

        //옵션부분
        $ws = array();
        if(count($ds['product_options'])>0){
            foreach($ds['product_options'] as $s){
                $insquery="INSERT INTO product_options
                (pid, cate, option_name, option_price, image_url, status)
                VALUES(".$pid.", '".$s['cate']."', '".$s['option_name']."', '".$s['option_price']."', '".$s['image_url']."', 1)";
                $fs=$mysqli->query($insquery) or die($mysqli->error);
                $poid = $mysqli -> insert_id;
                if($s['poid']){
                    $ws[$s['poid']] = $poid;
                }
            }
        }

        //wms
        if(count($ds['wms'])>0){
            foreach($ds['wms'] as $w){
                if($w['wcode']){
                    $code = explode("_",$w['wcode']);
                    $xcode = $ws[$code[0]];
                    if($code[1])$xcode.="_".$ws[$code[1]];
                }else{
                    $xcode = '';
                }
                $insquery="INSERT INTO wms
                (pid, wcode, cnt)
                VALUES(".$pid.", '".$xcode."', ".$w['cnt'].")";
                $fs=$mysqli->query($insquery) or die($mysqli->error);
            }
        }

       
       

        $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));
?>

이렇게 해주면 된다.

 

 

json데이터를 받아서 배열로 변환한 뒤 배열값을 받아서 각각의 테이블에 입력해주었다. 테이블을 확인해 데이터들이 모두 잘 들어갔는지 확인해보자.

 

이렇게 api를 만든 후 postman같은 프로그램을 설치해서 확인해볼수도 있다. 참고로 알아두길 바란다.

 

이렇게 제품을 등록하는것까지 알아보았다. 다음엔 쇼핑몰의 가장 큰 이슈이고 개발자들의 가장 큰 적인 쿠폰에 대해 알아보도록 하자.

 

api는 대부분 데이터를 주고 받을때 json 형식을 따른다. 아주 예전엔 xml도 썼었는데 요즘은 쓰는데를 거의 못봤다. php가 json에 좀 약하긴 한데 배열로 만들어서 json으로 바꿔주고 json을 배열로 만들어서 데이터를 주물러야한다.

 

배열에 대해 잘 공부해두자.

 

 

 

 

 

반응형

+ Recent posts