mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-29 14:46:38 +08:00
81 lines
1.7 KiB
Go
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))
|
|
}
|