Go 将费用与带条纹的客户关联

Go 将费用与带条纹的客户关联,go,stripe-payments,Go,Stripe Payments,我正在创建一个简单的网页,其中将提示用户输入他们的卡信息,生成一个令牌,并将其发送到我的后端Go web服务器,该服务器处理该令牌的付款。我遇到的问题是,当我获得令牌时,我尝试创建一个客户,并将源设置为Stripe创建的令牌,但每次我都会得到以下响应: charge failed: {"type":"invalid_request_error","message":"Customer cus_######### does not have a linked source with ID tok_

我正在创建一个简单的网页,其中将提示用户输入他们的卡信息,生成一个令牌,并将其发送到我的后端Go web服务器,该服务器处理该令牌的付款。我遇到的问题是,当我获得令牌时,我尝试创建一个客户,并将源设置为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 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)

另外,如果我删除了这个示例中的客户部分,那么使用上面的代码就可以正常地支付费用。它只是没有明显地将费用与客户联系起来。然而,一旦我试图让客户付费,它就失败了

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

customerParams := &stripe.CustomerParams{
    Desc:          "Customer for xyz.com",
    Email:         "test@email.com",
    Source:        "test_visa"
}
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)
有关测试卡和来源的更多信息,请参见:

您当然希望在生产应用程序中使用元素或签出来标记卡号,从而确保原始信用卡号只传递给Stripe而不是应用程序服务器:

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

customerParams := &stripe.CustomerParams{
    Desc:          "Customer for xyz.com",
    Email:         "test@email.com",
    Source:        "test_visa"
}
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)

我对条带订阅也有同样的问题

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

  • 您需要在事件发生后将来源添加/关联到客户,或者
  • 使用新令牌作为签出源更新现有客户,即

    func updateCustomer(客户ID、电子邮件、源字符串)(cus*stripe.Customer,err error){
    参数:=&stripe.CustomerParams{
    电邮:电邮,,
    }
    参数设置源(源)
    cus,err=customer.Update(custID,params)
    返回
    }


  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:那么我如何为新客户创建付款来源,然后将其与费用挂钩?我已经将签出令牌化了卡号。通过在“创建客户”请求中的
    source
    参数中传递令牌,您可以同时创建客户的支付源。由于是新客户,他们只有一个付款来源,您可以通过传递
    customer=cus.ID
    对该来源进行收费,如下所述。如果以后您有一个拥有多个来源的客户,那么您可以通过将
    customer
    source
    传递到“创建费用”来指定使用哪一个来源:我正在创建客户请求中设置来源。我强烈建议使用以下链接写入条带支持:如果您有来自日志的请求ID,这将非常有用。当你查看仪表板日志时,它是URL中的req_XXX。我有类似的代码,去年用于订阅,但今天给了我相同的错误。