Files
waf-platform/EdgeAPI/internal/payments/utils.go
2026-02-04 20:27:13 +08:00

58 lines
1.8 KiB
Go

// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package payments
import (
"crypto/sha256"
"fmt"
"github.com/TeaOSLab/EdgeAPI/internal/db/models/accounts"
"github.com/TeaOSLab/EdgeAPI/internal/errors"
"github.com/TeaOSLab/EdgeCommon/pkg/userconfigs"
"github.com/iwind/TeaGo/types"
"net/url"
"sort"
"strings"
"time"
)
// GeneratePayURL PayURL 构造支付URL
func GeneratePayURL(order *accounts.UserOrder, method *accounts.OrderMethod) (payURL string, err error) {
if method == nil || !method.IsOn {
return "", errors.New("invalid method with id '" + types.String(method.Id) + "'")
}
// 内置支付方式
switch method.ParentCode {
case userconfigs.PayMethodAlipay: // 支付宝
return NewAlipayPayment().GeneratePayURL(order, method)
}
// 自定义
var args = []string{}
args = append(args, "EdgeOrderMethod="+url.QueryEscape(method.Code))
args = append(args, "EdgeOrderCode="+url.QueryEscape(order.Code))
args = append(args, "EdgeOrderTimestamp="+types.String(time.Now().Unix()))
args = append(args, "EdgeOrderAmount="+fmt.Sprintf("%.2f", order.Amount))
sort.Strings(args)
var signArgs = append([]string{}, args...)
signArgs = append(signArgs, method.Secret)
var sign = fmt.Sprintf("%x", sha256.Sum256([]byte(strings.Join(signArgs, "&"))))
args = append(args, "EdgeOrderSign="+sign)
if strings.Contains(method.Url, "?") {
return method.Url + "&" + strings.Join(args, "&"), nil
}
return method.Url + "?" + strings.Join(args, "&"), nil
}
func Verify(payMethod userconfigs.PayMethod, formValues url.Values) (orderId int64, err error) {
switch payMethod {
case userconfigs.PayMethodAlipay: // 支付宝
return NewAlipayPayment().Verify(formValues)
}
return 0, errors.New("invalid payment method '" + payMethod + "'")
}