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