안녕하세요.. 답답합니다 네 답답합니다. v2에서 v3으로 바뀐지 오래된것같은데 왜 저는 이제야 v3을 적용한것일까요.. 인터넷에 정보도 잘 없는것같고.. ( 물론 검색하니 나오긴합니다. 제가 할줄몰라 그런건지.. 허허 ) 삽질하는분 없으셨으면 하는 바람에 정리한번 해봅니다.
( 사실 다음에 또 인앱 구현할 일 있을때 이거보고 기억 더듬으며 편히 하게위함.... 은 비밀 )
구글 API문서도 도움되었지만, 한국어로 설명되어있으면 좋을것 같은 생각에.. 한 자 적어봅니다.
우선 SDK매니저 들어가셔서
사진에 보이는 Google Play Billing Libary 를 설치합니다.
그럼 SDK - extra -google - play_billing 폴더가 생길겁니다.
안에 샘플코드도 들어있으니 참고하시면 됩니다. ( 사실 전 샘플코드 별로 도움 안되었어요.. ㅜㅜ )
Sample폴더 안에 TrivialDrive 폴더가 있으면 인앱 버전3 이 맞습니다.
src폴더에 있는 java파일을 본인 프로젝트로 복사해줍니다.
android폴더에있는 android.vending.billing 파일도 역시 복사하셔야 되며 이 파일은 패키지명을 수정하면 안됩니다.
Manifest에 다음을 추가해주세요.
<uses-permission android:name="com.android.vending.BILLING"/>
이제 기본세팅은 끝났습니다. 인앱 Activity를 코딩해볼까요
전역변수로
1.
IInAppBillingService mService;
2.
IabHelper mHelper;
선언해주세요.
그리고
01.
ServiceConnection mServiceConn =
new
ServiceConnection() {
02.
@Override
03.
public
void
onServiceDisconnected(ComponentName name) {
04.
mService =
null
;
05.
}
06.
07.
@Override
08.
public
void
onServiceConnected(ComponentName name, IBinder service) {
09.
mService = IInAppBillingService.Stub.asInterface(service);
10.
}
11.
};
추가,
onDestroy 에는
1.
@Override
2.
public
void
onDestroy() {
3.
super
.onDestroy();
4.
if
(mServiceConn !=
null
) {
5.
unbindService(mServiceConn);
6.
}
7.
}
와 같이 해줍니다.
onCreate안에다가
01.
bindService(
new
Intent(
"com.android.vending.billing.InAppBillingService.BIND"
), mServiceConn, Context.BIND_AUTO_CREATE);
02.
03.
String base64EncodedPublicKey =
""
; (구글에서 발급받은 바이너리키를 입력해줍니다)
04.
05.
mHelper =
new
IabHelper(
this
, base64EncodedPublicKey);
06.
mHelper.enableDebugLogging(
true
);
07.
mHelper.startSetup(
new
IabHelper.OnIabSetupFinishedListener() {
08.
public
void
onIabSetupFinished(IabResult result) {
09.
if
(!result.isSuccess()) {
10.
// 구매오류처리 ( 토스트하나 띄우고 결제팝업 종료시키면 되겠습니다 )
11.
}
12.
13.
AlreadyPurchaseItems();
// AlreadyPurchaseItems(); 메서드는 구매목록을 초기화하는 메서드입니다. v3으로 넘어오면서 구매기록이 모두 남게 되는데 재구매 가능한 상품( 게임에서는 코인같은아이템은 ) 구매후 삭제해주어야 합니다. 이 메서드는 상품 구매전 혹은 후에 반드시 호출해야합니다. ( 재구매가 불가능한 1회성 아이템의경우 호출하면 안됩니다 )
14.
15.
}
16.
});
17.
}
그리고 AlreadyPurchaseItems 메서드입니다.
01.
public
void
AlreadyPurchaseItems() {
02.
try
{
03.
Bundle ownedItems = mService.getPurchases(
3
, getPackageName(),
"inapp"
,
null
);
04.
int
response = ownedItems.getInt(
"RESPONSE_CODE"
);
05.
if
(response ==
0
) {
06.
ArrayList<string><span style=
"font-size: 11pt;"
> purchaseDataList = ownedItems
07.
.getStringArrayList(
"INAPP_PURCHASE_DATA_LIST"
);
08.
String[] tokens =
new
String[purchaseDataList.size()];
09.
for
(
int
i =
0
; i < purchaseDataList.size(); ++i) {
10.
String purchaseData = (String) purchaseDataList.get(i);
11.
JSONObject jo =
new
JSONObject(purchaseData);
12.
tokens[i] = jo.getString(
"purchaseToken"
);
13.
// 여기서 tokens를 모두 컨슘 해주기
14.
mService.consumePurchase(
3
, getPackageName(), tokens[i]);
15.
}
16.
}
17.
18.
// 토큰을 모두 컨슘했으니 구매 메서드 처리
19.
}
catch
(Exception e) {
20.
e.printStackTrace();
21.
}
22.
}
23.
</span></string>
// 구매메서드 입니다.
01.
public
void
Buy(String id_item) {
02.
// Var.ind_item = index;
03.
try
{
04.
Bundle buyIntentBundle = mService.getBuyIntent(
3
, getPackageName(), id_item,
"inapp"
,
"test"
);
05.
PendingIntent pendingIntent = buyIntentBundle.getParcelable(
"BUY_INTENT"
);
06.
07.
if
(pendingIntent !=
null
) {
08.
// startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
09.
mHelper.launchPurchaseFlow(
this
, getPackageName(),
1001
, mPurchaseFinishedListener,
"test"
);
10.
// 위에 두줄 결제호출이 2가지가 있는데 위에것을 사용하면 결과가 onActivityResult 메서드로 가고, 밑에것을 사용하면 OnIabPurchaseFinishedListener 메서드로 갑니다. (참고하세요!)
11.
}
else
{
12.
// 결제가 막혔다면
13.
}
14.
}
catch
(Exception e) {
15.
e.printStackTrace();
16.
}
17.
}
결과처리 메서드 2가지 다 설명드리겠습니다
우선 1번 방법
01.
@Override
02.
protected
void
onActivityResult(
int
requestCode,
int
resultCode, Intent data) {
03.
System.out.println(
"requestCode : "
+ requestCode);
04.
System.out.println(
"resultCode : "
+ resultCode);
05.
if
(requestCode ==
1001
)
06.
if
(resultCode == RESULT_OK) {
07.
if
(!mHelper.handleActivityResult(requestCode, resultCode, data)) {
08.
super
.onActivityResult(requestCode, resultCode, data);
09.
10.
int
responseCode = data.getIntExtra(
"RESPONSE_CODE"
,
0
);
11.
String purchaseData = data.getStringExtra(
"INAPP_PURCHASE_DATA"
);
12.
String dataSignature = data.getStringExtra(
"INAPP_DATA_SIGNATURE"
);
13.
14.
// 여기서 아이템 추가 해주시면 됩니다.
15.
// 만약 서버로 영수증 체크후에 아이템 추가한다면, 서버로 purchaseData , dataSignature 2개 보내시면 됩니다.
16.
17.
18.
}
else
{
19.
// 구매취소 처리
20.
}
21.
}
else
{
22.
// 구매취소 처리
23.
}
24.
else
{
25.
// 구매취소 처리
26.
}
27.
}
2번째 방법입니다.
1.
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener =
new
IabHelper.OnIabPurchaseFinishedListener() {
2.
public
void
onIabPurchaseFinished(IabResult result, Purchase purchase)
3.
{
4.
// 여기서 아이템 추가 해주시면 됩니다.
5.
// 만약 서버로 영수증 체크후에 아이템 추가한다면, 서버로 purchase.getOriginalJson() , purchase.getSignature() 2개 보내시면 됩니다.
6.
}
7.
};
이렇게하면 인앱처리 끝납니다. 다른문의사항있으면 댓글남겨주시면 답변드릴수있도록할게요 ㅎㅎ
요청하시는분이 많아서 인앱부분 소스 올려드립니다. 참고하세요 ㅎ
안녕하세요. 제가 적은 포스팅글인데 아무 출처도없이 동의도없이 이 블로그는 이렇게 포스팅하시나보네요?? http://it77.tistory.com/74
답글삭제