Stripe + webtask.io не работает после обновления до Node 8 - PullRequest
0 голосов
/ 05 июня 2018

Я использую webtask.io для создания заряда Stripe на основе примера Thomasz здесь , но после того, как они обновились с Узла 4 до Узла 8, это больше не работает.Есть идеи, как заставить это работать снова?

var stripe = require('stripe');

module.exports = function (ctx, req, res) {
    stripe(ctx.secrets.stripeSecretKey).charges.create({
        amount: ctx.body.amount * 100,
        currency: 'gbp',
        source: ctx.body.stripeToken,
        description: 'Test Payment',
    }, function (error, charge) {
        var status = error ? 400 : 200;
        var message = error ? error.message : '<script>window.location.replace("' + ctx.body.redirectUrl + '");</script>'; 
        res.writeHead(status, { 'Content-Type': 'text/html' });
        return res.end('<h1>' + message + '</h1>');
    });
};

Ошибка:

{
    "code": 500,
    "error": "Script generated an unhandled synchronous exception.",
    "details": "TypeError: Cannot read property 'amount' of undefined",
    "name": "TypeError",
    "message": "Cannot read property 'amount' of undefined",
    "stack": "TypeError: Cannot read property 'amount' of undefined\n    at module.exports (/data/io/ea441d92-6f8c-46b0-a9a9-6c8098f03aac/webtask.js:5:26)\n    at Async.waterfall (/data/sandbox/lib/sandbox.js:519:33)\n    at nextTask (/data/sandbox/node_modules/async/dist/async.js:5324:14)\n    at next (/data/sandbox/node_modules/async/dist/async.js:5331:9)\n    at /data/sandbox/node_modules/async/dist/async.js:969:16\n    at Async.waterfall (/data/sandbox/lib/sandbox.js:408:24)\n    at nextTask (/data/sandbox/node_modules/async/dist/async.js:5324:14)\n    at next (/data/sandbox/node_modules/async/dist/async.js:5331:9)\n    at /data/sandbox/node_modules/async/dist/async.js:969:16\n    at _combinedTickCallback (internal/process/next_tick.js:138:11)"
}

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Решено!

Если вы используете Full HTTP control (context, req, res), тело запроса не будет обработано, если только требование pb токена webtaskустановлен на 1.

Для этого вам нужно создать свой скрипт, используя:

wt create my-script.js --secret stripeSecretKey={stripe_api_key} --parse-body --dependency stripe@3.3.4 --ignore-package-json
0 голосов
/ 05 июня 2018

Проблема в том, что в теле запроса отсутствует свойство amount, которое Stripe Checkout отправляет в веб-задачу.Это сделано намеренно - свойство data-amount влияет только на сумму, которая показана пользователю.Причина этого заключается в том, что вы не должны использовать значение из внешнего интерфейса, чтобы определить сумму заряда.Для меня было бы тривиально открыть мой браузер devtools и изменить сумму, и теперь вместо того, чтобы платить 9,99 долларов за ваш продукт, я плачу 1 доллар:)

Чтобы обойти это, у вас есть два варианта:

  • Установите аргумент amount stripe.charges.create в вашей веб-задаче бэкэнда на значение напрямую.Это рекомендуемый подход, если вы пытаетесь взимать с клиента определенную сумму.
  • Используйте скрытый ввод в форме, как показано ниже.Обратите внимание, что в этом есть проблема, описанная выше, когда пользователь может изменить значение.Это не обязательно проблема в случае использования «пожертвования» (например, в примере, на который вы ссылаетесь), так как вы хотите, чтобы пользователь все равно выбирал сумму (в этом случае вместо этого просто используйте обычный, не скрытый ввод).

Скрытый ввод:

<form action="your-server-side-code" method="POST">
  <input type="hidden" name="amount" id="amount" value="999">
  <script
    src="https://checkout.stripe.com/checkout.js" class="stripe-button"
    data-key="API_KEY"
    data-amount="999"
    data-name="Test"
    data-description="Widget"
    data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
    data-locale="auto"
    data-currency="usd">
  </script>
</form>
...