feat: payjs payment channel is ready

This commit is contained in:
RockYang
2024-01-07 14:36:02 +08:00
parent 706aacd8e6
commit 8ec85e2829
11 changed files with 279 additions and 88 deletions

View File

@@ -4,10 +4,11 @@ import (
"chatplus/core/types"
"chatplus/store"
"chatplus/store/model"
"gorm.io/gorm"
"strings"
"sync/atomic"
"time"
"gorm.io/gorm"
)
// Service MJ 绘画服务
@@ -121,7 +122,7 @@ func (s *Service) Notify(data CBReq) {
return
}
tx := s.db.Session(&gorm.Session{}).Order("id ASC")
tx := s.db.Session(&gorm.Session{}).Where("progress < ?", 100).Order("id ASC")
if data.ReferenceId != "" {
tx = tx.Where("reference_id = ?", data.ReferenceId)
} else {

View File

@@ -2,6 +2,7 @@ package payment
import (
"chatplus/core/types"
"chatplus/utils"
"crypto/md5"
"fmt"
"io"
@@ -27,17 +28,37 @@ func NewHuPiPay(config *types.AppConfig) *HuPiPayService {
}
}
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 map[string]string) (string, error) {
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["nonce_str"] = simple
for k, v := range params {
data.Add(k, v)
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))
}
data.Add("hash", s.Sign(params))
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
@@ -54,7 +75,6 @@ func (s *HuPiPayService) Pay(params map[string]string) (string, error) {
func (s *HuPiPayService) Sign(params map[string]string) string {
var data string
keys := make([]string, 0, 0)
params["appid"] = s.appId
for key := range params {
keys = append(keys, key)
}

View File

@@ -26,9 +26,55 @@ func NewPayJS(appConfig *types.AppConfig) *PayJS {
type JPayReq struct {
TotalFee int `json:"total_fee"`
OutTradeNo string `json:"out_trade_no"`
Body string `json:"body"`
Subject string `json:"body"`
NotifyURL string `json:"notify_url"`
}
type JPayReps struct {
CodeUrl string `json:"code_url"`
OutTradeNo string `json:"out_trade_no"`
OrderId string `json:"payjs_order_id"`
Qrcode string `json:"qrcode"`
ReturnCode int `json:"return_code"`
ReturnMsg string `json:"return_msg"`
Sign string `json:"sign"`
TotalFee string `json:"total_fee"`
}
func (r JPayReps) IsOK() bool {
return r.ReturnMsg == "SUCCESS"
}
func (js *PayJS) Pay(param JPayReq) JPayReps {
param.NotifyURL = js.config.NotifyURL
var p = url.Values{}
encode := utils.JsonEncode(param)
m := make(map[string]interface{})
_ = utils.JsonDecode(encode, &m)
for k, v := range m {
p.Add(k, fmt.Sprintf("%v", v))
}
p.Add("mchid", js.config.AppId)
p.Add("sign", sign(p, js.config.PrivateKey))
cli := http.Client{}
r, err := cli.PostForm(js.config.ApiURL, p)
if err != nil {
return JPayReps{ReturnMsg: err.Error()}
}
defer r.Body.Close()
bs, err := io.ReadAll(r.Body)
if err != nil {
return JPayReps{ReturnMsg: err.Error()}
}
var data JPayReps
err = utils.JsonDecode(string(bs), &data)
if err != nil {
return JPayReps{ReturnMsg: err.Error()}
}
return data
}
func sign(params url.Values, priKey string) string {
params.Del(`sign`)
@@ -54,28 +100,3 @@ func sign(params url.Values, priKey string) string {
md5res := hex.EncodeToString(md5bs[:])
return strings.ToUpper(md5res)
}
func (pj *PayJS) Pay(param JPayReq) (string, error) {
var p = url.Values{}
encode := utils.JsonEncode(param)
m := make(map[string]interface{})
_ = utils.JsonDecode(encode, &m)
for k, v := range m {
p.Add(k, fmt.Sprintf("%v", v))
}
p.Add("mchid", pj.config.AppId)
p.Add("sign", sign(p, pj.config.PrivateKey))
cli := http.Client{}
r, err := cli.PostForm(pj.config.ApiURL, p)
if err != nil {
return "", err
}
defer r.Body.Close()
bs, err := io.ReadAll(r.Body)
if err != nil {
return "", err
}
return string(bs), nil
}