acceso a pagos de amazon android

proceso:

Solicite una cuenta de desarrollador de Amazon ---> Agregar una aplicación en la consola de Amazon ---> Agregar productos dentro de la aplicación (productos de consumo, productos autorizados, productos de suscripción) ---> Exportar archivo JSON ---> Integrar pagos de Amazon ---> Copie el archivo JSON exportado al directorio /mnt/sdcard/ ---> Pruebe el pago en modo Shahe ---> Cargue y publique

Nota: Amazon utiliza actualmente la firma V1; la versión 2.targetSdkVersion debe ser menor o igual a 29

Hay tres modos de funcionamiento del SDK :

①: modo SANDBOX Shahe, utilizado para realizar pruebas e interactuar con la herramienta de prueba de Amazon App Tester

②: LA PRODUCCIÓN debe enviarse a Amazon App Store antes de realizar la prueba.

③: DESCONOCIDO verifyLicense()El SDK no se ha inicializado mediante la llamada.
 

Paso 1: integrar el SDK de compras de Amazon

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

Paso 2:  agregue  la aplicación targetSdkVersion en el archivo AndroidManifest.xml ResponseReceiver 配置,如果 y configúrelo en 31 o superior. Debe configurar explícitamente  android : exported ResponseReceiver  en la configuración  android:exported 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>

Paso 3: Implementar y registrar PurchasingListener (llamado en el método del ciclo de vida 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;
                }
            }
        };

Paso 4: registrar el oyente (llamado en el método del ciclo de vida onCreate)

PurchasingService.registerListener(mContext,compraListener);

Paso 5: 通过 getUserData() relacionado con el usuario actual (ID de usuario y mercado), lo puse en el método del ciclo de vida onCreate 

PurchasingService.getUserData(); (llamado en el método de ciclo de vida onCreate)

Paso 6: recupere todas las compras completadas por el usuario desde la última vez que se llamó a este método para garantizar que se obtengan las últimas actualizaciones

PurchasingService.getPurchaseUpdates(true); (llamado en el método de ciclo de vida onCreate)
  • false - Devuelve getPurchaseUpdates()una respuesta paginada de los registros de compra desde la última llamada. Recupere recibos de las compras de suscripciones, derechos y bienes de consumo pendientes de un usuario. Amazon Appstore recomienda utilizar este método en la mayoría de los casos.

     Nota:  Si su aplicación tiene habilitadas las compras pendientes , Amazon Appstore getPurchaseUpdates(false)devuelve todas las compras no cumplidas y los recibos de derechos al usuario en cada llamada hasta que su aplicación lo llame notifyFulfillment(). Si "Compras pendientes" no está habilitado, getPurchaseUpdates(false)en cada llamada solo se devuelven los recibos de productos de consumo no cumplidos.

  • true - Recuperar el historial de compras completo del usuario. O los datos deben almacenarse en algún lugar (como un caché de datos del lado del servidor) o todos los datos deben mantenerse en la memoria.

Paso 7: Verifica el SKU. La compra no fallará inesperadamente debido a un SKU no válido.

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

Paso 8: abra la ventana emergente de pago para pagar

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

Nota: Antes de consumir productos, primero complete la verificación del servidor back-end a través del Servicio de verificación de recibos (RVS) de Amazon receiptIdpara verificar el recibo generado por la compra. Consumo tras verificación.

Proceso de prueba :

1: Descargue Amazon App Tester desde Amazon App Store a su teléfono. App Tester simula el entorno de producción, enlace de descarga

2: Descargue el archivo amazon.sdktester.json en segundo plano y cópielo en /sdcard/la carpeta de su teléfono. Busque los elementos IAP en el archivo JSON en la aplicación Amazon App Tester y vea si hay datos.

       adb push F:/descargar/amazon.sdktester.json /mnt/sdcard/

3: la depuración de adb shell setprop debug.amazon.sandboxmode está configurada en modo sandbox

//Comprueba si la aplicación está en modo de prueba.

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

  Lo anterior es el proceso de acceso al pago de Amazon. El pago oficial solo se puede realizar después de que se publique en Amazon, pero el efecto de visualización del pago formal y el pago de prueba es el mismo.

Supongo que te gusta

Origin blog.csdn.net/u010207898/article/details/132457595
Recomendado
Clasificación