golang统一多支付服务提供商接口的在线支付处理插件库sleet的使用

Golang统一多支付服务提供商接口的在线支付处理插件库Sleet的使用

简介

Sleet是一个支付抽象库,可以通过统一的接口与不同的支付服务提供商(Payment Service Providers, PsP)进行交互。

安装

go get github.com/BoltApp/sleet

方法原理

在可能的情况下,我们尽量使用PsP API的原生Golang实现。我们还假设调用者可以传递原始信用卡信息(即符合PCI标准)。

支持的网关API调用

  1. 授权(Authorize)
  2. 捕获(Capture)
  3. 作废(Void)
  4. 退款(Refund)

Webhooks支持

我们支持将PsP Webhook通知抽象为通用接口。

PsP支持矩阵

PsP 网关API Webhooks
Adyen ✅ ❌
Authorize.Net ✅ ❌
Braintree ✅ ❌
CyberSource ✅ ❌
Checkout.com ✅ ❌
FirstData ✅ ❌
NMI ✅ ❌
Orbital ✅ ❌
RocketGate ✅ ❌
Stripe ✅ ❌

运行测试

单元测试

go test -v -tags=unit $(go list ./... | grep -v integration-tests)

集成测试

需要设置以下环境变量:

export ADYEN_USERNAME="YOUR_ADYEN_WEBSERVICE_USERNAME"
export ADYEN_ACCOUNT="YOUR_ADYEN_MERCHANT_ACCOUNT"
export ADYEN_PASSWORD="YOUR_ADYEN_WEBSERVICE_PASSWORD"
export STRIPE_TEST_KEY="YOUR_STRIPE_API_KEY"
export AUTH_NET_LOGIN_ID="YOUR_AUTHNET_LOGIN"
export AUTH_NET_TXN_KEY="YOUR_AUTHNET_TXN_KEY"
export BRAINTREE_MERCHANT_ID="YOUR_BRAINTREE_MERCHANT_ACCOUNT"
export BRAINTREE_PUBLIC_KEY="YOUR_BRAINTREE_PUBLIC_KEY"
export BRAINTREE_PRIVATE_ID="YOUR_BRAINTREE_PRIVATE_KEY"
export CYBERSOURCE_ACCOUNT="YOUR_CYBS_ACCOUNT"
export CYBERSOURCE_API_KEY="YOUR_CYBS_KEY"
export CYBERSOURCE_SHARED_SECRET="YOUR_CYBS_SECRET"
export NMI_SECURITY_KEY="YOUR_NMI_PRIVATE_KEY"
export CHECKOUTCOM_TEST_KEY="YOUR_CHECKOUTCOM_PRIVATE_KEY"
export CHECKOUTCOM_TEST_KEY_WITH_PCID="YOUR_CHECKOUTCOM_PRIVATE_KEY_WITH_PROCESSING_CHANNEL_ID"
export CHECKOUTCOM_TEST_PCID="YOUR_CHECKOUTCOM_PROCESSING_CHANNEL_ID"

然后运行测试:

go test ./integration-tests/

授权+捕获代码示例

import (
  "github.com/BoltApp/sleet"
  "github.com/BoltApp/sleet/gateways/authorize_net"
)

// 使用自己的凭证生成客户端
client := authorize_net.NewClient("AUTH_NET_LOGIN_ID", "AUTH_NET_TXN_KEY")

amount := sleet.Amount{
  Amount: 100,
  Currency: "USD",
}
card := sleet.CreditCard{
  FirstName: "Bolt",
  LastName: "Checkout",
  Number: "4111111111111111",
  ExpMonth: 8,
  EpxYear: 2010,
  CVV: "000",
}
streetAddress := "22 Linda St."
locality := "Hoboken"
regionCode := "NJ"
postalCode := "07030"
countryCode := "US"
address := sleet.BillingAddress{
  StreetAddress1: &streetAddress,
  Locality:       &locality,
  RegionCode:     &regionCode,
  PostalCode:     &postalCode,
  CountryCode:    &countryCode,
}

// 要获取特定的响应头,将它们添加到请求选项中
// 它们将被附加到AuthorizationResponse
options := make(map[string]interface{})
options["ResponseHeader"] = []string{"x-test-header"}

authorizeRequest := sleet.AuthorizationRequest{
  Amount: &amount,
  CreditCard: &card,
  BillingAddress: &address,
  Options: options,
}
authorizeResponse, _ := client.Authorize(&authorizeRequest)

captureRequest := sleet.CaptureRequest{
  Amount:               &amount,
  TransactionReference: authorizeResponse.TransactionReference,
}
client.Capture(&captureRequest)

这个示例展示了如何使用Sleet库与Authorize.Net支付网关进行交互,包括创建授权请求和捕获支付。你可以根据需要替换为其他支持的支付网关。


更多关于golang统一多支付服务提供商接口的在线支付处理插件库sleet的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang统一多支付服务提供商接口的在线支付处理插件库sleet的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Sleet统一多支付服务提供商接口

Sleet是一个Golang库,用于统一不同支付服务提供商的接口,简化在线支付处理。它提供了标准化的API来处理支付、退款等操作,支持多种支付网关如Stripe、Braintree、Adyen等。

安装Sleet

go get github.com/BoltApp/sleet

基本使用

1. 初始化客户端

package main

import (
	"github.com/BoltApp/sleet"
	"github.com/BoltApp/sleet/gateways/adyen"
	stripe "github.com/BoltApp/sleet/gateways/stripe"
)

func main() {
	// 初始化Stripe客户端
	stripeKey := "your_stripe_api_key"
	stripeClient := stripe.NewClient(stripeKey)

	// 初始化Adyen客户端
	adyenClient := adyen.NewClient(
		"your_adyen_api_key",
		"your_merchant_account",
		sleet.EnvironmentSandbox,
	)
	
	// 其他支付网关类似...
}

2. 创建支付请求

amount := sleet.Amount{
	Amount:   1000, // 10.00美元(以分为单位)
	Currency: "USD",
}

address := &sleet.Address{
	StreetAddress1: "123 Main St",
	StreetAddress2: "",
	Locality:       "San Francisco",
	RegionCode:     "CA",
	PostalCode:     "94105",
	CountryCode:    "US",
}

creditCard := sleet.CreditCard{
	FirstName:       "John",
	LastName:        "Doe",
	Number:          "4111111111111111",
	ExpirationMonth: 12,
	ExpirationYear:  2025,
	CVV:            "123",
	BillingAddress:  address,
}

request := sleet.AuthorizationRequest{
	Amount:               amount,
	CreditCard:           creditCard,
	BillingAddress:       address,
	Channel:              "Web",
	MerchantOrderReference: "order_123",
}

3. 处理支付授权

// 使用Stripe处理支付
auth, err := stripeClient.Authorize(&request)
if err != nil {
	// 处理错误
}

// 或者使用Adyen处理支付
auth, err := adyenClient.Authorize(&request)
if err != nil {
	// 处理错误
}

if auth.Success {
	// 支付授权成功
	fmt.Printf("Authorization successful. Transaction ID: %s\n", auth.TransactionReference)
} else {
	// 支付授权失败
	fmt.Printf("Authorization failed. Error: %s\n", auth.ErrorCode)
}

4. 捕获支付

captureRequest := sleet.CaptureRequest{
	Amount:               &amount, // 可选,如果为空则捕获全部金额
	TransactionReference: auth.TransactionReference,
}

captureResponse, err := stripeClient.Capture(&captureRequest)
if err != nil {
	// 处理错误
}

if captureResponse.Success {
	// 捕获成功
}

5. 处理退款

refundRequest := sleet.RefundRequest{
	Amount:               &amount, // 可选,如果为空则退款全部金额
	TransactionReference: auth.TransactionReference,
	MerchantOrderReference: "refund_order_123",
}

refundResponse, err := stripeClient.Refund(&refundRequest)
if err != nil {
	// 处理错误
}

if refundResponse.Success {
	// 退款成功
}

高级功能

1. 支持多种支付网关

// 定义支付网关接口
type PaymentProcessor interface {
	Authorize(*sleet.AuthorizationRequest) (*sleet.AuthorizationResponse, error)
	Capture(*sleet.CaptureRequest) (*sleet.CaptureResponse, error)
	Refund(*sleet.RefundRequest) (*sleet.RefundResponse, error)
	Void(*sleet.VoidRequest) (*sleet.VoidResponse, error)
}

// 根据配置选择支付网关
func GetPaymentProcessor(gateway string, config map[string]string) PaymentProcessor {
	switch gateway {
	case "stripe":
		return stripe.NewClient(config["api_key"])
	case "adyen":
		return adyen.NewClient(config["api_key"], config["merchant_account"], sleet.EnvironmentSandbox)
	// 其他网关...
	default:
		panic("unsupported payment gateway")
	}
}

2. 处理3D Secure支付

// 在授权请求中启用3D Secure
request := sleet.AuthorizationRequest{
	Amount:               amount,
	CreditCard:           creditCard,
	BillingAddress:       address,
	Channel:              "Web",
	MerchantOrderReference: "order_123",
	ThreeDS: &sleet.ThreeDS{
		Required:       true,
		BrowserInfo:    getBrowserInfo(), // 需要提供浏览器信息
		MethodComplete: false,
	},
}

auth, err := client.Authorize(&request)
if err != nil {
	// 处理错误
}

if auth.ThreeDS != nil && auth.ThreeDS.MethodURL != "" {
	// 需要完成3D Secure认证
	// 重定向用户到MethodURL进行认证
}

// 认证完成后,再次提交授权
request.ThreeDS.MethodComplete = true
auth, err = client.Authorize(&request)

3. 处理webhook

// 验证webhook签名
func handleWebhook(w http.ResponseWriter, r *http.Request) {
	body, err := io.ReadAll(r.Body)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	// 验证签名(以Stripe为例)
	event, err := webhook.ConstructEvent(body, r.Header.Get("Stripe-Signature"), stripeWebhookSecret)
	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	switch event.Type {
	case "payment_intent.succeeded":
		// 处理支付成功事件
	case "charge.refunded":
		// 处理退款事件
	// 其他事件...
	}
}

最佳实践

  1. 错误处理:始终检查错误并适当处理
  2. 日志记录:记录所有支付操作和响应
  3. 重试机制:对于暂时性错误实现重试逻辑
  4. 测试:使用各支付网关的沙箱环境进行充分测试
  5. 监控:监控支付成功率、失败率和响应时间

Sleet通过统一接口简化了多支付网关的集成,使开发者可以更专注于业务逻辑而不是支付网关的差异。

回到顶部