58 lines
1.8 KiB
Go
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 + "'")
|
|
}
|