1.  APP ID 안에 In-App Purchases 할것을 등록 하였습니까?
아래와 같이 등록을 하셔야합니다.

2. In-App Purchases 등록 할때 checked Cleared for Sale 에 체크 를 하였습니까?

3. 에플리케이션 바이너리를 등록하셨습니까?

4. 새 App ID 의 provisioning profile로 인스톨 하셨습니까?

5. iphone 3.0 이상으로 선택하여 빌드하셨습니까?

6. SKProductRequest를 사용할때 전체 product ID 를 사용 하였습니까?

7. iTunes Connect 에 등록후 몇시간 기다려 보셨습니까?

8.iTunes Connect에 당신의 bank detail이 active 상태로 되어 있습니까?

9. 디바이스로 부터 앱을 지운후 다시 리인스톨 해보셨습니까?




애플에서는 위의 사항들을 체크 하라고 합니다. 


하루죙일 삽질하다가 드디어 찾았습니다. 


전 8번의 계좌 정보와 컨텍 포인트의 미설정이 문제였습니다.


알고 나니 쉬운 문제인데 하루종일 원인을 못찾아서 머리 싸메고 있었네요 ...... 









IOS의 경우는 결제받은 영수증을 가지고 서버에서 IOS 인앱 서버로 

유효한 영수증인지 확인 요청을해 해킹 여부를 판단할수 있습니다. 



안드로이드에선 별도로 유효 영수증인지 확인해주는 서버가 없으미로


결제후 영수증 데이터와 Base64로 암호화된 영수증 데이터 둘을 게임 서버로 보내 

Base64 Decode를 한후 두 영수증이 동일한지 체크하여 해킹을 막을수 있습니다.



아래는 게임서버쪽 영수증 체크 코드 입니다.



  1 
  2 import java.security.KeyFactory;
  3 import java.security.PublicKey;
  4 import java.security.Signature;
  5 import java.security.spec.X509EncodedKeySpec;
  6  
  7 String receiptData = "영수증데이터"; 
  8 String receiptEncodeData = "암호화된 영수증데이터";
  9 String publicKeyStr = "퍼블릭키";
 10  
 11 PublicKey publicKey = null;
 12 byte[] decodeKey = Base64.decodeBase64(publicKeyStr);
 13 KeyFactory keyFactory = KeyFactory.getInstance("RSA");
 14 publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(decodeKey));
 15  
 16 Signature sig;
 17 sig = Signature.getInstance("SHA1withRSA");
 18 sig.initVerify(publicKey);
 19 sig.update(receiptData.getBytes());
 20 if(!sig.verify(Base64.decodeBase64(receiptEncodeData))){
 21  //영수증검증실패
 22 }else{
 23 //영수증검증성공
 24 }







안드로이드 앱을 개발하는 궁극적인 목적!


그것은 바로 수익 창출이 아닐까 합니다. 


현재 많은 개발자들은 광고를 통해서 수익을 창출 하지만 


인앱을 통해서 수익을 창출 하려면 구글이 제공하는 인앱 소스를 사용해야만 합니다. 


onPurchaseStateChange() 함수를 통해서 정상 결재 여부를 판단하게 되는데요


이놈이 호출이 되지 않거나 간혈적으로 호출되는 문제가 있습니다. 


주로 여러번 결재 시도를 하다보면 자주 발생하게 됩니다. 


http://stackoverflow.com 에서 해결책을 찾았습니다. 



출처 : http://stackoverflow.com/questions/12844132/onpurchasestatechange-not-getting-called


onstart() 에서 호출된 녀석을 re-start 할때 제대로 remove를 하지 않아서 발생한다는 내용입니다. 

그래서 해결책은 



protected void onStop() {
        super.onStop();

        ResponseHandler.unregister(YOUR_PURCHASE_OBSERVER);
    }


onStop() 안에서 unregister 을 호출해서 문제를 해결하면 됩니다. 



저희 앱에서는 pause 안에 해당 unregister 가 존재했지만 같은 현상이 계속 나타났습니다. 

이놈을 onDestroy로 옮기니 문제가 해결 되었습니다. 










아래 손가락을 꾹 눌러 주세요

  1. 초짜개발자 2013.01.03 17:18 신고

    저도 같은 현상때문에 여기까지 왔네요.
    링크글을 읽어보니 onstop 에서의 내용을
    onDestroy 로 옮기라는 내용아닌가요? ;;
    onstop 에서 옵저버를 null 로 만드니까요.
    null 일 때 queue 로 처리하라는 두번째 해결책은
    제가 개발력이 부족해서 어떻게 해야되는지 모르겠네요 ㅎ

+ Recent posts