在将Stripe API集成到我的Meteor应用程序中时,无法返回有效结果

时间:2016-09-07 00:31:44

标签: meteor stripe-payments

这是纲要:

  • 我正在尝试异步运行我的Meteor应用程序上的Stripe API
  • 长话短说,一切正常(即订阅和收费正常创建并显示在我的Stripe仪表板中)
  • 发生错误时,错误会正常显示并通过用户友好的警报在客户端上显示
  • 当成功并创建客户订阅时,我遇到问题,结果不存在于客户端中,而是始终作为错误返回,尽管它是一个成功的过程

以下是我的方法在服务器上的样子:

createCustomer: function(token, email, plan){
  try{
    let createCustomer = Meteor.wrapAsync(stripe.customers.create);
    let result = createCustomer({
      source: token,
      email: email,
      plan: plan
    });

    let subscription = {
      customer: result.id,
      sub: result.subscriptions.data[0].id,
      plan: result.subscriptions.data[0].plan.name
    };

    Meteor.users.update({_id: Meteor.userId()}, {$set: subscription});

  } catch(error){
  if(error.code === "incorrect_cvc"){
    throw new Meteor.Error("incorrect_cvc", error.message);
  }
// More of such errors follows
  }
}

以下是客户端的样子:

 Stripe.card.createToken({
    number: number,
    cvc: cvc,
    exp_month: exp,
    exp_year: exp_year,
    address_zip: zip,
    address_country: country
  }, function(status, response){
    if(response.error){
      console.log("Make sure all fields are filled before submitting order.");
    } else{
      let token = response.id;
      Meteor.call("createCustomer", token, email, plan, function(error, result){
        if(result){
        console.log("Congratulations, everything worked!");
        } else{
          if(error.error === "incorrect_cvc"){
            console.log("oops, the CSV is incorrect");
          } 

          // More of such errors follow..
        }
      })
    }
  });

因此,一切都在有真正错误的时候起作用,它在服务器+客户端上都很好。当用户使用卡时,将创建费用并始终创建订阅。 HOWEVER ,当成功并且所有内容都点击正常时,我仍然会通过回调在客户端收到错误,结果永远不会true或触发。不知道为什么。

1 个答案:

答案 0 :(得分:1)

Meteor上没有100%,但我认为你的createCustomer方法实际上并没有返回任何内容,因此result中的(err, result)可能永远不会有任何内容?

正如评论中所提到的,您可能希望将这些步骤分开并将每个步骤包装在自己的try-catch集中,以便更好地隔离问题。

另外,我觉得您可能会将服务器端错误代码概括为:

throw new Meteor.Error(error.error, error.message);

我甚至可能会尝试这样做,至少在测试/开发期间 - 这样你实际上可以console.log()浏览器中的原始错误:

throw new Meteor.Error(error.error, error.message, JSON.stringify(error));