skip to Main Content

I am using the payment_intent API to generate payment intent for payment sheet initialization.

As per the document, payment_intent is the POST method. Showing different errors in android and iOS.
https://stripe.com/docs/api/payment_intents/create
Note:- It’s working in postman not working on mobile.

Case 1 Android
It is not working with the POST method. It worked with the GET method this is weird.

Case 2 iOS
It is not working with the GET and POST methods both.

With POST received the following error

_response": "{
  "error": {
    "code": "parameter_missing",
    "doc_url": "https://stripe.com/docs/error-codes/parameter-missing",
    "message": "Missing required param: amount.",
    "param": "amount",
    "type": "invalid_request_error"
  }
}

With GET method received the following error

"_response":"resource exceeds maximum size"

End Point URL:-

let data = JSON.stringify({
  customer: customerId,
  currency: 'inr',
  amount: 1000,

  'automatic_payment_methods[enabled]': 'true',
});

let config = {
  method: 'GET',
  url: 'https://api.stripe.com/v1/payment_intents',
  headers: {
    Authorization:
      'Bearer sk_test_DmXI7Jw1PnJAWYps3iCpvKkttIGX00pPfGLTjj',
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  data: data,
};

axios(config)
  .then(function (response) {
    console.info(JSON.stringify(response));
  })
  .catch(function (error) {
    console.error('-----', error.response);
  });

Following this document
https://stripe.com/docs/payments/accept-a-payment?platform=react-native&ui=payment-sheet#react-native-flowcontroller
https://stripe.com/docs/api/payment_intents/create

Added snack URL to reproduce the issue.
https://snack.expo.dev/@vishaldhanotiya/stripe-payment-intent

Error Log
enter image description here

2

Answers


  1. Chosen as BEST ANSWER

    Finally, I found a solution. The issue occurred because I am send parameters without encoding.

    I found a solution from this link

    https://stackoverflow.com/a/58254052/9158543.

    let config = {
                method: 'post',
                url: 'https://api.stripe.com/v1/payment_intents',
                headers: {
                    Authorization:
                        'Bearer sk_test_51J3PfGLTjj',
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            };
    
            let paymentDetail = {
                customer: 'cus_MSiYLjtdaJPiCW',
                currency: 'USD',
                amount: 100,
                'automatic_payment_methods[enabled]': true
            };
    
            let formBody: any = [];
            for (let property in paymentDetail) {
                let encodedKey = encodeURIComponent(property);
                let encodedValue = encodeURIComponent(paymentDetail[property]);
                formBody.push(encodedKey + '=' + encodedValue);
            }
            formBody = formBody.join('&');
    
            const result = await axios
                .post('https://api.stripe.com/v1/payment_intents', formBody, {
                    headers: config.headers
                })
                .then(function (response) {
                    console.info(JSON.stringify(response));
                })
                .catch(function (error) {
                    console.error('-----', error.response);
                });
    

  2. To clarify a few things:

    1/ You shared your (test mode) secret key in your code snippet, please delete that and roll your API keys (https://stripe.com/docs/keys#keeping-your-keys-safe).

    2/ Your iOS/Android apps should not be making requests to Stripe’s APIs directly with your secret API key, as that means you are bundling your secret key with your apps which means anyone running your app has access to your secret key.

    Instead, you need to make requests from your iOS app to your server and your server should use Stripe’s server-side libraries to make requests to Stripe’s APIs. Your iOS/Android apps can only make requests with your publishable key.

    3/ The PaymentIntent endpoint supports both POST and GET. You can create a PaymentIntent by POSTing to the /v1/payment_intents endpoint, you retrieve a single PaymentIntent with a GET to the /v1/payment_intents/:id endpoint and you list PaymentIntents with a GET to the /v1/payment_intents endpoint.

    4/ The error in your POST request shows "Missing required param: amount." so you need to debug your code to make sure the amount parameter is getting through. You can use Stripe’s Dashboard Logs page https://dashboard.stripe.com/test/logs to debug what parameters your code is sending to Stripe’s API.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search