이걸 검색 하는 분들은, 이게 왜 필요한지도 아실거라 생각한다.
그리고 정리하긴 항상 귀찮으니 대충 알 수 있을 정도로만 정리하려 한다.
[중요한 부분]
구글 영수증 검증을 위해서는 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( $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 );
위와 같은 형식으로 던지면 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 |