#var_dev
1 messages · Page 1 of 1 (latest)
First of all do you have access to Stripe Moto:
https://stripe.com/docs/payments/payment-intents/moto
I do, in most cases it works, this one is exceptional
anything I can provide to help you see the issue?
If there is a particular issue with one payment decline
you need to reach out to Stripe Support
this channel is for technical integration questions
I invite you to reach out to Stripe Support at: https://support.stripe.com/contact
And share with them this particular decline
there is couple of them but this one is the most vivid
Yes feel free to share with them all the declines.
so I'd like rather someone technical to tell me if I request MOTO correctly?
I follow the docs but maybe I'm missing smth
could you at least check the requests please?
{
"description": "Booking X",
"payment_method_options": {
"card": {
"moto": "true"
}
},
"metadata": {
"paymentDescription": "Booking X"
},
"customer": "cus_XXX",
"payment_method": "pm_1OhhnzCBeXMSYrP7BgtFEjMR",
"confirm": "true",
"payment_method_types": {
"0": "card"
}
}
I see the decline code: "do_not_honor" that comes from the card issuer so I don't think the support will tell me more then: It was declined by the card issuer
But maybe I miss some params or I add one that restricts the transactions when I create the PaymentMethod or SetupIntent?
and that's my actual question if you could help me with it
How are you collecting this PaymentMethod "payment_method": "pm_1OhhnzCBeXMSYrP7BgtFEjMR", ?
let me check
You are not following the guide I'm sharing with you actually:
https://stripe.com/docs/payments/payment-intents/moto
You need first to initiate a first payment intent with the card details and save it for future usage.
do I? You say it's not possible to create a PaymentMethod and add it to SetupIntent flagged as moto without initial PaymentIntent?
Element:
const options = {
mode: 'setup',
currency: stripeConfig.currency, // e.g. 'usd'
paymentMethodTypes: ['card'],
paymentMethodCreation: 'manual',
locale: stripeConfig.lang,
} as StripeElementsOptionsMode;
const elements = stripe.elements(options);
const paymentElement = elements.create('payment', {
terms: {
card: 'never',
},
wallets: {
applePay: 'never',
googlePay: 'never',
},
});
paymentElement.mount('#payment-element');
Unless I'm missing something, you are not using SetupIntent when collecting that payment method pm_1OhhnzCBeXMSYrP7BgtFEjMR
PaymentMethod:
const { error, paymentMethod } = await stripe.createPaymentMethod({
elements: stripeElements,
params: {
billing_details: {
name: htmlspecialchars(cardholderNameContainer.value),
},
},
});
Yes you are using the deffered appraoch and createPaymentMethod
Why are you using Stripe Element in order to collect the payment method for a MOTO transaction?
Step 1. Client-side form to create a PaymentMethod (the code see above)
Step 2. - send Pamyment Method ID to a server
Step 3. Create SetupIntent flagged as moto on a server with params like this:
$params = [
'customer' => $stripeCustomer,
'description' => $stripeDescription,
'metadata' => [
'paymentDescription' => $stripeDescription,
],
'payment_method' => $paymentMethodId,
'payment_method_types' => ['card'],
'payment_method_options' => [
'card' => [
'moto' => true
]
],
'confirm' => true,
];
Who is using the Client-side form ? is it your end customer or your employee ?
I'm using Stripe Element in order to collect the PM for MOTO because that's what one of your colleagues said that I can do. I asked if I can use Stripe Element to collect card details for MOTO. I was advised to create an element, create a PM and finish the transaction on a server by adding PM to setupIntent flagged as MOTO
My end-customer is using the form
If your end-customer is using the Form so why you want to use MOTO ?
You can simply use SetupIntent without MOTO:
https://stripe.com/docs/payments/save-and-reuse?platform=web&ui=elements
What I'm not understanding is what is the need for MOTO in your case ? while your end customer are using Stripe Element in order to provide their payment methods ?
We provide the system for managing bookings. Our customers use our system. They receive booking reservation via Mail, Telephone etc.. so they need a form to add cards and they need MOTO
Sorry I still don't understand the use case here and why explicitly want to use MOTO. In other words, what can't be achievable when using SetupIntent (https://stripe.com/docs/payments/save-and-reuse?platform=web&ui=elements) and keep the integration simple without MOTO specification
MOTO isn't designed as a workaround for 3DS
3DS is something required by the bank issuer
and that's may explain the declines you are getting.
exactly, so MOTO is for very specific use-cases: MAIL, TELEPHONE
it's not workaround - it's using it for the specific cases
yeah payments that are processed via the dashboard do get processed as MOTO on the backend.
I asked if I can use Stripe Element to collect card details for MOTO. I was advised to create an element, create a PM and finish the transaction on a server by adding PM to setupIntent flagged as MOTO
so it's your employee (a call center agent etc) entering the card into Elements? not the end-customer?
right, so my problem is that although I flagged my operation as MOTO it din't go through and when the user went to his dashboard he managed to add the same card
Answering you questions - thera are 3 parties
- My company providing saas
- Customers using the system
- end-customers (clients of my clients)
so you use MOTO for 2), when someone empoyed at your customer takes some card details from their end-customer and enters them?
yes
cool. So getting back to the issue:
right, so my problem is that although I flagged my operation as MOTO it din't go through
what does that mean precisely, there was some payment that declined or required 3DS that you didn't expect to? if so, what's the ID of that payment or a request IDreq_xxx?
Note in any case all you can do is flag the transaction as MOTO, the bank can still choose to ignore that (or have their own problem) and request 3DS.
ok, but when the customer goes to his Stripe dashboard he can add the same card manually via the form you provide which is also flagged as MOTO
and he can use it
so both operations are flagged as MOTO but your works and mine does not
so maybe there is an issue on my side
cool, so show me the example you have that doesn't work and we'll go from there
I need the ID of that payment or a request ID req_xxx
declined: req_Tk9qIwvfVdnGmw
passed: req_Zk5C8OWTeZPXgB
sorry, here is the correct for passed: req_ICKvRlvx9jdHPj
ok well to be clear that second request ID from the dashboard, actually does nothing with the bank, it's just adding the card with no validation, so it couldn't decline really
but then it creates SetupIntent with the card: req_Zk5C8OWTeZPXgB
in the first request ID, you do everything normal and correct, but the bank declined the $0 validation charge with do_not_honor, which isn't anything you do anything about beyond asking the customer to give a different card.
looks like in that case the bank decided to authorise the $0 validation charge instead
so the way I see it: when you add a card via Dashboard MOTO is better enforced for some reasons? The bank didn't decline. But when I created a SetupIntent flagged as MOTO with the same card (paymentMethod) the bank decliend
and that's interesting for me - why?
maybe I somehow restrict MOTO on my side
I don't think any of that can be answered really. I don't see this as having anything to do with MOTO whatsoever. It's just the bank declining or not declining the actual authorisation(not connected to authentication)
if this is something you're testing in livemode using your own cards etc I wouldn't draw many conclusions from it since it's not a natural pattern and the bank might treat things differently or as fraud
there's no difference between what you're doing and the Dashboard is doing, the difference is the bank declining or not, and that's something only they can know why
ok, then last question that bothers me a bit: when I create a PaymentMethod on a clientside I add a param: currency but I don't add amount. The way I understand the doc currency is required. But when I test test cards everything works. So now I'm wondering -
1.is it required or not?
2. could that influence the way the transaction is verified? e.g. I provide the currency but no amount so the amount defaults to 0 and that's why it's declined..?
hmm I'm not aware of any currency parameter to the PaymentMethod API, can you show me an example of that?
ok, clarification - I add the param currency when creating an Element, sorry for confusion
const options = {
mode: 'setup',
currency: 'usd',
paymentMethodCreation: 'manual',
// Fully customizable with appearance API.
appearance: {/.../},
};
// Set up Stripe.js and Elements to use in checkout form
const elements = stripe.elements(options);
// Create and mount the Payment Element
const paymentElement = elements.create('payment');
paymentElement.mount('#payment-element');
from the doc
also the validation that a SetupIntent does(this $0 charge I mentioned) is done in the default currency of the merchant account being used(so it's a 0-euro charge for an IE account and 0-USD for a US account). Sometimes that can lead to declines or issues yes, but it's not something we provide a way to control at the moment
makes sense. This has nothing to do with how anything is processed, it's only for controlling the frontend display
I see
in any case in the two examples you shared they were both done in USD as it was a US connected account
in any case I can't tell you why any particular charge declined or so on, and I don't see an integration issue here, the code etc seems normal
if you think your auth rate or decline rate is unusually low/high you could reach out to https://support.stripe.com/?contact=true for help analysing/benchmarking it
alright, thx a lot for help!