본문 바로가기

Server/PHP

[PHP] curl https POST 사용

하 오랜만에 또 기록...

curl 자체는 사용이 어렵지가 않은데 (인터넷에 정보가 많이많이 돌아다니니까) 지금까지 http 경로만 사용하다가 https로 호출 주소가 변경되면서 ssl 인증서 문제부터 시작해서 한 스텝 스텝 안 막히는데가 없더라.

아무튼 정리.

우선 php7 기준 curl 사용법

1. php가 설치된 폴더에 들어가서 (나는 apm으로 설치해서 apm_setup/server/php7) php.ini 파일을 찾는다.

2. 파일 내 extension=curl (php5는 extension=php_curl.dll 인듯) 주석 제거하고 저장 후 아파치 재시작 (다른 과정도 있다는 듯 하지만 _ ubuntu는 sudo로 install 한다던지.. 일단 난 안했음)

3. 다 하고 서버에서 curl이 돌아가고 있는지 확인하려면 뭐 서버 phpinfo페이지 참고할 수도 있지만 콘솔로 서버 폴더로 이동해서(php폴더 말고) php -m 커멘드 입력 시 현재 구동중인 modules 리스트를 볼 수 있음

그리고 curl로 https 호출하기 + post사용

$ch = curl_init();		// curl 객체 생성
curl_setopt($ch, CURLOPT_URL, $url);	// 호출할 url
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// *https 접속을 위해 ssl 인증여부를 꺼주는 것 같다.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// *POST 등록
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);

$result = curl_exec($ch);
echo $result;

아래는 * 표시된 주석 설명

1. https 접속을 위해 인증서를 꺼줄 때 그 전에 다른 서버에서는 CURLOPT_SSL_VERIFYPEER 만 써도 됐었는데 아무래도 안돼서 이래저래 해보니 CURLOPT_SSL_VERIFYHOST 도 옵션에 추가해줘야 한다.

2. 근데 CURLOPT_SSL_VERIFYHOST 값은 0, 1 같은 value를 이제 인식하지 않아서(?) 반드시 boolean 값으로 설정해줘야 함. 이것때문에 뻘짓 좀 했다.

3. POST 옵션이나 paramater 전송은 기존 방식 그대로 사용했는데 아무래도 POST 전송이 안되더라. 진짜 이걸로 뻘짓 엄청함. 결론은 CURLOPT_USERAGENT 옵션을 추가해줘야 했음.

4. 종종 paramater 전달이 안될때가 있는데 그럴땐 CURLOPT_POSTFIELDS 옵션 값을 http_build_query로 한번 돌려주면 된다. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param) ) 형태.

추가로, 나는 페이지를 표시하기 위해서가 아니라 해당 api를 호출해서 값을 받아오려고 했는데, 값이 넘어오질 않고 post로 호출하지를 않으니 페이지가 출력돼서 겪은 문제. 아무튼 어떻게 해결했으니 됐다.

늘 하고 나면 약간 허망해지는 경우가 90%인 것 같아서 슬픔.

오랜만에 메모해두는데 티스토리 템플릿 왜이러지