简体   繁体   English

在 Stripe 中创建客户时出现无效请求错误

[英]Invalid request error while creating customer in Stripe

I am working on a payment gateway using Stripe API.我正在使用Stripe API 开发支付网关。 I had split the card element into three elements as: cardnumer , cvc and cardExpiry .我将card元素拆分为三个元素: cardnumercvccardExpiry I have created the token using only cardnumber element and I am trying to create the customer in stripe.我只使用cardnumber元素创建了令牌,我正在尝试创建条带客户

I am getting an error as:我收到一个错误:

Request req_vL0Z2mkBIrhu7N: Invalid object

 /home/nishant/Development/ecommerce/project/shop/views.py in order_view

                source = request.POST['stripeToken']

     …

▶ Local vars
/home/nishant/Development/venv/lib/python3.6/site-packages/stripe/api_resources/abstract/createable_api_resource.py in create

            response, api_key = requestor.request("post", url, params, headers)

     …

▶ Local vars
/home/nishant/Development/venv/lib/python3.6/site-packages/stripe/api_requestor.py in request

            resp = self.interpret_response(rbody, rcode, rheaders)

     …

▶ Local vars
/home/nishant/Development/venv/lib/python3.6/site-packages/stripe/api_requestor.py in interpret_response

                self.handle_error_response(rbody, rcode, resp.data, rheaders)

     …

▶ Local vars
/home/nishant/Development/venv/lib/python3.6/site-packages/stripe/api_requestor.py in handle_error_response

            raise err

     …

▶ Local vars 

Here is my payment.html :这是我的payment.html

 var stripe = Stripe('pk_test_nnGYKgpxl7AmicqNbcoGIMqQ008d6IpXgw');

  // Create an instance of Elements.
  var elements = stripe.elements();

  var style = {
    base: {
      color: '#32325d',
      fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
      fontSmoothing: 'antialiased',
      fontSize: '16px',
      '::placeholder': {
        color: '#aab7c4'
      }
    },
    invalid: {
      color: '#fa755a',
      iconColor: '#fa755a'
    }
  };

  // Create an instance of the card Element.
  **var cardnumber = elements.create('cardNumber', {     **
    classes : {
      base : "form-control",
      focus : "green",
      invalid : "error",
    },
    style : style
  });

   ** var cvc = elements.create('cardCvc', {      **
    classes : {
      base : "form-control",
      focus : "green",
      invalid : "error",
    },
    style : style
  });

   ** var exp = elements.create('cardExpiry',{     **
        classes : {
          base: "form-control",
          invalid : "error",
        },
      style : style
    });
  // Add an instance of the card Element into the `card-element` <div>.
  cardnumber.mount('#cardnumber');         **
  cvc.mount('#cardcvc');                   **
  exp.mount('#cardexpiry');                **

  // Handle real-time validation errors from the card Element.
  cardnumber.addEventListener('change', function(event) {
    var displayError = document.getElementById('card-errors');
    if (event.error) {
      displayError.textContent = event.error.message;
    } else {
      displayError.textContent = '';
    }
  });

  cvc.addEventListener('change', function(event) {
    var displayError = document.getElementById('card-errors');
    if (event.error) {
      displayError.textContent = event.error.message;
    } else {
      displayError.textContent = '';
    }
  });

  exp.addEventListener('change', function(event) {
    var displayError = document.getElementById('card-errors');
    if (event.error) {
      displayError.textContent = event.error.message;
    } else {
      displayError.textContent = '';
    }
  });


  // Handle form submission.
  var form = document.getElementById('payment-form');
  form.addEventListener('submit', function(event) {
    event.preventDefault();

    stripe.createToken(cardnumber).then(function(result) {          ***
      if (result.error) {
        // Inform the user if there was an error.
        var errorElement = document.getElementById('card-errors');
        errorElement.textContent = result.error.message;
      } else {
        // Send the token to your server.
        stripeTokenHandler(result.token);
      }
    });
  });

  // Submit the form with the token ID.
  function stripeTokenHandler(token) {
    // Insert the token ID into the form so it gets submitted to the server
    var form = document.getElementById('payment-form');
    var hiddenInput = document.createElement('input');
    hiddenInput.setAttribute('type', 'hidden');
    hiddenInput.setAttribute('name', 'stripeToken');
    hiddenInput.setAttribute('value', token.id);
    form.appendChild(hiddenInput);

    // Submit the form
    form.submit();
  }

My views.py is creating customer as:我的views.py客户创建为:

stripe.Customer.create(
            name = request.POST['name'],
            email = request.POST['email'],
            address = request.POST['address'],
            source = request.POST['stripeToken']
            )

I am new to stripe .我是条纹新手。 How can I resolve this?我该如何解决这个问题?

Try passing the address as a dictionary instead of a flat string [1]:尝试将地址作为字典而不是平面字符串 [1] 传递:

stripe.Customer.create(
  description="My First Test Customer (created for API docs)",
  address = {'line1': 'one two three'}
)

Hope that helps!希望有帮助!

[1] https://stripe.com/docs/api/customers/create?lang=python#create_customer-address [1] https://stripe.com/docs/api/customers/create?lang=python#create_customer-address

You could also use the API like so:您也可以像这样使用 API:

export const createStripeCustomer = (customerInfo) => {
    const address = customerInfo.address;
//The next line is for mapping the address as a key value
    const addressString = `address[line1]=${address.streetAndNumber}&address[city]=${address.city}&address[country]=${address.country}&address[postal_code]=${address.postalCode}`;
    const metadataString = `metadata[businessNumber]=${customerInfo.businessNumber}&metadata[manager]=${customerInfo.managerName}`
    const bodyToEncode = {
        email: customerInfo.email,
        name: customerInfo.salonName,
        phone: customerInfo.phoneNumber
    };
    const encodedBody = new URLSearchParams(bodyToEncode).toString() + `&${addressString}&${metadataString}`;
    return doPostUrlEncoded('https://api.stripe.com/v1/customers', encodedBody);
}

const doPostUrlEncoded = (url: string, body: string) => {
    return fetch(url, {
        method: 'POST',
        headers: {
            Accept: 'application/json',
            'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
            Authorization: 'Bearer ' + STRIPE_API_KEY
        },
        body: body
    }).then(function (response) {
        return response.json();
    }).catch(function (error) {
        console.error('Error:', error);
    });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM