개발 Q&A

제목 session 관련 질문입니다.
글쓴이 손씨가문 작성시각 2016/09/01 17:13:09
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 22368   RSS

결제하는 부분 거의 끝에까지 다왔네요...하지만 한가지 문제가 발생합니다.

쿠키가 삭제 된 후

로그인 -> 결제 진행 -> 정상 진행

-> 다시 진행 -> 세션이 달라서 오류 발생

 

세션이 계속 바뀌네요. 어디쪽 문제인지 감이 안잡힙니다....

 

$config['sess_cookie_name']        = 'ci_session';

$config['sess_expiration']        = 28800;

$config['sess_expire_on_close']    = FALSE;

$config['sess_encrypt_cookie']    = FALSE;

$config['sess_use_database']    = FALSE;

$config['sess_table_name']        = 'ci_sessions';

$config['sess_match_ip']        = FALSE;

$config['sess_match_useragent']    = false;

$config['sess_time_to_update']    = 300;

 

설정값은 이렇게 되어있습니다. 일부러 시간을 늘렸는데도, 계속 바뀌네요. 세션을 고정으로 안바뀌게 하는 방법에는 어떤 것이 있을까요...

어렵네요...

 

 

 

 

 다음글 session 관련 재질문드립니다. (1)
 이전글 local server 에서 aws 로 옮기고 나서 화... (1)

댓글

kaido / 2016/09/02 08:42:57 / 추천 0
혹시 그 세션이 달라 진다는 것이 pg 사에서 리턴해 줄때 말인가요?
손씨가문 / 2016/09/02 09:24:43 / 추천 0

네 맞습니다.

    $payReqMap['CST_PLATFORM']           = $CST_PLATFORM;                // 테스트, 서비스 구분
    $payReqMap['LGD_WINDOW_TYPE']        = $LGD_WINDOW_TYPE;            // 수정불가
    $payReqMap['CST_MID']                = $CST_MID;                    // 상점아이디
    $payReqMap['LGD_MID']                = $LGD_MID;                    // 상점아이디
    $payReqMap['LGD_OID']                = $LGD_OID;                    // 주문번호
    $payReqMap['LGD_BUYER']              = $LGD_BUYER;                    // 구매자
    $payReqMap['LGD_PRODUCTINFO']        = $LGD_PRODUCTINFO;            // 상품정보
    $payReqMap['LGD_AMOUNT']             = $LGD_AMOUNT;                    // 결제금액
    $payReqMap['LGD_BUYEREMAIL']         = $LGD_BUYEREMAIL;                // 구매자 이메일
    $payReqMap['LGD_CUSTOM_SKIN']        = $LGD_CUSTOM_SKIN;            // 결제창 SKIN
    $payReqMap['LGD_CUSTOM_PROCESSTYPE'] = $LGD_CUSTOM_PROCESSTYPE;        // 트랜잭션 처리방식
    $payReqMap['LGD_TIMESTAMP']          = $LGD_TIMESTAMP;                // 타임스탬프
    $payReqMap['LGD_HASHDATA']           = $LGD_HASHDATA;                // MD5 해쉬암호값
    $payReqMap['LGD_RETURNURL']            = $LGD_RETURNURL;                // 응답수신페이지
    $payReqMap['LGD_VERSION']              = "PHP_Non-ActiveX_Standard";    // 버전정보 (삭제하지 마세요)
    $payReqMap['LGD_CUSTOM_USABLEPAY']      = $LGD_CUSTOM_USABLEPAY;    // 디폴트 결제수단
    $payReqMap['LGD_CUSTOM_SWITCHINGTYPE']  = $LGD_CUSTOM_SWITCHINGTYPE;// 신용카드 카드사 인증 페이지 연동 방식
    $payReqMap['LGD_OSTYPE_CHECK']          = $LGD_OSTYPE_CHECK;        // 값 P: XPay 실행(PC용 결제 모듈), PC, 모바일 에서 선택적으로 결제가능 
    //$payReqMap['LGD_ACTIVEXYN']            = $LGD_ACTIVEXYN;            // 계좌이체 결제시 사용,ActiveX 사용 여부
    $payReqMap['LGD_WINDOW_VER']             = $LGD_WINDOW_VER;

    
    // 가상계좌(무통장) 결제연동을 하시는 경우  할당/입금 결과를 통보받기 위해 반드시 LGD_CASNOTEURL 정보를 LG 유플러스에 전송해야 합니다 .
    $payReqMap['LGD_CASNOTEURL'] = $LGD_CASNOTEURL;               // 가상계좌 NOTEURL

    //Return URL에서 인증 결과 수신 시 셋팅될 파라미터 입니다.*/
    $payReqMap['LGD_RESPCODE']           = "";
    $payReqMap['LGD_RESPMSG']            = "";
    $payReqMap['LGD_PAYKEY']             = "";

    $_SESSION['PAYREQ_MAP'] = $payReqMap;

이렇게 MD5 해쉬 암호화 한 상태로 나중에 밑에 returnurl.php에서 있는지 확인할때 

  if(!isset($_SESSION['PAYREQ_MAP'])){
      echo "session : fail";
      return;
  }

값이 안들어오네요.

그래서 양쪽 php 첫부분에 echo 'SS_ID : '.session_id();

이걸 넣었는데 서로 세션이 다른데, 이 문제가 아닌가 하구요. 

kaido / 2016/09/02 09:44:05 / 추천 0

제가 우려했던 부분이네요.

일단 '당연히 세션이 틀립니다.'

 

저도 똑같은 삽질을 경험했거든요.

 

이 문제는 아주 간단해요. 논리오류인거죠.

 

A가 세션을 만들고 PG사에 요청. PG사가 조건 체크 후에 리턴을 보냄. A는 세션에 받아와서 조건 비교해서 DB에 저장.

 

언뜻보면 맞아요. 그런데 잘 생각해 보세요. 세션 생성은 무엇을 기준으로 생성 되나요?

네! IP. 접속 컴퓨터를 기준으로 만듭니다.

즉 A의 세션으로 결제를 해도 리턴되는 값은 전혀 모르는 사람의 세션으로 값을 리턴해 주는 겁니다.

 

그러니 A의 세션에는 값이 비어있죠.

 

비동기식  pg 리턴은 분명 invoce 같은 값을 제공할 거에요. [결제 아이디 값. 혹은 구분 값.]

이니시스 웹표준 결제이나 페이팔같은 경우 이런 방식을 사용합니다.

애네들은 세션에 값을 저장 하는 로직이 아니라, 리턴 값을 DB에 저장해서 체크 하는 방식으로 구현 하셔야 합니다.

 

구축 메뉴얼 가이드에 나와 있을 거에요.

손씨가문 / 2016/09/02 10:34:38 / 추천 0

현재 말씀해주신것처럼 해당 값을 DB에 넣고 다시 불러와서 체크 방식으로 가려고 하는데, 오류가 발생합니다..

    $payReqMap['CST_PLATFORM']           = $CST_PLATFORM;                // 테스트, 서비스 구분
    $payReqMap['LGD_WINDOW_TYPE']        = $LGD_WINDOW_TYPE;            // 수정불가
    $payReqMap['CST_MID']                = $CST_MID;                    // 상점아이디
    $payReqMap['LGD_MID']                = $LGD_MID;                    // 상점아이디
    $payReqMap['LGD_OID']                = $LGD_OID;                    // 주문번호
    $payReqMap['LGD_BUYER']              = $LGD_BUYER;                    // 구매자
    $payReqMap['LGD_PRODUCTINFO']        = $LGD_PRODUCTINFO;            // 상품정보
    $payReqMap['LGD_AMOUNT']             = $LGD_AMOUNT;                    // 결제금액
    $payReqMap['LGD_BUYEREMAIL']         = $LGD_BUYEREMAIL;                // 구매자 이메일
    $payReqMap['LGD_CUSTOM_SKIN']        = $LGD_CUSTOM_SKIN;            // 결제창 SKIN
    $payReqMap['LGD_CUSTOM_PROCESSTYPE'] = $LGD_CUSTOM_PROCESSTYPE;        // 트랜잭션 처리방식
    $payReqMap['LGD_TIMESTAMP']          = $LGD_TIMESTAMP;                // 타임스탬프
    $payReqMap['LGD_HASHDATA']           = $LGD_HASHDATA;                // MD5 해쉬암호값
    $payReqMap['LGD_RETURNURL']            = $LGD_RETURNURL;                // 응답수신페이지
    $payReqMap['LGD_VERSION']              = "PHP_Non-ActiveX_Standard";    // 버전정보 (삭제하지 마세요)
    $payReqMap['LGD_CUSTOM_USABLEPAY']      = $LGD_CUSTOM_USABLEPAY;    // 디폴트 결제수단
    $payReqMap['LGD_CUSTOM_SWITCHINGTYPE']  = $LGD_CUSTOM_SWITCHINGTYPE;// 신용카드 카드사 인증 페이지 연동 방식
    $payReqMap['LGD_OSTYPE_CHECK']          = $LGD_OSTYPE_CHECK;        // 값 P: XPay 실행(PC용 결제 모듈), PC, 모바일 에서 선택적으로 결제가능 
    //$payReqMap['LGD_ACTIVEXYN']            = $LGD_ACTIVEXYN;            // 계좌이체 결제시 사용,ActiveX 사용 여부
    $payReqMap['LGD_WINDOW_VER']             = $LGD_WINDOW_VER;

    
    // 가상계좌(무통장) 결제연동을 하시는 경우  할당/입금 결과를 통보받기 위해 반드시 LGD_CASNOTEURL 정보를 LG 유플러스에 전송해야 합니다 .
    $payReqMap['LGD_CASNOTEURL'] = $LGD_CASNOTEURL;               // 가상계좌 NOTEURL

    //Return URL에서 인증 결과 수신 시 셋팅될 파라미터 입니다.*/
    $payReqMap['LGD_RESPCODE']           = "";
    $payReqMap['LGD_RESPMSG']            = "";
    $payReqMap['LGD_PAYKEY']             = "";

    
    $_SESSION['PAYREQ_MAP'] = $payReqMap;

    $dbc = mysqli_connect('localhost' , 'db이름' , 'db비밀번호')
         or die( mysqli_connect_error() );

    mysqli_select_db($dbc, '테이블명');

    $query = "update address_log set payReqMap=" .$_SESSION['PAYREQ_MAP']." where u_idx =". $row->u_idx.' order by idx desc limit 1';                         

    $result = mysqli_query($dbc,$query)
     or die( mysqli_error($dbc) );

    mysqli_close($dbc);

 

$_SESSION['PAYREQ_MAP']

 

이 값이 Array Unknown이 발생합니다...

Unknown column 'Array' in 'field list'

kaido / 2016/09/02 10:46:27 / 추천 0

쉽게 말씀드리자면

 $_SESSION['PAYREQ_MAP']   여기에 값을 넣지 말라는 겁니다.

 

이 세션 값은 사용 할 수 없습니다. 

$payReqMap 을 호출 한 영역은 pg 사 리턴을 받은 페이지로 보이는데, 이 페이지의 세션은 전혀 다른 세션이 만들어 진다는 의미입니다. db에 저장 하고 계시니 한번 db session data 전부 지우고 플로우대로 진행 시켜보세요. 분명 1개 더 생성 될 겁니다.

 

LGU+ 측에서 제시하는 가이드가 있을 겁니다.

없으면 샘플 테스트 소스라도 달라고 요청해 보세요.

개발팀에 직접 클레임 걸면 어디든 다 주더군요.

 

이전에 이니시스 애들이 하도 이상한 소릴 해대싸서 계속 클레임 거니 자체 테스트용 소스 넘겨주더군요 ㅋㅋ

 

아무튼 다시 차분히 생각 해보세요. 논리적 모순이 보이실 것입니다.

kaido / 2016/09/02 11:02:04 / 추천 1

아 혹시 세션라이브러리를 사용 하시면서 $_SESSION 사용 하고 계시다면 세션이 다를 수 있습니다.

CI 세션은 네이티브 PHP $_SESSION 세션을 사용하지 않습니다. 3.x 이하 버전.

 

4.x 버전부터 다시 네이티브 세션 사용 합니다.

 

한번 눈여겨 봐주세요.

http://www.ciboard.co.kr/user_guide/kr/libraries/sessions.html