<feat>不加密类型

This commit is contained in:
Rzy 2024-08-12 10:50:55 +08:00
parent 848ebcc443
commit 1d5303a4d1
6 changed files with 62 additions and 24 deletions
app
constants
errorcode
pojo
http
controllers
middlewares
routes
utils/encrypt/sm2

View File

@ -36,6 +36,8 @@ const (
AppRsaDecryptKeyNotFound = 1203
AppDecryptDataDiscrepancy = 1204
AppNotifyUrlNotFound = 1205
AppIdNotSet = 1206
InvalidAppIdType = 1207
AppRsaDecryptFail = 1210
AppRsaEncryptKeyNotFound = 1211
AppRsaEncryptFail = 1212
@ -105,6 +107,8 @@ var MsgZH = map[int]string{
AppDecryptDataDiscrepancy: "解密数据不一致",
SystemError: "系统错误",
AppNotifyUrlNotFound: "未设置回调地址",
AppIdNotSet: "appId未设置",
InvalidAppIdType: "无效的app_id类型",
AppRsaDecryptKeyNotFound: "密匙缺失无法进行Rsa解密",
AppRsaDecryptFail: "Rsa解密失败",

View File

@ -1,7 +1,8 @@
package pojo
const (
RSA int32 = iota + 1
NO_CRYPT int32 = iota
RSA
SM2
SM4
)

View File

@ -154,7 +154,7 @@ func GenRequest(c *gin.Context, request interface{}) (msgs []string, err error)
func ValidApiData(dataByte []byte, validStruct interface{}) (msgs []string, err error) {
validate := validator.New()
err = json.Unmarshal(dataByte, validStruct)
err = sonic.Unmarshal(dataByte, validStruct)
if err != nil {
err = errors.New(errorcode.GetMsg(errorcode.ParamError, ""))
}

View File

@ -3,6 +3,7 @@ package middlewares
import (
"PaymentCenter/app/constants/common"
"PaymentCenter/app/constants/errorcode"
"PaymentCenter/app/constants/pojo"
"PaymentCenter/app/http/controllers"
"PaymentCenter/app/http/entities/front"
"PaymentCenter/app/http/requestmapping"
@ -11,7 +12,10 @@ import (
"PaymentCenter/app/utils"
"PaymentCenter/config"
"encoding/json"
"github.com/bytedance/sonic"
"github.com/gin-gonic/gin"
"io"
"strconv"
"strings"
)
@ -130,19 +134,23 @@ func ValidateRequest() gin.HandlerFunc {
func ValidatePayRequest() gin.HandlerFunc {
return func(c *gin.Context) {
var (
path = c.FullPath()
code int
log_id int64
path = c.FullPath()
code int
logId int64
errCode int
handler func() (interface{}, bool)
requestData front.RequestBody
)
var handler func() (interface{}, bool)
requestData, err := utils.SonicApiDataToStruct(controllers.GetRequest(c), &front.RequestBody{})
postBody, err := io.ReadAll(c.Request.Body)
if err != nil {
controllers.ApiRes(c, nil, errorcode.ParamError)
}
_err := sonic.Unmarshal(postBody, &requestData)
if _err != nil {
controllers.ApiRes(c, nil, errorcode.ParamError)
return
}
requestDataStruct := requestData.(*front.RequestBody)
//判断时间
//now := time.Now().UnixNano() / 1000000
//if requestDataStruct.Timestamp > now || (config.GetConf().TimeOut != 0 && (now-requestDataStruct.Timestamp) > config.GetConf().TimeOut) {
@ -150,45 +158,46 @@ func ValidatePayRequest() gin.HandlerFunc {
// return
//}
//获取app信息
appCheck := services.GetAppCheck(requestDataStruct.AppId, c.ClientIP())
appCheck := services.GetAppCheck(requestData.AppId, c.ClientIP())
//存入请求记录
if appCheck.Code != errorcode.Success {
controllers.ApiRes(c, nil, appCheck.Code)
return
}
//解密
dataByte, errCode := api.DeCrypt(appCheck.App, requestDataStruct.Data, requestDataStruct.Key)
if errCode != errorcode.Success {
controllers.ApiRes(c, nil, errCode)
return
}
if appCheck.App.KeyType != pojo.NO_CRYPT {
postBody, errCode = api.DeCrypt(appCheck.App, requestData.Data, requestData.Key)
if errCode != errorcode.Success {
controllers.ApiRes(c, nil, errCode)
return
}
}
reCheck := appCheck.ReCheckAfterDecrypt(postBody, &requestData)
//检查解密后的数据是否与请求一致
reCheck := appCheck.ReCheckAfterDecrypt(dataByte, requestDataStruct)
if !reCheck {
controllers.ApiRes(c, nil, appCheck.GetCode())
return
}
//表单验证
handler = requestmapping.FrontRequestMap[path]
v, isSaveLog := handler()
if isSaveLog {
//记录请求日志
log_id, code = services.AddRequestLog(dataByte, c.ClientIP(), path)
logId, code = services.AddRequestLog(postBody, c.ClientIP(), path)
if code != errorcode.Success {
controllers.ApiRes(c, nil, errCode)
}
}
c.Set("log", log_id)
msg, err := controllers.ValidApiData(dataByte, v)
c.Set("log", logId)
msg, err := controllers.ValidApiData(postBody, v)
if err != nil {
utils.Log(c, "参数错误", "path=", path, "err=", err.Error(), "msg=", msg)
controllers.ApiRes(c, nil, errorcode.ParamError, msg...)
c.Abort()
}
err = json.Unmarshal(dataByte, &v)
err = json.Unmarshal(postBody, &v)
if err != nil {
controllers.ApiRes(c, nil, errorcode.Forbidden)
return
@ -198,3 +207,27 @@ func ValidatePayRequest() gin.HandlerFunc {
c.Next()
}
}
func getAppId(postData map[string]interface{}) (appId int64, errCode int) {
var err error
if appIdValue, ok := postData["app_id"]; !ok {
return 0, errorcode.AppIdNotSet
} else {
switch appIdValTyped := appIdValue.(type) {
case float64:
appId = int64(appIdValTyped) // 显式转换
case int:
appId = int64(appIdValTyped) // 显式转换
case string:
// 如果appId是字符串你可能需要将其解析为整数
// 注意:这里可能会因为格式错误而失败
appId, err = strconv.ParseInt(appIdValTyped, 10, 64)
if err != nil {
return 0, errorcode.InvalidAppIdType
}
default:
return 0, errorcode.InvalidAppIdType
}
}
return appId, errorcode.Success
}

View File

@ -56,7 +56,7 @@ func RegisterRoute(router *gin.Engine) {
notify.POST("/ali/:payChannelId", front.AliCallback)
}
pay := v1.Group("/pay", middlewares.ValidateRequest(), middlewares.ValidatePayRequest())
pay := v1.Group("/pay", middlewares.ValidatePayRequest())
{
pay.POST("/url", front.PayUrl)
pay.POST("/query", front.QueryOrder) //查询订单

View File

@ -38,7 +38,7 @@ func TestSM2Encrypt(t *testing.T) {
}
func TestSM2Decrypt(t *testing.T) {
en := encrypt()
en := "MDRkZDJkYzE1ZmIyZTdjMDRiNTlhZGM5OGM1NjBjM2RhZWVkMzhkMjljYjFkMmEyNjUzMmZlZDRkMWUxMjc5MjQxM2M5OTJiMTk5OWQ4MzgwOTdjYjhhMTU4ODA3OTNmZDNiM2FjZmE2NWNjNDAzZTgyODZjZjM5Y2NkMWU2NmJjY2EwNjU0N2NlNzM3N2M3YWViMmRmN2UzNGQ3YTIyMzI1NWJiMzU5NzljMDVlNjg2MTQzMGE4Y2VmNDZmMTU4YTYxNmI5ZjE2YTcwYzc0MTRhNmNmMWE2NWE5ZTE1YWM1ODBmODk1MWNiOWNhMzBlMDNhMjQzZmZjZWY4YjQzOWUzOGM5NmU0MGQyMTc5YjY5YThhNGQ3ZTQxMjZlMzA1MGZlNWIxZDI4Mzc0YjU3MmRiODBiMjFiMWY4NGYwNDBjYTE3NTRhN2FjMDk5Y2ZmZGI5MDM3NjIxYTE0ODAzNGIyOTU4NjA4ZDM4MzNlOGIwNDE4MWQ4NGUyMWU0OTNmZjYzNzNjMGQ4Y2M0ODVkYzM4NjZlYjZlOWZiYzVjZGFmMDExNWNiYWNiODA4Y2ZkYjczODlmZmJlZDliNmQzMDdiYTczY2EyOTVlOWNhM2RhZmNlNDk1YTZiNWI4NzFhYzdlN2U2ZTJmZWFlOGU3YTllOTFhYTE4ZGY4MzVkNWI2YjFkOGFkY2NhYWM0YjMwOTU3NzUxMmZkYWVlMmVhOWJlMTkwMWUxOTUzMzFmN2UyZjU5NmFkOGRiN2Q1ZDJmYzI2MDA5NjE4YmNhNzc="
decrypt, err := SM2Decrypt(en, SELF_PUB, SELF_PRI)
if err != nil {
panic(err)