首页 文章

使用Stripe将客户的费用与客户相关联

提问于
浏览
0

我正在创建一个简单的网页,其中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)

此外,如果我删除此示例的客户部分,使用上述代码就可以收取费用 . 它显然不会将费用与客户联系起来 . 但是,一旦我尝试将客户设置为收费,它就会失败 .

3 回答

  • 0

    事实证明,在我已经设置了我正在收费的新客户的来源之后,在充电参数上设置了令牌源 . 以下工作按预期创建新客户并将新费用与客户关联:

    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

  • 0

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

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

    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 }

相关问题