Почему полосовые платежи не завершены? - PullRequest
0 голосов
/ 08 ноября 2019

Мои платежи Stripe отображаются на моей панели инструментов, но имеют статус «Незавершенные», а при наведении курсора отображается подсказка «Клиент не указал свой способ оплаты». Я думал, что учел метод оплаты в методе sessions.create ().

Мой компонент Angular создает StripeCheckout и отправляет данные сеанса в мой API. Затем API включает его в ответ браузеру (моей первой попыткой было использование этого sessionId для перенаправления на извлечение, но я выбрал его, потому что он был более плавным).

Angular / TS StripeCheckout и обработчик:

let headers = new Headers();
    headers.append("Content-Type", "application/json");
    headers.append(
      "authentication",
      `Bearer ${this.authServ.getAuthenticatedUserToken()}`
    );

    this.handler = StripeCheckout.configure({
      key: environment.stripe_public_key,
      locale: "auto",
      source: async source => {
        this.isLoading = true;
        this.amount = this.amount * 100;
        this.sessionURL = `${this.stringValServ.getCheckoutSessionStripeURL}/${this.activeUser.id}/${this.amount}`;
        const session = this.http
          .get(this.sessionURL, {
            headers: new HttpHeaders({
              "Content-Type": "application/json",
              authentication: `Bearer ${this.authServ.getAuthenticatedUserToken()}`
            })
          })
          .subscribe(res => {
            console.log(res);
          });
      }
    });
    //so that the charge is depicted correctly on the front end
    this.amount = this.amount / 100;
  }

  async checkout(e) {
    this.stripeAmountEvent.emit(this.amount);
    this.handler.open({
      name: "[REDACTED]",
      amount: this.amount * 100,
      description: this.description,
      email: this.activeUser.email
    });
    e.preventDefault();
  }

NodeJS API забирает его

exports.getCheckoutSession = catchAsync(async (req, res, next) => {
  const currentUserId = req.params.userId;
  const paymentAmount = req.params.amount;
  const user = await User.findById(currentUserId);

  const session = await stripe.checkout.sessions.create({
    payment_method_types: ['card'],
    success_url: `${process.env.CLIENT_URL}`,
    cancel_url: `${process.env.CLIENT_URL}`,
    customer_email: user.email,
    client_reference_id: user.userId,
    line_items: [
      {
        name: `Donation from ${user.userName}`,
        description: '[REDACTED]',
        amount: paymentAmount,
        currency: 'usd',
        quantity: 1,
        customer: user.userId
      }
    ]
  });

  const newPayment = await Payment.create({
    amount: paymentAmount,
    createdAt: Date.now(),
    createdById: user._id
  });

  res.status(200).send({
    status: 'success',
    session
  });
});

Платеж создается в моей БД, и платеж отображается на моей информационной панели Stripe. Платежи отображаются как «Незавершенные», когда я ожидал, что они будут списаны с карты.

Заранее спасибо.

1 Ответ

1 голос
/ 09 ноября 2019

Последняя версия Оформление заказа позволяет принимать платежи непосредственно на странице оплаты, размещенной на Stripe. Это включает в себя сбор информации о карте, отображение того, что находится в вашей корзине, и обеспечение оплаты покупателем перед перенаправлением на ваш сайт.

В настоящий момент, однако, ваш код неправильно смешивает несколько продуктов в одном месте. Код, который вы используете на стороне клиента, использует Legacy Checkout . Это более старая версия продукта Stripe, которую можно использовать для безопасного сбора информации о карте. Это уже не то, что вы должны использовать.

Затем на стороне сервера вы используете более новую версию Checkout , создав Session. Эта часть верна, но вы, кажется, никогда ее не используете.

Вместо этого вам нужно создать серверную часть Session, а затем клиентскую часть перенаправить только на Stripe, используя redirectToCheckout, как описано здесь .

...