【问题标题】:Associate a charge with a customer with Stripe使用 Stripe 将费用与客户相关联
【发布时间】:2017-09-18 15:21:25
【问题描述】:

我正在创建一个简单的网页,Stripe Checkout 将提示用户输入他们的卡信息,生成一个令牌,并将其发送到我的后端 Go 网络服务器,该服务器处理该令牌的支付。我遇到的问题是,当我获得令牌时,我尝试创建一个客户并将源设置为 Stripe 创建的令牌,但我每次都会收到此响应:

charge failed: {"type":"invalid_request_error","message":"Customer cus_######### does not have a linked source with ID tok_#########.","code":"missing","param":"source","request_id":"req_######","status":404}

创建客户并将卡与该客户相关联工作正常。但是,根据生成的令牌 Stripe 向卡收费失败。即使在我的 Stripe Dashboard 中该客户的日志中,它也会显示尝试收费。因此,它试图将费用与正确的客户相关联,但由于生成令牌时没有考虑特定客户而失败?我不确定发生了什么。

我在后端接受令牌并处理所有内容的代码如下:

stripe.Key = "sk_test_################"

customerParams := &stripe.CustomerParams{
    Desc:          "Customer for xyz.com",
    Email:         "test@email.com",
}

err := customerParams.SetSource("tok_####################")
if err != nil {
    return nil, err
}

cus, err := customer.New(customerParams)
if err != nil {
    return nil, err
}

// Charge the user's card
cp := &stripe.ChargeParams{
    Amount:   100,
    Currency: "usd",
    Desc:     "some description",
    Customer: cus.ID,
}

err = cp.SetSource("tok_####################")
if err != nil {
    return nil, err
}

err = charge.New(cp)

另外,如果我删除了这个例子的客户部分,那么上面的代码就可以正常收费了。它只是没有明显地将费用与客户联系起来。但是,一旦我尝试向客户收费,它就会失败。

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。见:How to create a Minimal, Complete, and Verifiable example.

标签: go stripe-payments


【解决方案1】:

原来问题是在我已经设置了我要收费的新客户的来源之后,在收费参数上设置了令牌来源。以下内容按预期工作以创建新客户并将新费用与客户相关联:

stripe.Key = "sk_test_################"

customerParams := &stripe.CustomerParams{
    Desc:          "Customer for xyz.com",
    Email:         "test@email.com",
}

err := customerParams.SetSource("tok_####################")
if err != nil {
    return nil, err
}

cus, err := customer.New(customerParams)
if err != nil {
    return nil, err
}

// Charge the user's card
cp := &stripe.ChargeParams{
    Amount:   100,
    Currency: "usd",
    Desc:     "some description",
    Customer: cus.ID,
}

err = charge.New(cp)

【讨论】:

  • 我有类似的代码,去年用于订阅,但今天给我同样的错误。
【解决方案2】:

这是正常的:您刚刚创建的客户没有附加付款来源,因此他们无法支付您的 1.00 美元费用。例如,您可以通过在创建客户时使用其中一个测试令牌来使上述操作成功:

customerParams := &stripe.CustomerParams{
    Desc:          "Customer for xyz.com",
    Email:         "test@email.com",
    Source:        "test_visa"
}

更多关于测试卡和来源的信息:https://stripe.com/docs/testing#cards

您当然希望在生产应用程序中使用 Elements 或 Checkout 来标记卡号,以确保原始信用卡号仅传递到 Stripe 而不是您的应用程序服务器: https://stripe.com/docs/elements

【讨论】:

  • 那么我怎样才能为该新客户创建一个付款来源,然后将其与费用相关联?我已经有 Checkout 对卡号进行标记。
  • 通过在“创建客户”请求中传递source 参数中的令牌,您可以同时创建客户的付款来源。由于是新客户,他们将只有一个付款来源,您可以通过customer=cus.ID 向该来源收费,如下所示。如果稍后您的客户有多个来源,那么您可以通过将 customersource 都传递给“创建费用”来指定要使用哪一个:stripe.com/docs/api/#create_charge-customer stripe.com/docs/api/#create_charge-source
  • 我在创建客户请求中设置源。那是行不通的。
  • 我强烈建议您使用此链接写入 Stripe 支持:support.stripe.com/email/login 如果您有来自日志的请求 ID,这将非常有帮助。当您查看仪表板日志时,它是 URL 中的 req_XXX。
【解决方案3】:

我在条带订阅方面遇到了同样的问题。

底线,如果客户已经存在但没有有效的付款来源;

  1. 您要么需要在Attaching a Source to an existing Customer object 事后向客户添加/关联来源,要么,
  2. 使用新令牌作为结帐来源更新现有客户,即 update customer

    func updateCustomer(custID, email, source string) (cus *stripe.Customer, err error){ params := &stripe.CustomerParams{ Email:email, } params.SetSource(source) cus, err = customer.Update(custID, params) return }

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 2012-09-15
    • 2020-12-13
    • 2017-09-19
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多