취업/PHP

[PHP] PG 결제 도중 끊어진 세션 다시 살리기.

카슈밀 2023. 3. 3. 23:12
반응형

처음부터 말한다.

중원에 진짜 쌉고수는 넘쳐난다. 이거 문서보고 박수쳤다. 와~

 

하....이걸 해결하는데 몇시간동안 삽질했다.

PG사 결제시 세션이 날라가는 문제가 있는데, 이걸 살리는 용자들이 있더라.

와... 지금도 박수만 나옴.

 

증상 : PG사 결제시 간혹 정상적으로 결제가 되는데, 안그러기도 한다.

이유 : chrome 80 SameSite cookie CORS 보안 변경사항.

타 도메인에서 iframeFORM POST 등을 통해 넘어올 때 secure; SameSite=None 으로 세팅되지 않은 쿠키값을 브라우저가 서버로 전달하지 않습니다.

PG 결제시 처럼 '갔다 오는' 상황에서는 살려주기도 하는 듯 한데, 조금만 지체되어도 안살아나는 등 살려주는 명확한 조건을 모르겠습니다.

이게 문제다. 갔다오는데 간혹 살려주기도 안그러기도 하는 것.(문제발생을 모르고 있던 이유였다)

회사에서 결제 동적값들을 모두 session에 저장하는데, 해당 값이 PG사로 이동후 다시 돌아올때 세션 연결이 안되고 새로 세션이 시작 되는 게 문제였다.

간헐적인 문제다보니 해결이 너무나도 어려웠고, 문제파악이 빡쎘다.

증상 파악이 안되고 있다가 실제 결제 API 호출시 에러가 터지는 문제가 있어서 알게 됨.

 

해당 문제를 위해 어떻게 해결해야하나 API써야하나 생각도 했는데, API를 쓰기위해서 알 수 있는 값이 아예 없었다.

세션이 다 끊기고, PG사에서 주는 값을 커스텀하기는 어려우니까.. ㅠ

허미~방법이 없어 엄청 어렵네 하고 있었고, 멘탈 깨졌었는데 세션을 다시 살리는 방법으로 이걸 해결한 쌉고수들이 있더라.

 

본문 내용

https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=82446 

 

WWW.PHPSCHOOL.COM

개발자 커뮤니티 1위 PHPSCHOOL.COM 입니다.

www.phpschool.com

https://xeno.work/samesite.html

 

chrome 80 SameSite cookie CORS 보안 변경사항 php 대응

SameSite 옵션이 없는 php 7.3 미만에서 이용할 대체함수입니다.

xeno.work

이중에 어려워서 잘 모르겠고, 예시코드가 없어 진행이 어려웠다.

그렇기에 난 Form으로 redirect로 진행하는 방법을 적용했다.

그냥 session_start는 무조건 넣어주고, 그 이전에 해당 방법을 위에서 넣어주기만 하면된다.

class XenoPostToForm
{
	public static function check() {
		return !isset($_COOKIE['PHPSESSID']) && count($_POST) && isset($_SERVER['HTTP_REFERER']) && !preg_match('~^https://'.preg_quote($_SERVER['HTTP_HOST'], '~').'/~', $_SERVER['HTTP_REFERER']);
	}

	public static function submit($posts) {
		echo '<html><head><meta charset="UTF-8"></head><body>';
		echo '<form id="f" name="f" method="post">';
		echo self::makeInputArray($posts);
		echo '</form>';
		echo '<script>';
				echo 'document.f.submit();';
				echo '</script></body></html>';
		exit;
	}

	public static function makeInputArray($posts) {
		$res = [];
		foreach($posts as $k => $v) {
			$res[] = self::makeInputArray_($k, $v);
		}
		return implode('', $res);
	}

	private static function makeInputArray_($k, $v) {
		if(is_array($v)) {
			$res = [];
			foreach($v as $i => $j) {
				$res[] = self::makeInputArray_($k.'['.htmlspecialchars($i).']', $j);
			}
			return implode('', $res);
		}
		return '<input type="hidden" name="'.$k.'" value="'.htmlspecialchars($v).'" />';
	}
}

if(XenoPostToForm::check()) XenoPostToForm::submit($_POST); // session_start(); 하기 전에

이거보면서 중원에 미친실력의 쌉고수들은 널려있구나 싶었다.

근데, 난 왜 쪼렙이지 ㅠㅠㅠ

728x90