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

回到顶部