当尝试注册订阅时,Stripe错误:“Token is Not Supported”。

39

在任何地方都找不到关于这个特定错误的信息,请耐心等待。

我的Angular/NodeJS应用程序有一个支付页面(用于处理每月和每年的订阅),通过Stripe进行处理。

我已经在我的Stripe仪表板中创建了订阅类型(两种订阅:StarterAnnualStarterMonthly),并设置了处理程序,如下所示:

  var handler = StripeCheckout.configure({
          key: 'pk_test_qs8Ot1USopAZAyLN3gNXma0T',
          image: '/img/stripe-logo.png',
          locale: 'auto',
          email: $scope.user.email,
          token: function(token) {
            console.log(token)
            var tempObj = {
                stripeToken : token,
                email : $scope.user.email,
                cost : $scope.plan.price * 100
                plan : $scope.plan.name
            }
            $http.post('/api/makePayment', tempObj).then(function(data){
                console.log('stripe data', data);
            },function(err){
                console.log('stripe error', err);
            })
          }
        });

        handler.open({
          name: '<bizname>',
          description: $scope.plan.name,
          amount: $scope.plan.price * 100
        });

在我的Node路由中,我正在执行以下操作:

exports.makePayment = function(req,res){

  var stripeToken = req.body.stripeToken,
            email = req.body.email,
             cost = req.body.cost,
             plan = req.body.plan;

  var tempObj = {
    source: stripeToken,
    plan: plan,
    email: email
  }

  console.log(tempObj); // Everything looks fine in this log

  stripe.customers.create(tempObj, function(err, customer) {
    if(err){
      console.log("Stripe Error");
      console.log(err);
    }else{
      console.log(customer);
      res.status(200).send(customer);
    }

  });
}

当我尝试进行付款时,我遇到了以下问题:

Stripe Error
{ [Error: token is not supported.]
  type: 'StripeInvalidRequestError',
  stack: 'Error: token is not supported.\n    at Error._Error (/node_modules/stripe/lib/Error.js:12:17)\n    at Error.Constructor (/node_modules/stripe/lib/utils.js:105:13)\n    at Error.Constructor (/node_modules/stripe/lib/utils.js:105:13)\n    at Function.StripeError.generate (/node_modules/stripe/lib/Error.js:56:14)\n    at IncomingMessage.<anonymous> (/node_modules/stripe/lib/StripeResource.js:138:39)\n    at emitNone (events.js:72:20)\n    at IncomingMessage.emit (events.js:166:7)\n    at endReadableNT (_stream_readable.js:905:12)\n    at doNTCallback2 (node.js:452:9)\n    at process._tickCallback (node.js:366:17)',
  rawType: 'invalid_request_error',
  code: undefined,
  param: 'source',
  message: 'token is not supported.',
  detail: undefined,
  raw: 
   { type: 'invalid_request_error',
     message: 'token is not supported.',
     param: 'source',
     statusCode: 400,
     requestId: 'req_7hzY3mEgeM3nNJ' },
  requestId: 'req_7hzY3mEgeM3nNJ',
  statusCode: 400 }

我基本上只是从文档中直接使用代码,这里做错了什么?在创建订阅时,是否需要以不同方式设置东西才行?

1个回答

87
在Stripe的IRC频道上找到了答案:虽然官方文档中没有提到,但Stripe希望使用令牌ID,而不是完整的令牌。
对我来说,简单地传递source: stripeToken.id就解决了问题。

6
谢谢!在这些样本中不仅没有提到它,而且还是错误的。 - ScottCate
4
4个小时过去了。为什么这不在文档中?感谢亲爱的先生。 - user240993
1
谢谢!Stripe有很棒的文档,但是在处理令牌方面有些混乱。 - skwidbreth
这很有帮助。我卡住了一段时间。我的问题在于,当我发送 token.id 给客户端时,它不起作用,实际上除非我将整个令牌对象发送到服务器,然后将 token.id 发送到 Stripe 服务器端。 - Alex Grant
谢谢,我花了太多时间试图弄清楚为什么我的令牌无效。研究了文档,但没有任何涵盖这个问题的内容。 - Bodie Leonard
如果您正在使用PHP,则您获得的令牌可能是一个数组而不是一个对象,这种情况下,您需要使用$token['id'] - Justin Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接