From 0a5fe58bbe2774c349de460540b44dd869baf4ca Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 3 Jul 2024 18:56:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=94=9F=E4=BA=A7=E5=8F=8D?= =?UTF-8?q?=E9=A6=88=E7=BC=BA=E9=99=B7=EF=BC=9A=201.=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E8=B0=83=E7=94=A8erp=E7=99=BB=E5=BD=95=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E4=B8=8D=E5=88=A4=E6=96=AD=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=EF=BC=9B=202.=E4=BF=AE=E6=94=B9=E5=8E=9F=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E7=9A=84=E7=BF=BB=E9=A1=B5=E7=9B=B8=E5=85=B3=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=EF=BC=9B=203.=E4=BF=AE=E5=A4=8Dfloat64=E8=BD=ACint32=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E4=B8=A2=E5=A4=B1=E7=9A=84=E7=BC=BA=E9=99=B7=EF=BC=9B?= =?UTF-8?q?=204.=E6=B3=A8=E9=87=8A=E5=BA=93=E5=AD=98=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=97=B6=E9=87=87=E8=B4=AD=E4=BB=B7=E9=9C=80=E5=A4=A7=E4=BA=8E?= =?UTF-8?q?0=E7=9A=84=E6=A0=A1=E9=AA=8C=EF=BC=9B=205.=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=9F=9F=E5=90=8D=E6=94=B9=E6=88=90=E7=94=9F=E4=BA=A7=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E5=9F=9F=E5=90=8D=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 + app/admin/apis/mallmanage/mall_goods.go | 2 +- app/admin/apis/mallmanage/mall_goods_order.go | 2 +- app/admin/apis/ordermanage/order.go | 8 +- app/admin/apis/pay/wx_pay.go | 149 ++++++++++++++++-- app/admin/apis/system/sysuser.go | 6 + app/admin/middleware/handler/auth.go | 2 +- app/admin/models/cooperative_business.go | 52 ++++-- app/admin/models/erp_order.go | 52 +++--- app/admin/models/file.go | 12 +- app/admin/models/order.go | 4 +- app/admin/models/user.go | 38 +++-- app/admin/router/ordermanage.go | 2 +- app/admin/router/usermanage.go | 4 +- cmd/api/server.go | 1 + config/settings.yml | 7 +- 16 files changed, 261 insertions(+), 84 deletions(-) diff --git a/Makefile b/Makefile index db72f12..7c4b01d 100644 --- a/Makefile +++ b/Makefile @@ -26,3 +26,7 @@ dev: beta: GOOS=linux GOARCH=amd64 go build -o test_mh_goadmin_server main.go + + +pro: + GOOS=linux GOARCH=amd64 go build -o mh_goadmin_server main.go diff --git a/app/admin/apis/mallmanage/mall_goods.go b/app/admin/apis/mallmanage/mall_goods.go index 23bbba1..f965b8b 100644 --- a/app/admin/apis/mallmanage/mall_goods.go +++ b/app/admin/apis/mallmanage/mall_goods.go @@ -453,7 +453,7 @@ func DeliverTaskList(c *gin.Context) { return } ret := map[string]interface{}{ - "count": totalCount, + "total": totalCount, "list": list, "page_index": req.PageIdx, "page_size": req.PageSize, diff --git a/app/admin/apis/mallmanage/mall_goods_order.go b/app/admin/apis/mallmanage/mall_goods_order.go index 7d9b8d0..2d1f124 100644 --- a/app/admin/apis/mallmanage/mall_goods_order.go +++ b/app/admin/apis/mallmanage/mall_goods_order.go @@ -46,7 +46,7 @@ func GoodsOrderList(c *gin.Context) { return } ret := map[string]interface{}{ - "count": totalCount, + "total": totalCount, "list": orderList, "page_index": req.PageIdx, "page_size": req.PageSize, diff --git a/app/admin/apis/ordermanage/order.go b/app/admin/apis/ordermanage/order.go index 8290185..1a31024 100644 --- a/app/admin/apis/ordermanage/order.go +++ b/app/admin/apis/ordermanage/order.go @@ -265,10 +265,10 @@ func FundRecordList(c *gin.Context) { } ret := map[string]interface{}{ - "count": count, - "list": list, - "pageIndex": req.Page, - "total_page": req.PageSize, + "total": count, + "list": list, + "pageIndex": req.Page, + "pageSize": req.PageSize, } app.OK(c, ret, "") } diff --git a/app/admin/apis/pay/wx_pay.go b/app/admin/apis/pay/wx_pay.go index c9e0ab7..6607d0b 100644 --- a/app/admin/apis/pay/wx_pay.go +++ b/app/admin/apis/pay/wx_pay.go @@ -20,6 +20,7 @@ import ( "github.com/wechatpay-apiv3/wechatpay-go/core/option" "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" "github.com/wechatpay-apiv3/wechatpay-go/services/transferbatch" + "go-admin/tools/config" "io" "os" @@ -77,14 +78,17 @@ const ( WxAppMchId = "1609877389" WxAppMchSecret = "DeovoMingHuiRengTianTang45675456" - UnifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder" - HmPayApiUrl = "https://hmpay.sandpay.com.cn/gateway/api" - PemBegin = "-----BEGIN RSA PRIVATE KEY-----\n" - PemEnd = "\n-----END RSA PRIVATE KEY-----" - HmPubKey = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzGVH0Fxpb2M48U1BWr6lpNs2W3VHqtjO8X5RqWjtTwpQVKo8dqaiAGxVbsdnefPpsbI5l9rKquRAOJhWFU07hxSUgXZOk55QQmll03MBgRDXLgxyKfycLLQwhsCJAzDIWC7IWgok/RHV9m9AV2GbQxWBl+7iDE4prcbpgG8Z0HwIDAQAB` - HmPayMerchantId = "664403000030115" - TimeFormat = "2006-01-02 15:04:05" - clientIp = "112.33.14.191" + UnifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder" + HmPayApiUrl = "https://hmpay.sandpay.com.cn/gateway/api" + PemBegin = "-----BEGIN RSA PRIVATE KEY-----\n" + PemEnd = "\n-----END RSA PRIVATE KEY-----" + HmPubKey = `MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzGVH0Fxpb2M48U1BWr6lpNs2W3VHqtjO8X5RqWjtTwpQVKo8dqaiAGxVbsdnefPpsbI5l9rKquRAOJhWFU07hxSUgXZOk55QQmll03MBgRDXLgxyKfycLLQwhsCJAzDIWC7IWgok/RHV9m9AV2GbQxWBl+7iDE4prcbpgG8Z0HwIDAQAB` + HmPayMerchantId = "664403000030115" + TimeFormat = "2006-01-02 15:04:05" + clientIp = "39.108.188.218" // 小程序服务器 + clientIpDev = "112.33.14.191" // 移动云服务器 + HmPayMerchantIdDeovo = "664403000021193" + HmPubKeyDeovo = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDA4g8VFWIxEbOzxYC8ZIOgaOsLWK4Y5k9D8GwJ1Gige79LbTxbe3PH12KMc59DpCR1PnIDwlYWjIE7mZZAHgImXs0pSFihvlNS9srWk2uPlEXXQjjIZ3mnPoXtNhU0x5cYdkB8jtijcYMSGwKmdrIvpvPX3MrDKOX6dJ1T4ll+QIDAQAB" ) const ( @@ -693,6 +697,81 @@ type HmPayUnifiedOrderRsp struct { Sign string `json:"sign"` } +func ParsePrivateKeyDeovo() (*rsa.PrivateKey, error) { + //fp := "/Users/max/Documents/code/deovo/mh_goadmin_server/config/hm_pay/private_key.pem" + fp := "./config/hm_pay/deovo_private_key.pem" + privateKey, err := os.ReadFile(fp) + if err != nil { + logger.Errorf("read file err:", err) + return nil, err + } + + block, _ := pem.Decode([]byte(privateKey)) + if block == nil { + return nil, errors.New("私钥信息错误!") + } + //priKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) + priKey, err := x509.ParsePKCS8PrivateKey(block.Bytes) + if err != nil { + return nil, err + } + if priKey == nil { + return nil, errors.New("pri key is nil") + } + return priKey.(*rsa.PrivateKey), nil +} + +func Sha1withRsaDeovo(signContent string) (string, error) { + hash := crypto.SHA1 + shaNew := hash.New() + shaNew.Write([]byte(signContent)) + hashed := shaNew.Sum(nil) + priKey, err := ParsePrivateKeyDeovo() + if err != nil { + logger.Errorf("parse err:", err) + return "", err + } + + signature, err := rsa.SignPKCS1v15(rand.Reader, priKey, hash, hashed) + if err != nil { + logger.Errorf("sign err:", err) + return "", err + } + return b64.StdEncoding.EncodeToString(signature), nil +} + +func GenHmPaySignDeovo(m map[string]string) (string, error) { + delete(m, "sign") + var signData []string + for k, v := range m { + if k == "openid" { + fmt.Println(k, ":", v) + } + if v != "" && v != "0" { + signData = append(signData, fmt.Sprintf("%s=%s", k, v)) + } + } + //signDataJson, _ := json.MarshalIndent(&signData, "", " ") + //fmt.Println("signDataJson1", string(signDataJson)) + + sort.Strings(signData) + + //signDataJson2, _ := json.MarshalIndent(&signData, "", " ") + //fmt.Println("signDataJson2", string(signDataJson2)) + + signStr := strings.Join(signData, "&") + //signStr = signStr + "&key=" + payKey + //logger.Info("签字符串1:", logger.Field("signStr", signStr)) + fmt.Println("签字符串1:", signStr) + + signature, err := Sha1withRsaDeovo(signStr) + if err != nil { + logger.Errorf("signature err:", err) + return "", err + } + return signature, nil +} + func ParsePrivateKey() (*rsa.PrivateKey, error) { //fp := "/Users/max/Documents/code/deovo/mh_goadmin_server/config/hm_pay/private_key.pem" fp := "./config/hm_pay/private_key.pem" @@ -825,6 +904,50 @@ func HmPayUnifiedOrder(r HmJsPayUnifiedOrderReq) (HmPayUnifiedOrderRsp, error) { return hmPayUnifiedOrderRsp, nil } +func HmVerifySha1RsaDeovo(signContent, signBase string) error { + //fp := "/Users/li/mh/mh_server/pack/configs/hm_pay/public_key.pme" + //publicKeyString, err := ioutil.ReadFile(fp) + //if err != nil { + // fmt.Println("read file err:", err) + // return err + //} + + block, _ := pem.Decode([]byte(FormatPrivateKey(HmPubKeyDeovo))) + if block == nil { + fmt.Println("decode block is nil") + return errors.New("decode block is nil") + } + publicKey, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + fmt.Println("public key err:", err) + return err + } + + if publicKey == nil { + fmt.Println("public key nil:") + return err + } + hash := crypto.SHA1 + shaNew := hash.New() + shaNew.Write([]byte(signContent)) + hashed := shaNew.Sum(nil) + + sign, err := b64.StdEncoding.DecodeString(signBase) + if err != nil { + fmt.Println("sign decode err:", err) + return err + } + + err = rsa.VerifyPKCS1v15(publicKey.(*rsa.PublicKey), hash, hashed, sign) + if err != nil { + fmt.Println("verify err:", err) + return err + } + //logger.Error("验签成功") + fmt.Println("验签成功") + return nil +} + func HmVerifySha1Rsa(signContent, signBase string) error { //fp := "/Users/li/mh/mh_server/pack/configs/hm_pay/public_key.pme" //publicKeyString, err := ioutil.ReadFile(fp) @@ -911,7 +1034,7 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri unifiedOrderReq := HmJsPayUnifiedOrderReq{} publicPara := HmPayPublicPara{ - AppId: HmPayMerchantId, + AppId: HmPayMerchantIdDeovo, //SubAppId: HmWxSubMerchantId, Method: "trade.pay", //Charset: "UTF-8", @@ -935,6 +1058,10 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri StoreId: "100001", NotifyUrl: notifyUrl, } + if config.ApplicationConfig.Mode == "dev" { + biz.CreateIp = clientIpDev + } + unifiedOrderReq.HmPayPublicPara = publicPara bizString, err := json.Marshal(&biz) @@ -949,7 +1076,7 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri return nil, err } - sign, err := GenHmPaySign(m) + sign, err := GenHmPaySignDeovo(m) if err != nil { logger.Error("HmJsPayUnifiedOrder GenHmPaySign err:", logger.Field("err", err)) return nil, err @@ -967,7 +1094,7 @@ func HmJsPayBToCOrder(orderId string, totalFee float64, authCode, notifyUrl stri logger.Errorf("ToSignContent err:", err) return nil, err } - err = HmVerifySha1Rsa(signContent, unifiedOrderResp.Sign) + err = HmVerifySha1RsaDeovo(signContent, unifiedOrderResp.Sign) if err != nil { logger.Errorf("HmVerifySha1Rsa err:", err) return nil, err diff --git a/app/admin/apis/system/sysuser.go b/app/admin/apis/system/sysuser.go index e0dc49d..f68929b 100644 --- a/app/admin/apis/system/sysuser.go +++ b/app/admin/apis/system/sysuser.go @@ -241,6 +241,12 @@ func InsertSysUser(c *gin.Context) { begin := orm.Eloquent.Begin() sysUser.CreateBy = tools.GetUserIdStr(c) id, err := sysUser.Insert(begin) + if err != nil { + begin.Rollback() + logger.Error("Insert err:", logger.Field("err", err)) + app.Error(c, http.StatusInternalServerError, err, "添加失败") + return + } // 如果添加了小程序id,则需要更新user表的user_type字段为2-店员 if req.Uid != 0 { diff --git a/app/admin/middleware/handler/auth.go b/app/admin/middleware/handler/auth.go index 964cb2f..feec845 100644 --- a/app/admin/middleware/handler/auth.go +++ b/app/admin/middleware/handler/auth.go @@ -72,7 +72,7 @@ func Authenticator(c *gin.Context) (interface{}, error) { return nil, jwt.ErrMissingLoginValues } - if config.ApplicationConfig.Mode != "dev" { + if config.ApplicationConfig.Mode != "dev" && loginVals.Username != "erp" { if !store.Verify(loginVals.UUID, loginVals.Code, true) { username = loginVals.Username msg = "验证码错误" diff --git a/app/admin/models/cooperative_business.go b/app/admin/models/cooperative_business.go index e9d310e..9837696 100644 --- a/app/admin/models/cooperative_business.go +++ b/app/admin/models/cooperative_business.go @@ -817,6 +817,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat if !endTime.IsZero() { qs = qs.Where("created_at 0 { - if len(validStoreList) == 1 { - qs = qs.Where("store_id = ?", validStoreList[0]) - } else { - qs = qs.Where("store_id IN (?)", validStoreList) - } - } + //if len(validStoreList) > 0 { + // if len(validStoreList) == 1 { + // qs = qs.Where("store_id = ?", validStoreList[0]) + // } else { + // qs = qs.Where("store_id IN (?)", validStoreList) + // } + //} //if m.Date != "" { // qs = qs.Where("date=?", m.Date) //} @@ -894,6 +915,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*Cooperat if !endTime.IsZero() { qs = qs.Where("created_at