결제모듈 붙이는 작업때문에 그간 고생한걸 생각하면..-,.-... 3분간 묵념을....
음음.. 각설하고 검색을 해봐도 한글로 참고할만한 글이 없어서 정리할겸 기록함..
포인트는 데이터의 흐름을 파악하는거다.
결제를 요청할때 어떤 함수를 호출해야 하고.. 결제가 완료되면 어떤 함수가 호출되고 이런것들
사실 Prime31가져다 쓰기 전에 구글에서 제공하는 결제API를 가져다 쓰기위해 샘플을 가져와서 디벼봤지만..
이건 언어는 자바가 맞는거 같은데 자바처럼 안보이는 그런느낌이랄까-_-;;
유니티로 개발하면서 네이티브 코드를 안만질수가 없다는 걸 다시한번 새삼 느끼는 계기가 된 거 같음..
원래는 Prime31을 알고는 있었지만 구매문제보다는 검색해봤을때 뭔가 사용에 문제가 있는거 같아서 사용을 안하다가 한 강사분께서 현업에서도 많이 쓰이는 에셋이라 하시길래 바로 구매후 사용해본 결과..
안드로이드를 모르는 사람이라 하더라도 엄청 쉽게 구글플레이 결제모듈 붙이는데 가능할것 같다.
자 그럼 시작해보자.
※ 구글인앱빌링 v3 버젼이 적용된 Prime31임을 참고.
※ Prime31을 임포트시킨후 빌드하여 구글 개발자 콘솔에서 apk를 업로드하면 Prime31의 구조상 플러그인안에 있는 매니페스트에서 안드로이드 접근 권한에 결제와 관련된 권한이 부여되어 있기 때문에 인앱상품 등록이 가능하다. 이는 따로 설명하지 않아도 검색하면 많이 있음. 기본적으로 인앱상품 등록이 가능하고, 구글개발자콘솔에서 하나 이상의 결제 테스트 계정이 있다고 가정하고 설명함을 참고.
1. 우선 필요한 것은 Prime31을 구매하는 것.. 구매후 임포트시키면 아래와 같이 구성된다.
2. 저기서 나에게 필요한 것은 demo 폴더안에 GoogleIABEventListener.cs 파일. 에셋의 특성상 소스 자체를 올리진 못하겠고 함수만 설명!
※ 먼저 결제 프로세스를 알아야하는데.. 일반적으로 구글플레이에서의 관리되지 않는 품목.. 즉 여러번 구매가 가능한 코인, 물약 같은 인앱상품의 경우 사용자가 결제를 하면 구입이 되고 이후 이를 소비를 시켜줘야 한다. 그렇지 않으면 한번 구매한 이후 해당 상품을 구매할 수 가 없다.
- OnEnable()과 OnDisable()의 특징은 따로 설명하진 않겠음.. 검색하면 무수히 많은 정보가 있으니..ㅇ_ㅇ
- billingSupportedEvent() : 결제를 진행할때 결제와 관련된 씬에 진입시 가장 처음에 초기화를 할텐데..(이 초기화 작업이 정확하게 왜 필요한지.. 하지 않을 경우 발생되는 일이야 추측은 가능하지만 디테일한 부분에 있어서 정확히 이해는 못했음 ㅠㅠ) 그 초기화가 완료된 이후 호출되는 함수다. 따라서 그에 따르는 처리를해야한다면 이 함수내에서 처리하면 될 거다.
- billingNotSupportedEvent() : 이 함수명을 보면 알겠지만 위의 함수와는 반대의 이미다.. 초기화 실패시 호출된다.
- queryInventorySucceededEvent(), queryInventoryFailedEvent() : 개인적으로 쿼리는 DB에서만 만나본 개념이라-_-;;; 뭐 소비되지 않은 구입목록을 불러온 결과에 따라 자동 호출되는 개념으로 이해할 수 있을것 같다..
- purchaseCompleteAwaitingVerificationEvent() : 아이템을 구매한 이후 호출되는 함수다. 매개변수로 구입과 관련된 데이터와 서명(?)을 string 형식으로 받는데 이와 비슷한 다른 함수를 사용할 것이므로 일단 이 함수는 제껴두기로 ...(지금 함수명을 다시보니 인증과 관련되어 추가적인 액션이 가능한 것 같다.. 일단 쉽게쉽게 가기위해 패스하지만 결제인증과 관련된 부분이 있다면 다시 파고들 부분이다.)
- purchaseSucceededEvent() : 이 함수는 위의 함수와 동일하게 아이템을 구매한 이후 성공적으로 구매되었을 경우 호출되는 함수로 결제정보를 매개변수로 받는다. 이 결제정보엔 제품아이디, 영수증번호와 같은 정보가 있다.
- purchaseFailedEvent() : 함수명 보면 눈치 까야함..
- consumePurchaseSucceededEvent() : 소비형 아이템을 구매했다면 아이템을 구매한 다음 소비를 시켜야 하는데 이 소비가 성공적으로 되었다면 호출되는 함수로 만약 골드를 증가시켜줘야 한다 뭐 이런 아이템이라면 이 함수내에서 처리하면 되겠다.. 매개변수로 결제정보를 받는데, 이 결제정보안에 제품id가 있으므로 이 id를 비교해서 처리하면 되겠다..
- consumePurchaseFailedEvent() : 이거 역시 함수명으로 설명끝..
3. 위에서 설명한 GoogleIABEventListener.cs파일의 내용이 중요하므로 그 파일 그대로 가져다 써도 되고 파일의 내용을 복사해서 별도의 cs파일로 생성해도 된다. 여기선 별도의 파일로 뺀다.. 그냥 이건 내 성격상..ㄱ-;;; 위의 파일의 내용과 100%동일하게 BillingEventListener.cs라는 파일로 대체하였음..
4. BillingEventListener.cs를 결제와 관련된 씬에 빈 게임오브젝트를 만들고 BillingEventListener.cs 을 attach. (이 역시 결제와 관련된 씬 하이라키 내에 만드는 것은 기본..)
5. 결제와 관련된 씬을 로비라고 가정하고 설명한다면 로비 진입시 Start() 하나에서 결제를 초기화 시키는 작업을 해야한다.
내 경우는 결제와 관련된 액션은 BillingEventListener 라는 게임오브젝트에서 전부 관리할 거라 아까 만들었던 BillingEventListener.cs에 Start() 함수를 만들고 초기화 작업을 했음.
초기화 작업은 GoogleIAB.init(publicKey)를 호출하면 되는데 여기서 publicKey는 구글 앱 상품관리 페이지에서 라이센스키를 의미함.
6. 초기화 작업이 정상적으로 되었을 경우 호출되는 함수에서 이를 판별해서 결제를 진행시키거나 결제를 막거나 혹은 게임을 종료시켜서 다시 시도하게 하거나 .. 이런 액션을 유도해야 하겠다..
7. 해당 작업이 완료되면 이제 실제 결제를 요청해볼 차례. 개발자 콘솔에서 인앱상품을 등록했다면 해당 페이지에서 상품번호를 사용해 아래와 같이 요청. (상품번호가 "0001" 이라고 가정)
GoogleIAB.productPurchase("0001");
8. 그럼 구글플레이 결제 프로세스가 진행되고, 결제완료시 purchaseSucceededEvent() 함수호출되는 것을 이용하여 아래와 같이 해당 아이템을 바로 소비시켜줘야한다.
GoogleIAB.consumeProduct("0001");
9. 소비 완료가 되면 그때 소비된 이후 프로세스를 각자 처리하면 되겠다..
사실 좀 더 정리하려고했는데 일단 이정도라도 이해가 가능할 정도라서.. 작업완료 후 결제인증과 관련된 추가적인 처리를 하고 나서 다시 업데이트를 하던가 해야할듯..
ps. 사실 5번 항목까지 적다가.. 결제 인증을 아무래도 붙여야 겠다 싶어서.. GoogleIAB.productPurchase()를 호출할때 매개변수로 developerPayLoad라는 스트링으로 함수오버로딩이 되어 있었다.. 원한 액션은 결제시 상품번호와 함께 토큰값을 전달하고 결제완료시 해당 토큰값이 정상인지 확인하는 절차를 넣고싶었으나.. 이부분은 테스트가 필요해서 일단 위에 기술하진 않았음..
사실 결제라는 부분이 민감한 부분이기때문에 인증은 반드시 필요한 부분이라.. 추후 이부분을 반드시 체크하고 넘어가야 하겠음..
이내용을 정리하기위해 참고한 일본쪽 사이트를 링크한다.
번역기 돌려서 보면 대충 이해할만하다..
http://westhillapps.blog.jp/archives/25210270.html
추가..
결제초기화 이후 purchaseCompleteAwaitingVerificationEvent() 함수와 연계하여 결제 인증을 처리할때 GoogleIAB.cs에 보면 setAutoVerifySignatures(bool a) 라는 함수와 함께 처리하면 될것 같다...
WRITTEN BY