アンドロイドアマゾン支払いアクセス

プロセス:

Amazon 開発者アカウントの申請 ---> Amazon コンソールでアプリを追加 ---> アプリ内製品 (消費者製品、認定製品、サブスクリプション製品) を追加 ---> JSON ファイルをエクスポート ---> Amazon 支払いを統合---> エクスポートした JSON ファイルを /mnt/sdcard/ ディレクトリにコピーします ---> 沙河モードで支払いをテストします ---> アップロードして公開します

注: Amazon は現在 V1 署名を使用しています。2.targetSdkVersion バージョンは 29 以下である必要があります。

SDK には 3 つの動作モードがあります

①: SANDBOX Shahe モード。テストに使用され、Amazon App Tester テスト ツールと対話します。

②: テスト前にプロダクションを Amazon App Store に提出する必要があります

③:UNKNOWNverifyLicense()呼び出しによりSDKが初期化されていません。
 

ステップ 1: Amazon In-Purchase SDK を統合する

    implementation 'com.amazon.device:amazon-appstore-sdk:3.0.4'

ステップ 2:  AndroidManifest.xml ファイルにアプリケーションの targetSdkVersion を追加し ResponseReceiver 配置,如果、31 以上に設定します 。android :exported 設定 でandroid : exported を 明示的に設定する必要があります。ResponseReceiver true

<receiver android:name="com.amazon.device.iap.ResponseReceiver" android:exported="true"
            android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY" >
            <intent-filter>
                <action
                    android:name="com.amazon.inapp.purchasing.NOTIFY" />
            </intent-filter>
 </receiver>

ステップ 3: PurchasingListener を実装して登録する (onCreate ライフサイクル メソッドで呼び出されます)

 purchasingListener = new PurchasingListener() {
            /**
             * 确定当前登录用户的UserId和marketplace。
             * @param response
             */
            @Override
            public void onUserDataResponse(final UserDataResponse response) {
                Log.d(LOG_TAG, "onUserDataResponse: requestId (" + response.getRequestId()
                        + ") userIdRequestStatus: "
                        + response.getRequestStatus()
                        + ")");
                //当前用户相关信息(用户ID和市场
                final UserDataResponse.RequestStatus status = response.getRequestStatus();
                switch (status) {
                    case SUCCESSFUL:
                        Log.d(LOG_TAG, "onUserDataResponse: get user id " + response.getUserData().getUserId()
                                + ", marketplace "
                                + response.getUserData().getMarketplace());
                        currentUserId = response.getUserData().getUserId();
                        currentMarketplace = response.getUserData().getMarketplace();
                        break;

                    case FAILED:
                        Log.d(LOG_TAG, "onUserDataResponse FAILED failed, status code is " + status);
                    case NOT_SUPPORTED:
                        Log.d(LOG_TAG, "onUserDataResponse NOT_SUPPORTED failed, status code is " + status);
                        break;
                }
            }

            /**
             * 检索应用中销售的SKU的信息
             * 使用来自ProductDataResponse对象的有效SKU。
             *
             * @param response
             */
            @Override
            public void onProductDataResponse(final ProductDataResponse response) {
                final ProductDataResponse.RequestStatus status = response.getRequestStatus();
                Log.d(LOG_TAG, "onProductDataResponse: RequestStatus (" + status + ")");

                switch (status) {
                    case SUCCESSFUL:
                        Log.d(LOG_TAG, "onProductDataResponse: successful.  The item data map in this response includes the valid SKUs");
                        final Set<String> unavailableSkus = response.getUnavailableSkus();
                        for (final String s : response.getUnavailableSkus()) {
                            Log.v(LOG_TAG, unavailableSkus.size() + " 不可用SKU:" + s);
                        }
                        final Map<String, Product> products = response.getProductData();
                        for (final String key : products.keySet()) {
                            Product product = products.get(key);
                            Log.v(LOG_TAG, String.format("可购买的产品:%s\n 类型:%s\n SKU:%s\n 价格:%s\n 描述:%s\n", product.getTitle(), product.getProductType(), product.getSku(), product.getPrice(), product.getDescription()));
                            // 处理产品
                        }
                        break;
                    case FAILED:
                    case NOT_SUPPORTED:
                        Log.d(LOG_TAG, "onProductDataResponse: failed, should retry request");
                        break;
                }
            }

            /**
             * 检索自上次调用该方法之后用户完成的所有购买交易
             * 仅可检索未履行和已取消的消费品购买
             * @param response
             */
            @Override
            public void onPurchaseUpdatesResponse(final PurchaseUpdatesResponse response) {

                Log.d(LOG_TAG, "PurchaseUpdatesResponse: requestId (" + response.getRequestId()
                        + ") Status ("
                        + response.getRequestStatus()
                        + ") userId ("
                        + response.getUserData().getUserId()
                        + ")");
                //获取请求状态
                final PurchaseUpdatesResponse.RequestStatus status = response.getRequestStatus();
                switch (status) {
                    case SUCCESSFUL:
                        Log.e(LOG_TAG, "========no consumeProduct==========" + response.getReceipts());
                        //PurchasingService.getProductData
                        for (final Receipt receipt : response.getReceipts()) {
                            LogD("购买收据 + receipt " + receipt.isCanceled() + "\n" + "收据:" + receipt.getReceiptId());
                            if (!receipt.isCanceled()) {
                                String localReceipt = SharedPreferencesUtil.getString(mContext, receipt.getReceiptId(), "");
                                Gson gson = new Gson();
                                Type type = new TypeToken<Hashtable<String, String>>(){}.getType();
                                Hashtable<String, String> localPurchase= gson.fromJson(localReceipt, type);
                                if(null!=localPurchase){
                                    myProductInfo = localPurchase;
                                }
                                receiptID = receipt.getReceiptId();
                                Log.e(LOG_TAG, "----------myProductInfo------------: " + myProductInfo);
                                consumeProduct(receipt,"2");
                            }
                        }

//                        if (response.hasMore()) {
//                            //如果不启用“待定购买”,则在每次getPurchaseUpdates(false)调用中只返回未履行的消费品收据
//                            PurchasingService.getPurchaseUpdates(false);
//                            return;
//                        }
                        break;
                    case NOT_SUPPORTED:
                        Log.d(LOG_TAG, "onProductDataResponse: failed, should retry request");
                        break;
                }
            }

            /**
             * purchase()用户拉起支付后,用于确定购买状态。
             *
             * @param response
             */
            @Override
            public void onPurchaseResponse(final PurchaseResponse response) {
                final String requestId = response.getRequestId().toString();
                final String userId = response.getUserData().getUserId();
                final PurchaseResponse.RequestStatus status = response.getRequestStatus();
                Log.d(LOG_TAG, "支付成功回调 onPurchaseResponse: requestId (" + requestId
                        + ") userId ("
                        + userId
                        + ") purchaseRequestStatus ("
                        + status
                        + ")");

                switch (status) {
                    case SUCCESSFUL:
                        //交易成功
                        final Receipt receipt = response.getReceipt();
                        Log.d(LOG_TAG, "onPurchaseResponse: receipt json:" + receipt.toJSON());
                        receiptID = receipt.getReceiptId();
                        Log.d(LOG_TAG, "onPurchaseResponse: receipt receiptID:" + receipt.getReceiptId());

                       //请求服务端跟amazon校验
                       //校验成功去消耗
                        
                          PurchasingService.notifyFulfillment(receiptID, FulfillmentResult.FULFILLED);

                        break;
//                    case PENDING:
//                        Log.d(LOG_TAG, "onPurchaseResponse: 等待远程批准——如果获得批准,购买将在 getPurchaseUpdates 中返回");
//                        break;
                    case ALREADY_PURCHASED:
                        //已经授权过的,属于成功,此时将道具给玩家即可
                        Log.d(LOG_TAG, "onPurchaseResponse: 已经授权过的,属于成功,此时将道具给玩家即可");
                        break;
                    case INVALID_SKU:
                        Log.d(LOG_TAG, "onPurchaseResponse: invalid SKU!无效SKU,无法识别");
                        break;
                    case FAILED:
                    case NOT_SUPPORTED:
                        Log.e(LOG_TAG, "支付失败 用户在完成之前取消了购买");
                        break;
                }
            }
        };

ステップ 4: リスナーを登録します (onCreate ライフサイクル メソッドで呼び出されます)。

PurchasingService.registerListener(mContext、purchasingListener);

ステップ 5:通过 getUserData() 現在のユーザー関連 (ユーザー ID とマーケット)、それを onCreate ライフサイクル メソッドに置きます 

PurchasingService.getUserData(); (onCreate ライフサイクル メソッドで呼び出される)

ステップ 6: 最新の更新が取得されていることを確認するために、このメソッドが最後に呼び出されてからユーザーが完了したすべての購入を取得します。

PurchasingService.getPurchaseUpdates(true); (onCreate ライフサイクル メソッドで呼び出される)
  • false -getPurchaseUpdates()最後の呼び出し以降の購入記録のページ分割された応答を返します。ユーザーの未払いの消費財、権利、定期購入の領収書を取得します。Amazon アプリストアでは、ほとんどの場合、この方法を使用することを推奨しています。

     注: アプリで保留中の購入が有効になっている場合、Amazon アプリストアは、getPurchaseUpdates(false)アプリが呼び出すまで、すべての呼び出しで未履行の購入と権利の領収書をすべてユーザーに返しますnotifyFulfillment()「保留中の購入」が有効になっていない場合は、getPurchaseUpdates(false)各呼び出しで未履行の消費者製品のレシートのみが返されます。

  • true - ユーザーの完全な購入履歴を取得します。データをどこか (サーバー側のデータ キャッシュなど) に保存するか、すべてのデータをメモリ内に保持する必要があります。

ステップ 7: SKU を確認する SKU が無効であるために購入が予期せず失敗することはありません。

 Set<String> productSkus = new HashSet<>();
                productSkus.add("skus1");
                productSkus.add("skus12");
                productSkus.add("skus3");
                ....
                PurchasingService.getProductData(productSkus);// 触发PurchasingListener.onProductDataResponse()

ステップ 8: 支払いポップアップをプルアップして支払います

            final RequestId requestId =  PurchasingService.purchase("Product_Id");

注: 商品を消費する前に、まず Amazon の領収書検証サービス (RVS) を通じてバックエンド サーバーの検証を完了し、receiptId購入によって生成された領収書を確認してください。検証後の消費。

テストプロセス:

1: Amazon App Store から携帯電話に Amazon App Tester をダウンロードします。App Tester は実稼働環境をシミュレートします。ダウンロード リンク

2: バックグラウンドで amazon.sdktester.json ファイルをダウンロードし、/sdcard/携帯電話のフォルダーにコピーします。Amazon App Tester アプリケーションの JSON ファイルで IAP アイテムを見つけ、データがあるかどうかを確認します。

       adb プッシュ F:/download/amazon.sdktester.json /mnt/sdcard/

3: adb shell setprop debug.amazon.sandboxmode デバッグはサンドボックス モードに設定されます

// アプリがテストモードかどうかを確認する

  Log.d(TAG, "Appstore SDK Mode: " + LicensingService.getAppstoreSDKMode()); 

  上記はAmazonペイメントへのアクセスプロセスで、正式な支払いはAmazonに公開されて初めて実行できますが、正式な支払いとテスト支払いの表示効果は同じです。

おすすめ

転載: blog.csdn.net/u010207898/article/details/132457595