본 포스트는 네이버페이 연동하면서 진행했던 내용을 중심으로 정리하고자 한다.
다음과 같은 XML 데이터를 생성해서 응답하는 기능을 구현 한다고 가정해 보자.
<response>
<item id="xxx">
<name><![CDATA[ 상품명 ]]></name>
<url>http://xxx.xxx.com/mainNew/.../xxx.php</url>
<description><![CDATA[...상세설명...]]></description>
<image>
http://xxx.xxx.com/xxx_file/xxx.jpg
</image>
<thumb>
http://xxx.xxx.com/xxx_file/xxx.jpg
</thumb>
<price>27000</price>
<quantity>100</quantity>
<category>
<first id="xxx">대분류</first>
<second id="xxx">중분류</second>
<third id="">소분류</third>
</category>
</item>
</response>
이때 주의해야 할 사항 및 요령은
① 엘리먼트 값으로 한글이 들어가야 하는 부분에 대해 character encoding 처리를 잘 해줘야 한다.
위의 경우는 name, description 엘리먼트에 한글 값이 설정되는 부분이다. 그리고 통상적으로 XML를 생성할 때 XML의 엘리먼트에 들어갈 값은 DB로부터 획득해서 설정하게 될 것이다. 이때 DB에 저장된 한글 데이터가 EUC-KR인지 UTF-8인지 잘 분별해서 엘리먼트에 값이 들어가도록 해야한다. 만일 DB에 저장된 데이터가 EUC-KR인데 XML 생성은 UTF-8로 한다면 다음과 같이 처리해야 한다. 그렇지 않으면 XML 생성시 Encoding error라는 XML parsing 에러가 발생되고 XML이 생성되지 않는다.
$nameFromDB = "여기에 DB로부터 가져온 name의 값이 들어있다고 하면";
$name = iconv("EUC-KR", "UTF-8", $nameFromDB);
$nameFromDB에 있는 EUC-KR 타입의 한글을 UTF-8로 변경해서 $name에 저장한다.
$descriptionFromDB = "여기에 DB로부터 가져온 description의 값이 들어있다고 하면";
$description = iconv("EUC-KR", "UTF-8", $descriptionFromDB);
② http url 정보가 들어가야 하는 엘리먼트에서(위의 경우 url, image, thumb) http url에 &가 포함되어 있을 경우 &라는 특수문자는 &문자 자체로 인식되지 않고 특수한 기능을 하는 문자로 취급되기 때문에 EntityRef: expecting ';'라는 에러 발생한다. 예를들어서 다음과 같은 경우이다.
http://xxx.xxx.com?id=1234&tid=3456
이를 경우 str_replace()함수를 이용해서 &를 &로 바꿔줘야 한다.
$itemUrl = str_replace("&", "&", $원본데이터);
③ XML을 생성중 다음과 같은 에러가 발생했다면 왜, 어디서, 어떤 이유때문에 에러가 발생했는지를 쉽게 파악할 수 있는 방법이 있다.
This page contains the following errors:
error on line 4 at column 19: xmlParseEntityRef: no name
Below is a rendering of the page up to the first error.
이 경우 웹 브라우저의 해당 페이지에서 마우스 우측 클릭하여 "페이지 소스 보기"(크롬의 경우)를 하면 아래와 같은 내용이 표시되는 4번 라인에서 url 엘리먼트에 특수문자들이 들어가 있다(아래의 경우는 에러를 의도적으로 발생시키기 위해 이 값들을 넣은 경우이다). 이를 경우 urlencode() 함수 등으로 특수 문자들을 변환해줘야 한다.
<?xml version="1.0" encoding="euc-kr"?><response>
<item id="itemid">
<name><![CDATA[상품 명]]></name>
<url>http://"/:@&%=?.#"#$%=+/test.html</url>
<description><![CDATA[간지나는 아이템]]></description>
<image>http://localhost/test.jpg</image>
<thumb>http://localhost/test.jpg</thumb>
<price>1000</price>
<quantity>1</quantity>
<category>
<first id="MJ01">대분류</first>
<second id="ML01">중분류</second>
<third id="MN01">소분류</third>
</category>
</item>
</response>
이제 본격적으로 PHP로 위의 예시와 같은 XML을 생성하는 코드를 작성해 보자.
<?php
header('Content-Type: application/xml;charset=utf-8');
echo ('<?xml version="1.0" encoding="utf-8"?>');
?>
<response>
<?php
$dbData = "위의 XML예시에서 XML에 들어갈 item 요소가 여러개 일 경우의 데이터";
//아래와 같이 반복문을 통해 위의 예시의 XML에서 복수개의 item 항목을 가진 XML을 만들고자 할 경우
for($i=0; $i<count($dbData); $i++) {
$price = "DB로부터 가져온 가격 데이터";
$quantity = 50;
$itemUrl = "http://xxx.xxx.com/...";
$imgUrl = "http://xxx.xxx.com/...";
$nameFromDB = "여기에 DB로부터 가져온 name의 값이 들어있다고 하면";
$name = iconv("EUC-KR", "UTF-8", $nameFromDB);
$descriptionFromDB = "여기에 DB로부터 가져온 description의 값이 들어있다고 하면";
$description = iconv("EUC-KR", "UTF-8", $descriptionFromDB);
?>
<item id="<?=$id?>">
<name><![CDATA[<?=$name?>]]></name>
<url><?=$itemUrl?></url>
<description><![CDATA[<?=$description?>]]></description>
<image><?=$imgUrl?></image>
<thumb><?=$imgUrl?></thumb>
<price><?=$price?></price>
<quantity><?=$quantity?></quantity>
<category>
<first id="<?=$product[0][bdr_category_code1]?>">대분류</first>
<second id="<?=$product[0][bdr_category_code2]?>">중분류</second>
<third id="<?=$product[0][bdr_category_code3]?>">소분류</third>
</category>
</item>
<?php
} //for
//end while;
echo('</response>');
?>
이렇게 하면 PHP에서 간단하게(?) XML을 생성해서 클라이언트들의 request에 응답할 수 있다.
이상의 내용은 네이버페이 연동 개발을 하면서 진행했던 내용이었다.
'PHP' 카테고리의 다른 글
MySQL DB dump가 복구되지 않을때 (0) | 2020.03.12 |
---|---|
PHP에서 console.log()와 alert()으로 출력하기 (0) | 2020.03.12 |
웹 페이지에서 테이블(table)의 짝수 행의 색상을 다른 색으로 표시하기 (0) | 2018.06.19 |
PHP에서 strtotime 함수와 date 함수를 이용한 타임스탬프 변환하기 (0) | 2018.06.19 |
PHP에서 2차원 배열의 내용을 출력하는 편리한 방법 (0) | 2016.04.01 |