登录
首页 >  Golang >  Go问答

Stripe 付款详情齐全,但付款仍不成功?

来源:stackoverflow

时间:2024-03-08 20:21:17 371浏览 收藏

golang学习网今天将给大家带来《Stripe 付款详情齐全,但付款仍不成功?》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

使用测试数据,我可以创建客户并附加付款方式,但我的所有订阅都保持这种状态。这是我当前创建订阅的代码:

// StripeCreateSubscription create a new subscription with fixed price for user
func StripeCreateSubscription(w http.ResponseWriter, r *http.Request) {
    if r.Method != "POST" {
        SendResponse(w, utils.MakeError("you can only POST to the stripe create customer route"), http.StatusMethodNotAllowed)
        return
    }

    // Decode the JSON payload
    type requestPayload struct {
        PaymentMethodID string `json:"paymentMethodId"`
        PriceID         string `json:"priceId"`
    }

    var payload requestPayload
    if err := json.NewDecoder(r.Body).Decode(&payload); err != nil {
        sendSystemError(w, fmt.Errorf("decode request payload: %v", err))
        return
    }

    // Get the user from the context of who made the request
    uid := r.Context().Value("user_id").(int)

    u := models.User{}
    if err := u.FindByID(uid); err != nil {
        sendSystemError(w, fmt.Errorf("find user by id: %v", err))
        return
    }
    if u.StripeCustomerID == "" {
        sendSystemError(w, errors.New("no customer for the user"))
        return
    }

    // Attach the payment method to the customer
    paymentParams := &stripe.PaymentMethodAttachParams{
        Customer: stripe.String(u.StripeCustomerID),
    }

    pm, err := paymentmethod.Attach(
        payload.PaymentMethodID,
        paymentParams,
    )

    if err != nil {
        sendSystemError(w, fmt.Errorf("attaching payment method failed: %v", err))
    }

    // Check if the user has any active subscriptions, and cancel the others if they're adding one.
    listParams := &stripe.SubscriptionListParams{
        Customer: u.StripeCustomerID,
        Status:   "all",
    }
    listParams.AddExpand("data.default_payment_method")

    iter := sub.List(listParams)
    subscriptions := iter.SubscriptionList().Data
    if len(subscriptions) > 0 {
        Log.Info(fmt.Sprintf("%v subscriptions found for %v. Cancelling...", len(subscriptions), u.Username))
        for i := 0; i < len(subscriptions); i++ {
            if subscriptions[i].Status != "canceled" && subscriptions[i].Status != "incomplete_expired" {
                Log.Info(fmt.Sprintf("Cancelling %v. Status %v", subscriptions[i].ID, subscriptions[i].Status))
                subscription, err := sub.Cancel(subscriptions[i].ID, nil)
                if err != nil {
                    sendSystemError(w, fmt.Errorf("cancel subscription: %v", err))
                    return
                }
                Log.Info(fmt.Sprintf("Cancelled %v", subscription.ID))
            }
        }
        Log.Info("Old subscriptions cancelled.")
        time.Sleep(5 * time.Second)
    }

    // Create subscription
    subscriptionParams := &stripe.SubscriptionParams{
        Customer: stripe.String(u.StripeCustomerID),
        Items: []*stripe.SubscriptionItemsParams{
            {
                Price: stripe.String(payload.PriceID),
            },
        },
        PaymentBehavior:      stripe.String("default_incomplete"),
        DefaultPaymentMethod: stripe.String(payload.PaymentMethodID),
    }
    subscriptionParams.AddExpand("latest_invoice.payment_intent")
    newSub, err := sub.New(subscriptionParams)
    if err != nil {
        sendSystemError(w, fmt.Errorf("new subscription: %v", err))
        return
    }

    // If everything looks good, then send some info back to the user
    output := map[string]interface{}{
        "subscriptionId": newSub.ID,
        "clientSecret":   newSub.LatestInvoice.PaymentIntent.ClientSecret,
    }
    SendResponse(w, output, 200)
}

我需要做什么才能让我的订阅完成付款?


正确答案


使用 default_incomplete (如 fixed-price subscription guide 所示)可在您创建订阅时显式地保持初始发票不被尝试。要完成设置,您需要从应用程序的客户端使用该客户端密钥 confirm the payment with the Payment Element(或 with the Card Element)。您似乎已经将 client_secret 发回,您正在使用它吗?

今天关于《Stripe 付款详情齐全,但付款仍不成功?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>