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);
        }
    }
}

 

 

Google Play 결제 라이브러리 통합 테스트  |  Google Play 결제 시스템  |  Android Developers

알림: 2021년 11월 1일부터는 기존 앱의 모든 업데이트에도 결제 라이브러리 버전 3 이상이 요구됩니다. 자세히 알아보기 Google Play 결제 라이브러리 통합 테스트 개발 과정 전체에서 통합을 테스트

developer.android.com

 

 

+ Recent posts