Внедрение Android-приложения Google Pay с использованием BlueSnap SDK - PullRequest
0 голосов
/ 09 мая 2019

Я скачал демонстрационное приложение BlueSnap с https://github.com/bluesnap/bluesnap-android-int. Я создал учетную запись в песочнице.Я хочу использовать Google Pay в качестве способа оплаты.Когда я выбираю оплату картой через bluesnap, она успешно списывает сумму, и эта сумма отображается на панели инструментов песочницы BlueSnap, но когда я нажимаю кнопку «GPay» в приложении BlueSnap, она показывает «Неожиданная ошибка разработчика, повторите попытку позже».Я застрял здесь и не могу понять, что происходит не так.

onPaySubmit() - это метод, который вызывается, когда я нажимаю кнопку «Оформить заказ».Я могу предоставить больше кода и подробностей.

public void onPaySubmit(View view) {
        if (shopperConfigSwitch.isChecked()) {
            SdkRequestShopperRequirements sdkRequest = new SdkRequestShopperRequirements(billingSwitch.isChecked(), emailSwitch.isChecked(), shippingSwitch.isChecked());
            try {
                bluesnapService.setSdkRequest(sdkRequest);
                Intent intent = new Intent(getApplicationContext(), BluesnapChoosePaymentMethodActivity.class);
                startActivityForResult(intent, BluesnapChoosePaymentMethodActivity.REQUEST_CODE_DEFAULT);
            } catch (BSPaymentRequestException e) {
                Log.e(TAG, "payment request not validated: ", e);
                finish();
            }
        } else {
            String productPriceStr = AndroidUtil.stringify(productPriceEditText.getText());
            if (TextUtils.isEmpty(productPriceStr)) {
                Toast.makeText(getApplicationContext(), "null payment", Toast.LENGTH_LONG).show();
                return;
            }

            Double productPrice = Double.valueOf(productPriceStr);
            if (productPrice <= 0D) {
                Toast.makeText(getApplicationContext(), "0 payment", Toast.LENGTH_LONG).show();
                return;
            }

            readCurencyFromSpinner(ratesSpinner.getSelectedItem().toString());
            Double taxAmount = 0D;
            // You can set the Amouut solely
            SdkRequest sdkRequest = new SdkRequest(productPrice, ratesSpinner.getSelectedItem().toString(), billingSwitch.isChecked(), emailSwitch.isChecked(), shippingSwitch.isChecked());

//        // Or you can set the Amount with tax, this will override setAmount()
//        // The total purchase amount will be the sum of both numbers
//        if (taxAmountPrecentage > 0D) {
//            sdkRequest.setAmountWithTax(productPrice, productPrice * (taxAmountPrecentage / 100));
//        } else {
//            sdkRequest.setAmountNoTax(productPrice);
//        }

            Switch googlePayTestModeSwitch = findViewById(R.id.googlePayTestModeSwitch);
            sdkRequest.setGooglePayTestMode(googlePayTestModeSwitch.isChecked());

            sdkRequest.setAllowCurrencyChange(allowCurrencyChangeSwitch.isChecked());
            try {
                sdkRequest.verify();
            } catch (BSPaymentRequestException e) {
                showDialog("SdkRequest error:" + e.getMessage());
                Log.d(TAG, sdkRequest.toString());
                finish();
            }

            // Set special tax policy: non-US pay no tax; MA pays 10%, other US states pay 5%
            sdkRequest.setTaxCalculator(new TaxCalculator() {
                @Override
                public void updateTax(String shippingCountry, String shippingState, PriceDetails priceDetails) {
                    if ("us".equalsIgnoreCase(shippingCountry)) {
                        Double taxRate = 0.05;
                        if ("ma".equalsIgnoreCase(shippingState)) {
                            taxRate = 0.1;
                        }
                        priceDetails.setTaxAmount(priceDetails.getSubtotalAmount() * taxRate);
                    } else {
                        priceDetails.setTaxAmount(0D);
                    }
                }
            });

            try {
                bluesnapService.setSdkRequest(sdkRequest);
                Intent intent = new Intent(getApplicationContext(), BluesnapCheckoutActivity.class);
                startActivityForResult(intent, BluesnapCheckoutActivity.REQUEST_CODE_DEFAULT);
            } catch (BSPaymentRequestException e) {
                Log.e(TAG, "payment request not validated: ", e);
                finish();
            }
        }
    }

protected void startGooglePayActivityForResult() {

        Log.d(TAG, "start GooglePay flow");

        // Disables the button to prevent multiple clicks.
        LinearLayout googlePayButton = findViewById(R.id.googlePayButton);
        if (googlePayButton != null) {
            googlePayButton.setClickable(false);
        }

        Task<PaymentData> futurePaymentData = GooglePayService.getInstance().createPaymentDataRequest(googlePayClient);

        // Since loadPaymentData may show the UI asking the user to select a payment method, we use
        // AutoResolveHelper to wait for the user interacting with it. Once completed,
        // onActivityResult will be called with the result.
        AutoResolveHelper.resolveTask(futurePaymentData, this, GOOGLE_PAY_PAYMENT_DATA_REQUEST_CODE);
    }

public Task<PaymentData> createPaymentDataRequest(PaymentsClient googlePayClient) {

        BlueSnapService blueSnapService = BlueSnapService.getInstance();
        SdkRequestBase sdkRequest = blueSnapService.getSdkRequest();
        Long merchantId = blueSnapService.getsDKConfiguration().getMerchantId();
        if (merchantId == null) {
            Log.e(TAG, "Missing merchantId from SDK init data");
            return null;
        }

        List<Pair<String, String>> GATEWAY_TOKENIZATION_PARAMETERS = Arrays.asList(
                Pair.create("gatewayMerchantId", merchantId.toString())
        );

        PaymentMethodTokenizationParameters.Builder paramsBuilder =
                PaymentMethodTokenizationParameters.newBuilder()
                        .setPaymentMethodTokenizationType(
                                WalletConstants.PAYMENT_METHOD_TOKENIZATION_TYPE_PAYMENT_GATEWAY)
                        .addParameter("gateway", GATEWAY_TOKENIZATION_NAME);
        for (Pair<String, String> param : GATEWAY_TOKENIZATION_PARAMETERS) {
            paramsBuilder.addParameter(param.first, param.second);
        }

        PaymentDataRequest request = createPaymentDataRequest(paramsBuilder.build(), sdkRequest);
        Task<PaymentData> futurePaymentData = googlePayClient.loadPaymentData(request);
        return futurePaymentData;
    }

Я хочу, чтобы платежи Google обрабатывались в Bluesnap, и эти платежи должны отображаться на информационной панели песочницы Bluesnap.

...