【Golang】国内接入stripe支付

前言

接入了airswift支付,又来接stripe支付,真是被折腾的够呛。虽然整体流程是一样的,每个支付方式的逻辑和代码都有差异,希望自己的代码帮助大家少浪费时间

Stripe 是一个全球领先的在线支付处理平台,提供了丰富的 API 和工具,帮助开发者轻松集成支付功能。无论是电子商务网站、订阅服务,还是移动应用,Stripe 都能提供强大的支付解决方案。本文将详细介绍如何使用 Stripe 构建一个现代支付系统,涵盖从账户设置到 API 集成的各个方面。

官网

https://dashboard.stripe.com/

https://docs.stripe.com/

功能优点

1、订阅和定期付款

Stripe 支持订阅和定期付款功能,适合 SaaS 和会员制网站。

2、 多货币支持

Stripe 支持多种货币,方便国际化业务。

3、安全验证

Stripe 支持 3D 安全验证,提高支付安全性。

支付流程

1、客户端到服务器下订单,服务器向支付服务下支付订单
2、客户端拿到订单信息,跳转到支付web取支付
3、服务器查阅支付订单信息,或者接受回调,更新订单信息,初始化服务

stripe

服务器端-golang

向stripe支付获取clientSecret给客户端取支付,ID为订单标识

package main

import (
	"fmt"
	"github.com/shopspring/decimal"
	"github.com/stripe/stripe-go/v80"
	"log"

	"github.com/stripe/stripe-go/v80/paymentintent"
)

func main() {
	d := decimal.NewFromFloat(123.456789) // 将数值除以1并保留两位小数
	formatted := fmt.Sprintf("%.2f", d.InexactFloat64())

	log.Println(d.InexactFloat64())
	// 使用Sprintf格式化为两位小数
	fmt.Println(formatted)
	// 设置 Stripe 的 API 密钥
	stripe.Key = "sk_test_XXXXX"

	params2 := &stripe.PaymentIntentParams{
		Amount:   stripe.Int64(50),
		Currency: stripe.String(string(stripe.CurrencyUSD)),
		AutomaticPaymentMethods: &stripe.PaymentIntentAutomaticPaymentMethodsParams{
			Enabled: stripe.Bool(true),
		},
	}

	pi, err := paymentintent.New(params2)
	log.Printf("pi.New: %v", pi.ClientSecret)

	if err != nil {
		log.Printf("pi.New: %v", err)
		return
	}

	log.Printf("%v %v", pi.ID, pi.ClientSecret)
}

服务器 Python

1、 创建 PaymentIntent

在后端创建一个 PaymentIntent 对象,并返回 client_secret 给前端:

import stripe
stripe.api_key = 'your-secret-key'

def create_payment_intent(amount, currency):
    intent = stripe.PaymentIntent.create(
        amount=amount,
        currency=currency,
    )
    return intent.client_secret

2、处理支付结果

在前端确认支付后,后端可以监听 Stripe 的 webhook 来处理支付结果:

from flask import Flask, request
import stripe

app = Flask(__name__)
stripe.api_key = 'your-secret-key'

@app.route('/webhook', methods=['POST'])
def webhook():
    payload = request.data
    sig_header = request.headers['Stripe-Signature']

    try:
        event = stripe.Webhook.construct_event(
            payload, sig_header, 'your-webhook-secret'
        )
    except ValueError as e:
        return 'Invalid payload', 400
    except stripe.error.SignatureVerificationError as e:
        return 'Invalid signature', 400

    if event['type'] == 'payment_intent.succeeded':
        payment_intent = event['data']['object']
        handle_payment_success(payment_intent)

    return 'Success', 200

def handle_payment_success(payment_intent):
    # 处理支付成功的逻辑
    pass

注意点

1、stripe支付是NXM的配置 webhook回调(N个应用,M个回调)
2、应用的订单回调会回调到M个回调应用里
3、stripe的支付回调事件可以根据需求来定义,不需要处理的可以很方便的定制

后话

stripe的设计方式和国内的支付方式有些差异,导致接入过程中存在很多不好理解的地方。接入的过程需要投入精力和时间,期望我的分享能帮助到你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值