Files
full/module/finance/wallet/internal/logic/alipay/alipay.go
2026-09-22 21:15:34 +08:00

77 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package alipay
import (
"context"
"strconv"
"bsm/full/module/finance/wallet/internal/config"
"github.com/go-pay/gopay"
"github.com/go-pay/gopay/alipay"
)
type AliPay struct {
ctx context.Context
Client *alipay.Client
Body *gopay.BodyMap
}
func NewAlipay() (*AliPay, error) {
// 初始化支付宝客户端
// appid应用ID
// privateKey应用私钥支持PKCS1和PKCS8
// isProd是否是正式环境
client, err := alipay.NewClient(config.Spec.Alipay.AppID, config.Spec.Alipay.PrivateKey, config.Spec.Alipay.IsProd)
if err != nil {
return nil, err
}
// 调试开关默认关闭,避免渠道请求/响应(含金额、订单号)写入进程日志
client.DebugSwitch = gopay.DebugOff
// 设置支付宝请求 公共参数
client.SetLocation(alipay.LocationShanghai) // 设置时区,不设置或出错均为默认服务器时间
client.SetCharset(alipay.UTF8) // 设置字符编码,不设置默认 utf-8
client.SetSignType(alipay.RSA2) // 设置签名类型,不设置默认 RSA2
client.SetReturnUrl(config.Spec.Alipay.ReturnURL) // 设置返回URL
client.SetNotifyUrl(config.Spec.Alipay.NotifyURL) // 设置异步通知URL
// 自动同步验签(只支持证书模式)
// 传入 alipayCertPublicKey_RSA2.crt 内容
client.AutoVerifySign([]byte(config.Spec.Alipay.PublicKeyRsa2Byte))
// 公钥证书模式
err = client.SetCertSnByPath(config.Spec.Alipay.CertPublicKey, config.Spec.Alipay.CertRoot, config.Spec.Alipay.CertPublicKeyRsa2)
if err != nil {
return nil, err
}
return &AliPay{
ctx: context.Background(),
Client: client,
Body: &gopay.BodyMap{},
}, nil
}
// SetBody 组装支付宝下单公共参数
// productCodeWAP 场景为 QUICK_WAP_WAYAPP 场景为 QUICK_MSECURITY_PAY
func (srv *AliPay) SetBody(body, orderNo string, amount int64, productCode string) {
// 支付宝要求 total_amount 为两位小数的元字符串,不能用整数除法截断
totalAmount := strconv.FormatFloat(float64(amount)/100, 'f', 2, 64)
srv.Body.Set("subject", config.Spec.Wallet.Name).
Set("body", body). //finance_payment表的identity
Set("product_code", productCode).
Set("out_trade_no", orderNo).
Set("total_amount", totalAmount).
Set("timeout_express", "60m").
Set("quit_url", config.Spec.Alipay.QuitURL)
}
func (srv *AliPay) TradeWapPay() (string, error) {
result, err := srv.Client.TradeWapPay(srv.ctx, *srv.Body)
return result, err
}
func (srv *AliPay) TradeAppPay() (string, error) {
result, err := srv.Client.TradeAppPay(srv.ctx, *srv.Body)
return result, err
}