Android
인앱 결제
수색…
소모품 인앱 구매
소비 가능 관리 제품은 게임 내 통화, 게임 라이프, 파워 업 등과 같이 여러 번 구입할 수있는 제품입니다.
이 예제에서 우리는 4 개의 다른 소모품 관리 제품 "item1", "item2", "item3", "item4"
를 구현하려고합니다.
요약 단계 :
- 인앱 결제 라이브러리를 프로젝트 (AIDL 파일)에 추가하십시오.
AndroidManifest.xml
파일에 필요한 권한을 추가하십시오.- Google 개발자 콘솔에 서명 된 apk를 배포합니다.
- 제품을 정의하십시오.
- 코드를 구현하십시오.
- 인앱 결제 테스트 (선택 사항)
1 단계:
먼저 AIDL 파일을 여기 Google 문서에 명확하게 설명 된대로 프로젝트에 추가해야합니다.
IInAppBillingService.aidl
은 인앱 결제 버전 3 서비스에 대한 인터페이스를 정의하는 Android 인터페이스 정의 언어 (AIDL) 파일입니다. 이 인터페이스를 사용하여 IPC 메소드 호출을 호출하여 대금 청구 요청을합니다.
2 단계:
AIDL 파일을 추가 한 후 AndroidManifest.xml
에 BILLING 권한을 추가하십시오.
<!-- Required permission for implementing In-app Billing -->
<uses-permission android:name="com.android.vending.BILLING" />
3 단계 :
서명 된 apk를 생성하여 Google Developers Console에 업로드하십시오. 인앱 제품을 정의 할 수 있으려면이 과정이 필요합니다.
4 단계 :
다른 제품 ID로 모든 제품을 정의하고 가격을 각각으로 설정하십시오. 제품에는 2 가지 유형 (관리 제품 및 구독)이 있습니다. 앞서 말했듯이, 우리는 4 개의 다른 소모품 관리 제품 "item1", "item2", "item3", "item4"
를 구현하려고합니다.
5 단계 :
위의 모든 단계를 수행 한 후에는 이제 자신의 활동에서 코드 자체를 구현할 준비가되었습니다.
주요 활동:
public class MainActivity extends Activity {
IInAppBillingService inAppBillingService;
ServiceConnection serviceConnection;
// productID for each item. You should define them in the Google Developers Console.
final String item1 = "item1";
final String item2 = "item2";
final String item3 = "item3";
final String item4 = "item4";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Instantiate the views according to your layout file.
final Button buy1 = (Button) findViewById(R.id.buy1);
final Button buy2 = (Button) findViewById(R.id.buy2);
final Button buy3 = (Button) findViewById(R.id.buy3);
final Button buy4 = (Button) findViewById(R.id.buy4);
// setOnClickListener() for each button.
// buyItem() here is the method that we will implement to launch the PurchaseFlow.
buy1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item1);
}
});
buy2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item2);
}
});
buy3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item3);
}
});
buy4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
buyItem(item4);
}
});
// Attach the service connection.
serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
inAppBillingService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
inAppBillingService = IInAppBillingService.Stub.asInterface(service);
}
};
// Bind the service.
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
bindService(serviceIntent, serviceConnection, BIND_AUTO_CREATE);
// Get the price of each product, and set the price as text to
// each button so that the user knows the price of each item.
if (inAppBillingService != null) {
// Attention: You need to create a new thread here because
// getSkuDetails() triggers a network request, which can
// cause lag to your app if it was called from the main thread.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
ArrayList<String> skuList = new ArrayList<>();
skuList.add(item1);
skuList.add(item2);
skuList.add(item3);
skuList.add(item4);
Bundle querySkus = new Bundle();
querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
try {
Bundle skuDetails = inAppBillingService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
int response = skuDetails.getInt("RESPONSE_CODE");
if (response == 0) {
ArrayList<String> responseList = skuDetails.getStringArrayList("DETAILS_LIST");
for (String thisResponse : responseList) {
JSONObject object = new JSONObject(thisResponse);
String sku = object.getString("productId");
String price = object.getString("price");
switch (sku) {
case item1:
buy1.setText(price);
break;
case item2:
buy2.setText(price);
break;
case item3:
buy3.setText(price);
break;
case item4:
buy4.setText(price);
break;
}
}
}
} catch (RemoteException | JSONException e) {
e.printStackTrace();
}
}
});
thread.start();
}
}
// Launch the PurchaseFlow passing the productID of the item the user wants to buy as a parameter.
private void buyItem(String productID) {
if (inAppBillingService != null) {
try {
Bundle buyIntentBundle = inAppBillingService.getBuyIntent(3, getPackageName(), productID, "inapp", "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");
startIntentSenderForResult(pendingIntent.getIntentSender(), 1003, new Intent(), 0, 0, 0);
} catch (RemoteException | IntentSender.SendIntentException e) {
e.printStackTrace();
}
}
}
// Unbind the service in onDestroy(). If you don’t unbind, the open
// service connection could cause your device’s performance to degrade.
@Override
public void onDestroy() {
super.onDestroy();
if (inAppBillingService != null) {
unbindService(serviceConnection);
}
}
// Check here if the in-app purchase was successful or not. If it was successful,
// then consume the product, and let the app make the required changes.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1003 && resultCode == RESULT_OK) {
final String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
// Attention: You need to create a new thread here because
// consumePurchase() triggers a network request, which can
// cause lag to your app if it was called from the main thread.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
JSONObject jo = new JSONObject(purchaseData);
// Get the productID of the purchased item.
String sku = jo.getString("productId");
String productName = null;
// increaseCoins() here is a method used as an example in a game to
// increase the in-game currency if the purchase was successful.
// You should implement your own code here, and let the app apply
// the required changes after the purchase was successful.
switch (sku) {
case item1:
productName = "Item 1";
increaseCoins(2000);
break;
case item2:
productName = "Item 2";
increaseCoins(8000);
break;
case item3:
productName = "Item 3";
increaseCoins(18000);
break;
case item4:
productName = "Item 4";
increaseCoins(30000);
break;
}
// Consume the purchase so that the user is able to purchase the same product again.
inAppBillingService.consumePurchase(3, getPackageName(), jo.getString("purchaseToken"));
Toast.makeText(MainActivity.this, productName + " is successfully purchased. Excellent choice, master!", Toast.LENGTH_LONG).show();
} catch (JSONException | RemoteException e) {
Toast.makeText(MainActivity.this, "Failed to parse purchase data.", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
});
thread.start();
}
}
}
6 단계 :
코드를 구현 한 후 apk를 베타 / 알파 채널에 배포하여 테스트하고 다른 사용자가 코드를 테스트하도록 할 수 있습니다. 그러나 테스트 모드에서는 실제 인앱 구매를 할 수 없습니다. 앱 / 게임을 먼저 Play 스토어에 게시하여 모든 제품이 완전히 활성화되도록해야합니다.
인앱 결제 테스트에 대한 자세한 내용은 여기를 참조하십시오 .
(타사) 인앱 v3 라이브러리
1 단계 : 먼저 앱 기능을 추가하려면 다음 두 단계를 따르세요.
1. 다음을 사용하여 라이브러리를 추가하십시오.
repositories {
mavenCentral()
}
dependencies {
compile 'com.anjlab.android.iab.v3:library:1.0.+'
}
2. 매니페스트 파일에 권한을 추가합니다.
<uses-permission android:name="com.android.vending.BILLING" />
2 단계 : 결제 프로세서 초기화 :
BillingProcessor bp = new BillingProcessor(this, "YOUR LICENSE KEY FROM GOOGLE PLAY CONSOLE HERE", this);
Billing Handler : BillingProcessor.IBillingHandler 구현 : 4 가지 메소드 포함 : a. onBillingInitialized (); 비. onProductPurchased (String productId, TransactionDetails details) : 성공적인 구매 후 수행 할 작업을 처리해야하는 곳입니다. c. onBillingError (int errorCode, Throwable error) : 구매 프로세스 중 발생한 오류 처리 d. onPurchaseHistoryRestored () : 앱 구매시 복원 용
3 단계 : 제품을 구입하는 방법.
관리되는 제품을 구매하려면 다음을 수행하십시오.
bp.purchase(YOUR_ACTIVITY, "YOUR PRODUCT ID FROM GOOGLE PLAY CONSOLE HERE");
구독 구매 :
bp.subscribe(YOUR_ACTIVITY, "YOUR SUBSCRIPTION ID FROM GOOGLE PLAY CONSOLE HERE");
4 단계 : 제품 소비.
제품을 소비하려면 단순히 consumePurchase 메소드를 호출하십시오.
bp.consumePurchase ( '여기에있는 GOOGLE PLAY CONSOLE의 제품 ID');
앱 방문 github 와 관련된 다른 메소드