feat: HuPiPay order check function is ready

This commit is contained in:
RockYang 2024-01-22 15:17:26 +08:00
parent 24218e7570
commit 578f26a738
3 changed files with 31 additions and 30 deletions

View File

@ -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")

View File

@ -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)
} }
} }

View File

@ -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()