使用条纹将费用与客户相关联

时间:2017-04-21 14:53:35

标签: go stripe-payments

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

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

https://localhost/wp-json/wc/v1/orders?consumer_key=ck_xxxxxxxxxxxxxx&consumer_secret=xxxxxxxxxxxxxxx

答案 1 :(得分:0)

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

/customers/new

有关测试卡和来源的更多信息,请访问:https://stripe.com/docs/testing#cards

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

答案 2 :(得分:0)

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

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

  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 }