이번엔 푸터를 만들어보자. 다른 업체에서 우리가 만든 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을 배열로 만들어서 데이터를 주물러야한다.
배열에 대해 잘 공부해두자.