2021년 8월 2일부터 모든 신규 앱은 결제 라이브러리 버전 3 이상을 사용해야 합니다. 2021년 11월 1일까지 기존 앱의 모든 업데이트는 결제 라이브러리 버전 3 이상을 사용해야 합니다.
bemind.tistory.com/24 의 내용과 기본적인 흐름은 같습니다.
위 링크에서 작성된 내용을 기반으로 결제 라이브러리 버전 3의 내용을 적용하였습니다.
기존에 작성된 내용에서 int responseCode 는 BillingResult billingResult 으로 변경되었고,
그에 따라 구매 결과 확인을 billingResult.getResponseCode() 를 이용해 확인합니다.
구매 내역 처리시
ConsumeParams consumeParams =
ConsumeParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
부분이 추가 되었습니다.
Reference : https://developer.android.com/google/play/billing/integrate#java
1. app 수준 build.gradle 에 dependencies 추가
dependencies {
...
def billing_version = "3.0.0"
implementation "com.android.billingclient:billing:$billing_version"
}
2. 소스코드
결제기능을 구현하고자 하는 화면에 아래 구문 추가.
public class BuyPointActivity extends AppCompatActivity implements PurchasesUpdatedListener {
Context mContext;
// create new Person
private BillingClient mBillingClient;
SkuDetails skuDetails700, skuDetails2100;
String skuID700 = "point_700", skuID2100 = "point_2100"; //제품 ID
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_buy_point);
mContext = BuyPointActivity.this;
...
mBillingClient = BillingClient.newBuilder(mContext).setListener(this).build();
mBillingClient.startConnection(new BillingClientStateListener() {
@Override
public void onBillingSetupFinished(BillingResult billingResult) {
if (billingResult.getResponseCode() == BillingResponse.OK) {
// The billing client is ready. You can query purchases here.
List<String> skuList = new ArrayList<> ();
skuList.add(skuID700);
skuList.add(skuID2100);
SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
mBillingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
@Override
public void onSkuDetailsResponse(BillingResult billingResult, List<SkuDetails> skuDetailsList) {
// Process the result.
if (billingResult.getResponseCode() == BillingClient.BillingResponse.OK && skuDetailsList != null) {
for (SkuDetails skuDetails : skuDetailsList) {
String sku = skuDetails.getSku();
String price = skuDetails.getPrice();
if(skuID700.equals(sku)) {
skuDetails700 = skuDetails;
} else if(skuID2100.equals(sku)) {
skuDetails2100 = skuDetails;
}
}
}
}});
}
}
@Override
public void onBillingServiceDisconnected() {
// Try to restart the connection on the next request to
// Google Play by calling the startConnection() method.
}
});
}
private void doBillingFlow(SkuDetails skuDetails) {
BillingFlowParams flowParams;
int responseCode;
// Retrieve a value for "skuDetails" by calling querySkuDetailsAsync().
flowParams = BillingFlowParams.newBuilder().setSkuDetails(skuDetails).build();
responseCode = mBillingClient.launchBillingFlow(BuyPointActivity.this, flowParams);
}
private void handlePurchase(Purchase purchase) {
String purchaseToken;
ConsumeParams consumeParams =
ConsumeParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
mBillingClient.consumeAsync(consumeParams, consumeListener);
}
ConsumeResponseListener consumeListener = new ConsumeResponseListener() {
@Override
public void onConsumeResponse(BillingResult billingResult, String purchaseToken) {
if (billingResult.getResponseCode() == BillingClient.BillingResponse.OK) {
// Handle the success of the consume operation.
// For example, increase the number of coins inside the user's basket.
}
}
};
/**
* Handle a callback that purchases were updated from the Billing library
*/
@Override
public void onPurchasesUpdated(BillingResult billingResult, List<Purchase> purchases) {
if (billingResult.getResponseCode() == BillingClient.BillingResponse.OK
&& purchases != null) {
for (Purchase purchase : purchases) {
handlePurchase(purchase);
}
} else if (billingResult.getResponseCode() == BillingClient.BillingResponse.USER_CANCELED) {
// Handle an error caused by a user cancelling the purchase flow.
} else {
// Handle any other error codes.
}
}
Button.OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn1000:
doBillingFlow(skuDetails700);
break;
...
}
}
};
...
}
비소비성 구매를 확인하려면 결제 라이브러리의 BillingClient.acknowledgePurchase() 또는 Google Play Developer API의 Product.Purchases.Acknowledge를 사용합니다. 구매를 확인하기 전에 Google Play 결제 라이브러리의 isAcknowledged() 메서드 또는 Google Developer API의 acknowledgementState 필드를 사용하여 앱에서 이미 구매를 확인했는지 검토해야 합니다.
다음 예는 Google Play 결제 라이브러리를 사용하여 구매를 확인하는 방법을 보여줍니다.
BillingClient client = ...
AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = ...
void handlePurchase(Purchase purchase) {
if (purchase.getPurchaseState() == PurchaseState.PURCHASED) {
if (!purchase.isAcknowledged()) {
AcknowledgePurchaseParams acknowledgePurchaseParams =
AcknowledgePurchaseParams.newBuilder()
.setPurchaseToken(purchase.getPurchaseToken())
.build();
client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
}
}
}