我想用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付款?
答案 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处理异常或身份验证挑战。