Как продать продукт на стороне сервера через Stripe Elements - PullRequest
1 голос
/ 10 января 2020

Я создал тестовый продукт через https://dashboard.stripe.com/test/products. Этот продукт имеет идентификатор "prod _...". Я хотел бы продать этот продукт через Stripe Elements.

Я создал базовую форму c Stripe Elements, которая берет адрес электронной почты пользователя и информацию о его карточке на основе их руководства :

purchase.html

    <form action="/api/process_payment" method="post" id="payment-form">
      <label>Email</label>
      <input type="text" name="email">
      <div id="card-element">
        <!-- Elements will create input elements here -->
      </div>

      <!-- We'll put the error messages in this element -->
      <div id="card-errors" role="alert"></div>

      <button id="submit">Pay</button>
    </form>

stripe.js

var stripe = Stripe('pk_test_lp7ZS0B23jNmorIoW6Wj0Rs2009E1xTCwS');
var elements = stripe.elements();

// Set up Stripe.js and Elements to use in checkout form
var style = {
  base: {
    color: "#32325d",
  }
};

var card = elements.create("card", { style: style });
card.mount("#card-element");

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

var submitButton = document.getElementById('submit');

submitButton.addEventListener('click', function(ev) {
  stripe.confirmCardPayment(clientSecret, {
    payment_method: {
      card: card,
    }
  }).then(function(result) {
    if (result.error) {
      // Show error to your customer (e.g., insufficient funds)
      console.log(result.error.message);
    } else {
      // The payment has been processed!
      if (result.paymentIntent.status === 'succeeded') {
        // Show a success message to your customer
        // There's a risk of the customer closing the window before callback
        // execution. Set up a webhook or plugin to listen for the
        // payment_intent.succeeded event that handles any business critical
        // post-payment actions.
      }
    }
  });
});

Однако проблема, с которой я сталкиваюсь в этой системе, заключается в том, что мне нужно убедиться, что адрес электронной почты пользователя существует в моей базе данных. Поэтому мне нужно подтвердить оплату на стороне сервера, а не запускать stripe.confirmCardPayment (...).

Я подумал, что мог бы просто использовать flask для создания платежного намерения, когда они посещают мой URL покупки:

@app.route("/payment", methods=["GET"])
def payment():
    return render_template("payment.html)


@app.route("/api/process_payment", methods=["POST"])
def process_payment():
    data = request.get_json()
    if data["email"] ...:   # some check
        payment_intent = stripe.PaymentIntent.create(
            amount=2000,
            currency="gbp",
            payment_method_types=["card"],
        )
        stripe.PaymentIntent.confirm(payment_intent["id"],)
        # verify payment and give status to user
    else:
        # inform user of invalid email

Поэтому идея заключается в том, что, когда пользователь отправляет форму, он Отправьте данные в /api/process_payment, который на основе этих данных создает намерение оплаты, а затем обрабатывает платеж. Тем не менее, я не смог выработать способ фактического использования их платежной информации в рамках платежного намерения. Как я могу обработать их платежный сервер?

Кроме того, я хотел бы создать платежное намерение одного из моих продуктов, а не просто указать сумму. Как я могу это сделать?

1 Ответ

0 голосов
/ 10 января 2020

Нет способа создать PaymentIntent для Продукта или (в настоящий момент) использовать Продукты на стороне сервера; вы можете использовать их только с только для клиента Checkout .

Я думаю, что вы хотите сделать здесь, это использовать этот процесс , который сначала создает на стороне сервера Intent Payment Intent (после вашей «проверки действительной электронной почты»), а затем обрабатывает сбор платежных реквизитов и обработку любых битов аутентификации оплаты на стороне клиента.

...