one-api/payment/gateway/epay/client.go
2024-06-05 13:30:12 +08:00

81 lines
1.7 KiB
Go

package epay
import (
"crypto/md5"
"encoding/hex"
"sort"
"strings"
"github.com/mitchellh/mapstructure"
)
type Client struct {
PayDomain string `json:"pay_domain"`
PartnerID string `json:"partner_id"`
Key string `json:"key"`
}
// FormPay 表单支付
func (c *Client) FormPay(args *PayArgs) (string, map[string]string, error) {
formPayArgs := map[string]string{
"type": string(args.Type),
"pid": c.PartnerID,
"out_trade_no": args.OutTradeNo,
"notify_url": args.NotifyUrl,
"return_url": args.ReturnUrl,
"name": args.Name,
"money": args.Money,
// "device": string(args.Device),
}
formPayArgs["sign"] = c.Sign(formPayArgs)
formPayArgs["sign_type"] = FormArgsSignType
domain := strings.TrimSuffix(c.PayDomain, "/")
return domain + FormSubmitUrl, formPayArgs, nil
}
func (c *Client) Verify(params map[string]string) (*PaymentResult, bool) {
sign := params["sign"]
tradeStatus := params["trade_status"]
if sign == "" || tradeStatus != TradeStatusSuccess {
return nil, false
}
if sign != c.Sign(params) {
return nil, false
}
var paymentResult PaymentResult
mapstructure.Decode(params, &paymentResult)
return &paymentResult, true
}
// Sign 签名
func (c *Client) Sign(args map[string]string) string {
keys := make([]string, 0, len(args))
for k := range args {
if k != "sign" && k != "sign_type" && args[k] != "" {
keys = append(keys, k)
}
}
sort.Strings(keys)
signStrs := make([]string, len(keys))
for i, k := range keys {
signStrs[i] = k + "=" + args[k]
}
signStr := strings.Join(signStrs, "&") + c.Key
h := md5.New()
h.Write([]byte(signStr))
return hex.EncodeToString(h.Sum(nil))
}