mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-19 01:36:38 +08:00
93 lines
2.1 KiB
Go
93 lines
2.1 KiB
Go
package payment
|
|
|
|
import (
|
|
"chatplus/core/types"
|
|
"chatplus/utils"
|
|
"crypto/md5"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"sort"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type HuPiPayService struct {
|
|
appId string
|
|
appSecret string
|
|
host string
|
|
}
|
|
|
|
func NewHuPiPay(config *types.AppConfig) *HuPiPayService {
|
|
return &HuPiPayService{
|
|
appId: config.HuPiPayConfig.AppId,
|
|
appSecret: config.HuPiPayConfig.AppSecret,
|
|
host: config.HuPiPayConfig.PayURL,
|
|
}
|
|
}
|
|
|
|
type HuPiPayReq struct {
|
|
AppId string `json:"appid"`
|
|
Version string `json:"version"`
|
|
TradeOrderId string `json:"trade_order_id"`
|
|
TotalFee string `json:"total_fee"`
|
|
Title string `json:"title"`
|
|
NotifyURL string `json:"notify_url"`
|
|
ReturnURL string `json:"return_url"`
|
|
WapName string `json:"wap_name"`
|
|
CallbackURL string `json:"callback_url"`
|
|
Time string `json:"time"`
|
|
NonceStr string `json:"nonce_str"`
|
|
}
|
|
|
|
// Pay 执行支付请求操作
|
|
func (s *HuPiPayService) Pay(params HuPiPayReq) (string, error) {
|
|
data := url.Values{}
|
|
simple := strconv.FormatInt(time.Now().Unix(), 10)
|
|
params.AppId = s.appId
|
|
params.Time = simple
|
|
params.NonceStr = simple
|
|
encode := utils.JsonEncode(params)
|
|
m := make(map[string]string)
|
|
_ = utils.JsonDecode(encode, &m)
|
|
for k, v := range m {
|
|
data.Add(k, fmt.Sprintf("%v", v))
|
|
}
|
|
encode = utils.JsonEncode(params)
|
|
m = make(map[string]string)
|
|
_ = utils.JsonDecode(encode, &m)
|
|
data.Add("hash", s.Sign(m))
|
|
resp, err := http.PostForm(s.host, data)
|
|
if err != nil {
|
|
return "error", err
|
|
}
|
|
defer resp.Body.Close()
|
|
all, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return "error", err
|
|
}
|
|
return string(all), err
|
|
}
|
|
|
|
// Sign 签名方法
|
|
func (s *HuPiPayService) Sign(params map[string]string) string {
|
|
var data string
|
|
keys := make([]string, 0, 0)
|
|
for key := range params {
|
|
keys = append(keys, key)
|
|
}
|
|
sort.Strings(keys)
|
|
//拼接
|
|
for _, k := range keys {
|
|
data = fmt.Sprintf("%s%s=%s&", data, k, params[k])
|
|
}
|
|
data = strings.Trim(data, "&")
|
|
data = fmt.Sprintf("%s%s", data, s.appSecret)
|
|
m := md5.New()
|
|
m.Write([]byte(data))
|
|
sign := fmt.Sprintf("%x", m.Sum(nil))
|
|
return sign
|
|
}
|