mirror of
https://github.com/yangjian102621/geekai.git
synced 2025-09-18 01:06:39 +08:00
feat: HuPiPay order check function is ready
This commit is contained in:
parent
24218e7570
commit
578f26a738
@ -372,9 +372,9 @@ func (h *PaymentHandler) HuPiPayNotify(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
orderNo := c.Request.Form.Get("trade_order_id")
|
orderNo := c.Request.Form.Get("trade_order_id")
|
||||||
logger.Infof("收到订单支付回调,订单 NO:%s", orderNo)
|
tradeNo := c.Request.Form.Get("open_order_id")
|
||||||
|
logger.Infof("收到虎皮椒订单支付回调,订单 NO:%s,交易流水号:%s", orderNo, tradeNo)
|
||||||
|
|
||||||
tradeNo := c.Request.Form.Get("transaction_id")
|
|
||||||
if err = h.huPiPayService.Check(tradeNo); err != nil {
|
if err = h.huPiPayService.Check(tradeNo); err != nil {
|
||||||
logger.Error("订单校验失败:", err)
|
logger.Error("订单校验失败:", err)
|
||||||
c.String(http.StatusOK, "fail")
|
c.String(http.StatusOK, "fail")
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"chatplus/core/types"
|
"chatplus/core/types"
|
||||||
"chatplus/utils"
|
"chatplus/utils"
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@ -64,12 +65,10 @@ func (s *HuPiPayService) Pay(params HuPiPayReq) (HuPiResp, error) {
|
|||||||
for k, v := range m {
|
for k, v := range m {
|
||||||
data.Add(k, fmt.Sprintf("%v", v))
|
data.Add(k, fmt.Sprintf("%v", v))
|
||||||
}
|
}
|
||||||
encode = utils.JsonEncode(params)
|
// 生成签名
|
||||||
m = make(map[string]string)
|
data.Add("hash", s.Sign(data))
|
||||||
_ = utils.JsonDecode(encode, &m)
|
// 发送支付请求
|
||||||
data.Add("hash", s.sign(m))
|
|
||||||
apiURL := fmt.Sprintf("%s/payment/do.html", s.apiURL)
|
apiURL := fmt.Sprintf("%s/payment/do.html", s.apiURL)
|
||||||
logger.Info(apiURL)
|
|
||||||
resp, err := http.PostForm(apiURL, data)
|
resp, err := http.PostForm(apiURL, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return HuPiResp{}, fmt.Errorf("error with requst api: %v", err)
|
return HuPiResp{}, fmt.Errorf("error with requst api: %v", err)
|
||||||
@ -94,23 +93,28 @@ func (s *HuPiPayService) Pay(params HuPiPayReq) (HuPiResp, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Sign 签名方法
|
// Sign 签名方法
|
||||||
func (s *HuPiPayService) sign(params map[string]string) string {
|
func (s *HuPiPayService) Sign(params url.Values) string {
|
||||||
var data string
|
params.Del(`Sign`)
|
||||||
keys := make([]string, 0, 0)
|
var keys = make([]string, 0, 0)
|
||||||
for key := range params {
|
for key := range params {
|
||||||
keys = append(keys, key)
|
if params.Get(key) != `` {
|
||||||
|
keys = append(keys, key)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
sort.Strings(keys)
|
sort.Strings(keys)
|
||||||
//拼接
|
|
||||||
for _, k := range keys {
|
var pList = make([]string, 0, 0)
|
||||||
data = fmt.Sprintf("%s%s=%s&", data, k, params[k])
|
for _, key := range keys {
|
||||||
|
var value = strings.TrimSpace(params.Get(key))
|
||||||
|
if len(value) > 0 {
|
||||||
|
pList = append(pList, key+"="+value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
data = strings.Trim(data, "&")
|
var src = strings.Join(pList, "&")
|
||||||
data = fmt.Sprintf("%s%s", data, s.appSecret)
|
src += s.appSecret
|
||||||
m := md5.New()
|
|
||||||
m.Write([]byte(data))
|
md5bs := md5.Sum([]byte(src))
|
||||||
sign := fmt.Sprintf("%x", m.Sum(nil))
|
return hex.EncodeToString(md5bs[:])
|
||||||
return sign
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check 校验订单状态
|
// Check 校验订单状态
|
||||||
@ -121,11 +125,7 @@ func (s *HuPiPayService) Check(tradeNo string) error {
|
|||||||
stamp := strconv.FormatInt(time.Now().Unix(), 10)
|
stamp := strconv.FormatInt(time.Now().Unix(), 10)
|
||||||
data.Add("time", stamp)
|
data.Add("time", stamp)
|
||||||
data.Add("nonce_str", stamp)
|
data.Add("nonce_str", stamp)
|
||||||
// 生成签名
|
data.Add("hash", s.Sign(data))
|
||||||
encode := utils.JsonEncode(data)
|
|
||||||
m := make(map[string]string)
|
|
||||||
err := utils.JsonDecode(encode, &m)
|
|
||||||
data.Add("sign", s.sign(m))
|
|
||||||
|
|
||||||
apiURL := fmt.Sprintf("%s/payment/query.html", s.apiURL)
|
apiURL := fmt.Sprintf("%s/payment/query.html", s.apiURL)
|
||||||
resp, err := http.PostForm(apiURL, data)
|
resp, err := http.PostForm(apiURL, data)
|
||||||
@ -156,6 +156,7 @@ func (s *HuPiPayService) Check(tradeNo string) error {
|
|||||||
if r.ErrCode == 0 && r.Data.Status == "OD" {
|
if r.ErrCode == 0 && r.Data.Status == "OD" {
|
||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
return errors.New("order not paid")
|
logger.Debugf("%+v", r)
|
||||||
|
return errors.New("order not paid:" + r.ErrMsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ type JPayReps struct {
|
|||||||
Qrcode string `json:"qrcode"`
|
Qrcode string `json:"qrcode"`
|
||||||
ReturnCode int `json:"return_code"`
|
ReturnCode int `json:"return_code"`
|
||||||
ReturnMsg string `json:"return_msg"`
|
ReturnMsg string `json:"return_msg"`
|
||||||
Sign string `json:"sign"`
|
Sign string `json:"Sign"`
|
||||||
TotalFee string `json:"total_fee"`
|
TotalFee string `json:"total_fee"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ func (js *PayJS) Pay(param JPayReq) JPayReps {
|
|||||||
}
|
}
|
||||||
p.Add("mchid", js.config.AppId)
|
p.Add("mchid", js.config.AppId)
|
||||||
|
|
||||||
p.Add("sign", js.sign(p))
|
p.Add("Sign", js.sign(p))
|
||||||
|
|
||||||
cli := http.Client{}
|
cli := http.Client{}
|
||||||
apiURL := fmt.Sprintf("%s/api/native", js.config.ApiURL)
|
apiURL := fmt.Sprintf("%s/api/native", js.config.ApiURL)
|
||||||
@ -79,7 +79,7 @@ func (js *PayJS) Pay(param JPayReq) JPayReps {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (js *PayJS) sign(params url.Values) string {
|
func (js *PayJS) sign(params url.Values) string {
|
||||||
params.Del(`sign`)
|
params.Del(`Sign`)
|
||||||
var keys = make([]string, 0, 0)
|
var keys = make([]string, 0, 0)
|
||||||
for key := range params {
|
for key := range params {
|
||||||
if params.Get(key) != `` {
|
if params.Get(key) != `` {
|
||||||
@ -109,7 +109,7 @@ func (js *PayJS) Check(tradeNo string) error {
|
|||||||
apiURL := fmt.Sprintf("%s/api/check", js.config.ApiURL)
|
apiURL := fmt.Sprintf("%s/api/check", js.config.ApiURL)
|
||||||
params := url.Values{}
|
params := url.Values{}
|
||||||
params.Add("payjs_order_id", tradeNo)
|
params.Add("payjs_order_id", tradeNo)
|
||||||
params.Add("sign", js.sign(params))
|
params.Add("Sign", js.sign(params))
|
||||||
data := strings.NewReader(params.Encode())
|
data := strings.NewReader(params.Encode())
|
||||||
resp, err := http.Post(apiURL, "application/x-www-form-urlencoded", data)
|
resp, err := http.Post(apiURL, "application/x-www-form-urlencoded", data)
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
Loading…
Reference in New Issue
Block a user