이걸 검색 하는 분들은, 이게 왜 필요한지도 아실거라 생각한다.

그리고 정리하긴 항상 귀찮으니 대충 알 수 있을 정도로만 정리하려 한다.


[중요한 부분]

구글 영수증 검증을 위해서는 Access Token 이라는 것이 필요하다.

그런데 이 Access Token은 유효기간이 있다.! (1시간정도)

간이 지나면 현재 Access Token으로는 검증을 할 수 없기 때문에,

이를 교체 해야 한다. 그래서 필요한 것이 Refresh Token 이다.


아래 내용은 Refresh Token 을 얻는 방법 부터 시작된다.



[구글 영수증 검증을 위해서는]


1. 구글 개발자 콘솔의 권한이 필요하다.

  (https://console.developers.google.com/apis)


2. 프로젝트를 선택한다 ( 프로젝트가 없다면 새프로젝트를 생성한다)


3. 사용자 인증정보를 만듭니다.

    oAuth 클라이언트 ID 를 선택해야 한다.


  



4. 우리는 웹으로 검증프로세스를 진행할 것이기 때문에, 웹 어플리케이션으로 만든다.


5. 만드는 과정에서 보면 승인된 리디렉션 URI 를 입력해야 한다. 

   구글에 RefreshToken 발급 요청 시 이곳에 기록한 URL로 연결이 되기 때문에 반드시 접속 가능한 주소를 입력한다.


6. 생성을 완료하고 생성한 정보를 누르면 아래와 같이 ID와 보안코드가 발급된다. (이것도 중요함!)


7. API 및 서비스 사용설정을 누르고 Google Play Android Developer API 로 가서 사용설정을 누른다.


8. RefreshToken 발급을 위해서 특정 Code를 발급받아야 한다. 이 과정은 아래의 URL을 사용자 설정에 맞게 수정 후 웹브라우저로 접속한다.


${client_id} = 6번의  client ID

${redirect_url} = 6번에서 등록한 접속 가능한 RedirectUrl


[요청 URL]

https://accounts.google.com/o/oauth2/auth?
scope=https://www.googleapis.com/auth/androidpublisher
&response_type=code
&state=test
&access_type=offline
&client_id=${client_id}
&redirect_uri=${redirect_url}
&approval_prompt=force


위 URL을 복사해 가더라도 편의상 보기 편하기 위해 해논 개행은 꼭 다 붙이고 진행하길 바란다


위 URL 로 접속하면 이제 get 파라미터로 code가 전달 된다.

이 code를 꼭 기억하도록 한다. RefreshToken 을 획득하기 위해 꼭 필요하다.


9. access token 과 refresh token 획득을 위해 다음 url 에 요청한다

   (필자는 curl을 통해 호출했다)




$fParam = array(

'code' => ${client_code}, // 8 에서 발급받은 code

'client_id' => ${client_id}, // 8 에서 사용한 google client id

'client_secret' => ${client_secret}, // 8 에서 사용한 google client secret

'redirect_uri' => ${return url}, // 8 에서 사용한 google return url

'grant_type' => 'authorization_code',

);


token 발급을 위한 요청  url  은 아래와 같다.


$ch = curl_init();

curl_setopt( $ch, CURLOPT_URL, 'https://accounts.google.com/o/oauth2/token' );

curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded') );

curl_setopt( $ch, CURLOPT_HEADER, 0 )

curl_setopt( $ch, CURLOPT_POST, TRUE )

curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query($fParam) )

curl_setopt( $ch, CURLOPT_TIMEOUT, 300 )

curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );

curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );


$result = curl_exec( $ch );

if ( $result === FALSE ) {

die( 'Curl failed: ' . curl_error( $ch ) );

}


curl_close( $ch );

return json_decode( $result );


위 코드를 작성한 URL 에 접속하면 요청이  잘 내려온다

아래와 같은 형식으로


stdClassObject ( 

[access_token] => user_accessToken

[expires_in]=>3600

[refresh_token]=>user_refreshToken

[scope] => https://www.googleapis.com/auth/androidpublisher 

[token_type] => Bearer 

)


원하는 Access Token 과 RefreshToken 이 니왔다.


자세히 보면 expires_in 3600 이라는게 있는데, 이게 Access Token 의 유효시간이다.

저 배열을 그대로 DB 에 담아두고 Refresh Token 을 이용해 Access Token 을 주기적으로 갱신해야 한다.


10. Refresh Token . 을 사용해 AccessToken 갱신하기


$fParam array(

'refresh_token' => ${refresh_token}, // 9 에서 발급받은 refresh tolen

'client_id' => ${client_id}, // 8 에서 사용한 google client id

'client_secret' => ${client_secret}, // 8 에서 사용한 google client secret

'grant_type' => 'refresh_token',

);



$ch curl_init();

curl_setopt$chCURLOPT_URL'https://accounts.google.com/o/oauth2/token' );

curl_setopt$chCURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded') );

curl_setopt$chCURLOPT_HEADER)

curl_setopt$chCURLOPT_POSTTRUE )

curl_setopt$chCURLOPT_POSTFIELDS, http_build_query($fParam) )

curl_setopt$chCURLOPT_TIMEOUT300 )

curl_setopt$chCURLOPT_RETURNTRANSFER);

curl_setopt$chCURLOPT_SSL_VERIFYHOST);

curl_setopt$chCURLOPT_SSL_VERIFYPEERFALSE );


$result curl_exec$ch );

if $result === FALSE ) {

die'Curl failed: ' curl_error$ch ) );

}


curl_close$ch );

return json_decode$result );


위와 같은 형식으로 던지면 9번의 결과와 같게 json 타입으로 갱신된 Access Token이 넘어온다.

이 항목은 Access Token Expire 되기 전에 주기적으로 갱신해야 한다.



여기까지가 영수증 검증을 위한 준비 단계 이다. 휴 힘들었다.


11. 마지막, 영수증 상태 검증


영수증 검증을 위해 아래 URL 을 호출한다.


${PackageName} : 앱 패키지 이름

${ProductID} : 인앱 구매 상품의 제품코드

${PuchaseToken} : 결제 후 내려오는 영수증 번호

${access_token} : 10번을 통해 갱신되는  access token


https://www.googleapis.com/androidpublisher/v1.1/applications/${PackageName}/inapp/${ProductID}/purchases/${PuchaseToken}?access_token=${access_token}


위 URL 을 file_get_content 등을 통해 호출하면 json type 으로 리턴값이 온다.


결과의 purchaseState 의 값이 0 일 경우 정상적인 영수증이다.


이 정도면.. 되지않을까...?




'기억할것들 > PHP' 카테고리의 다른 글

php-oracle 연동  (0) 2020.02.24
centos7 php-7 mssql 연결  (0) 2019.12.10
[CSS] 로 문자열 줄임 처리하기  (0) 2018.08.29
php 7.2.8 소스 설치  (0) 2018.08.13

+ Recent posts