条纹Android,我如何使用源卡创建3ds付款

时间:2020-03-31 09:27:05

标签: android stripe-payments

我想用3ds创建付款。因此,我阅读了一笔付款的文档,并创建了如下代码:

   // init code
      final PaymentAuthConfig.Stripe3ds2UiCustomization uiCustomization =
                    new PaymentAuthConfig.Stripe3ds2UiCustomization.Builder()
                            .setLabelCustomization(
                                    new PaymentAuthConfig.Stripe3ds2LabelCustomization.Builder()
                                            .setTextFontSize(12)
                                            .build())
                            .build();

            PaymentAuthConfig.init(new PaymentAuthConfig.Builder()
                    .set3ds2Config(new PaymentAuthConfig.Stripe3ds2Config.Builder()
                            .setTimeout(5)
                            .setUiCustomization(uiCustomization)
                            .build())
                    .build());

付款代码

// payment method
 PaymentMethodCreateParams params = cardInputWidget.getPaymentMethodCreateParams();
                if (params != null) {
                    Map<String, String> extraParams = new HashMap<>();
                    extraParams.put("setup_future_usage", "off_session");

                    ConfirmPaymentIntentParams confirmParams = ConfirmPaymentIntentParams
                            .createWithPaymentMethodCreateParams(params, paymentIntentClientSecret, null, false, extraParams);

                    final Context context = getApplicationContext();
                    stripe = new Stripe(
                            context,
                            PaymentConfiguration.getInstance(context).getPublishableKey()
                    );
                    stripe.confirmPayment(PaymentUPD.this, confirmParams);
                }

一笔付款的代码是可行的,并且可以在3ds中使用。但是现在我要保存所有卡,然后从已保存的卡列表中选择一些卡。

所以我保存这样的卡片:

        SourceParams cardSourceParams = SourceParams.createCardParams(cardToSave);
   Map<String, Object> params = new HashMap<String, Object>();
                    params.put("statement_descriptor", nameOfCard);
                    cardSourceParams.setExtraParams(params);

 stripe.createSource(cardSourceParams, new ApiResultCallback<Source>() {
            @Override
            public void onSuccess(@NonNull Source source) {
                Log.e("success", source.getId());
               String source_id = source.getId();
    // then i save this source to server
            }

            @Override
            public void onError(@NonNull Exception error) {
                Log.e("PaymentCore", error.getMessage(), error);
            }
        });

保存卡后,我从服务器获取了卡的所有列表,并且我有这样的东西:

brand == Visa
 last 4 numbers ==   4242
 source_id == src_1GSficBnnQZzyRulVXsNTThC1

所以现在我想用已保存的卡付款。所以我得到

source_id == src_1GSficBnnQZzyRulVXsNTThC1

并尝试执行以下操作:

String source = "src_1GSficBnnQZzyRulVXsNTThC1";

                SourceParams sourceParams = SourceParams.createSourceFromTokenParams(source);

                ConfirmPaymentIntentParams confirmParams = ConfirmPaymentIntentParams
                        .createWithSourceParams(sourceParams, paymentIntentClientSecret, null);

                final Context context = getApplicationContext();
                stripe = new Stripe(
                        context,
                        PaymentConfiguration.getInstance(context).getPublishableKey()
                );
                stripe.confirmPayment(PaymentUPD.this, confirmParams);

错误:

java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter returnUrl

我应该把什么放到returnUrl上?我没有任何returnUrl

我的第二个问题是:如何使用已保存的卡片使用3ds付款?

1 个答案:

答案 0 :(得分:1)

您应该避免将“来源”用于任何与卡相关的新集成,而应该像使用一次性付款一样,更喜欢使用Payment Methods

条带有saving card details for later use 付款的完整指南。如果您不打算提前付款,请使用此功能。其中包括有关如何take payment with the card later的部分。

如果您确实打算立即付款保存卡以备后用,请遵循guide for that scenario instead

请注意,在所有情况下,如果先前已通过3ds对卡进行了身份验证,则必须始终准备好使用recovery flow for your customer处理异常或身份验证挑战。