From 89fc788173d7c26735e301380ca41c2ba6d0e936 Mon Sep 17 00:00:00 2001 From: DengBiao <2319963317@qq.com> Date: Tue, 10 Oct 2023 15:48:16 +0800 Subject: [PATCH] update --- app/customer/hdl/hdl_call_back.go | 40 ++++++++++++ app/customer/md/wxpay.go | 43 +++++++++++++ app/customer/svc/svc_pay.go | 102 ++++++++++++++++++++++++++++++ app/router/customer_router.go | 1 + 4 files changed, 186 insertions(+) create mode 100644 app/customer/md/wxpay.go diff --git a/app/customer/hdl/hdl_call_back.go b/app/customer/hdl/hdl_call_back.go index 968ace8..4a7749b 100644 --- a/app/customer/hdl/hdl_call_back.go +++ b/app/customer/hdl/hdl_call_back.go @@ -1,11 +1,16 @@ package hdl import ( + "applet/app/admin/lib/validate" "applet/app/customer/md" "applet/app/customer/svc" + "applet/app/db" "applet/app/e" + "applet/app/enum" + "encoding/json" "fmt" "github.com/gin-gonic/gin" + "github.com/wechatpay-apiv3/wechatpay-go/utils" ) func AlipayJsApiCallBack(c *gin.Context) { @@ -35,3 +40,38 @@ func AlipayJsApiCallBack(c *gin.Context) { //c.Header("Content-Type", "text/html; charset=utf-8") c.String(200, "success") } + +func WxJsApiCallBack(c *gin.Context) { + var req md.WxPayCallback + err := c.ShouldBindJSON(&req) + if err != nil { + err = validate.HandleValidateErr(err) + err1 := err.(e.E) + e.OutErr(c, err1.Code, err1.Error()) + return + } + sysCfgDb := db.SysCfgDb{} + sysCfgDb.Set() + sysCfg := sysCfgDb.SysCfgFindWithDb(enum.WxSpMchApiV3Key) + + //TODO::进行解密 + decryptString, err := utils.DecryptAES256GCM(sysCfg[enum.WxSpMchApiV3Key], req.Resource.AssociatedData, req.Resource.Nonce, req.Resource.Ciphertext) + if err != nil { + e.OutErr(c, e.ERR, "解密失败") + return + } + fmt.Println(">>>>>>>>>>", decryptString) + var resp md.WxPayDecryptAesCallback + err = json.Unmarshal([]byte(decryptString), &resp) + if err != nil { + e.OutErr(c, e.ERR, err.Error()) + return + } + + _, err = svc.DealCentralKitchenForSchoolOrderCallBackForWx(resp.OutTradeNo, resp.TradeState) + if err != nil { + e.OutErr(c, e.ERR, err.Error()) + return + } + e.OutSuc(c, "success", nil) +} diff --git a/app/customer/md/wxpay.go b/app/customer/md/wxpay.go new file mode 100644 index 0000000..c6e288e --- /dev/null +++ b/app/customer/md/wxpay.go @@ -0,0 +1,43 @@ +package md + +// WxPayCallback 微信回调结构体 +type WxPayCallback struct { + Id string `json:"id"` + CreateTime string `json:"create_time"` + ResourceType string `json:"resource_type"` + EventType string `json:"event_type"` + Summary string `json:"summary"` + Resource struct { + OriginalType string `json:"original_type"` + Algorithm string `json:"algorithm"` + Ciphertext string `json:"ciphertext"` + AssociatedData string `json:"associated_data"` + Nonce string `json:"nonce"` + } `json:"resource"` +} + +// WxPayDecryptAesCallback 微信解密回调结构体 +type WxPayDecryptAesCallback struct { + SpMchid string `json:"sp_mchid"` + SubMchid string `json:"sub_mchid"` + SpAppid string `json:"sp_appid"` + SubAppid string `json:"sub_appid"` + OutTradeNo string `json:"out_trade_no"` + TransactionId string `json:"transaction_id"` + TradeType string `json:"trade_type"` + TradeState string `json:"trade_state"` + TradeStateDesc string `json:"trade_state_desc"` + BankType string `json:"bank_type"` + Attach string `json:"attach"` + SuccessTime string `json:"success_time"` + Payer struct { + SpOpenid string `json:"sp_openid"` + SubOpenid string `json:"sub_openid"` + } `json:"payer"` + Amount struct { + Total int64 `json:"total"` + PayerTotal int64 `json:"payer_total"` + Currency string `json:"currency"` + PayerCurrency string `json:"payer_currency"` + } `json:"amount"` +} diff --git a/app/customer/svc/svc_pay.go b/app/customer/svc/svc_pay.go index cf812f0..e68486e 100644 --- a/app/customer/svc/svc_pay.go +++ b/app/customer/svc/svc_pay.go @@ -493,6 +493,108 @@ func DealCentralKitchenForSchoolOrderCallBack(outTradeNo, tradeStatus string) (s return } +func DealCentralKitchenForSchoolOrderCallBackForWx(outTradeNo, tradeStatus string) (state int, err error) { + centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{} + centralKitchenForSchoolPackageOrd.Set(outTradeNo) + ord, err := centralKitchenForSchoolPackageOrd.GetCentralKitchenForSchoolPackageOrd() + if err != nil { + return + } + if ord == nil { + err = errors.New("未查询到对应订单记录") + return + } + + if ord.State == enum2.CentralKitchenForSchoolPackageOrdStateForWait { + if tradeStatus == "CLOSED" || tradeStatus == "PAYERROR" { + ord.State = enum2.CentralKitchenForSchoolPackageOrdStateForFail + } + + if tradeStatus == "SUCCESS" { + ord.State = enum2.CentralKitchenForSchoolPackageOrdStateForSuccess + ord.OrdState = enum2.CentralKitchenForSchoolPackageOrdOrdStateForSuccess + + //TODO::将预留数据插入到 `central_kitchen_for_school_user_with_day` + var data []*model.CentralKitchenForSchoolUserWithDay + err = json.Unmarshal([]byte(ord.WithDayData), &data) + if err != nil { + return + } + + var hasMonths = map[string]map[string]interface{}{} + var hasKinds = map[string]map[string]string{} + var hasTotalPrice = map[string]map[string]float64{} + for _, v := range data { + date, _ := time.ParseInLocation("2006-01-02", v.Date, time.Local) + if hasMonths[utils.TimeParseStd(v.Date).Month().String()] == nil { + hasMonths[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]interface{}) + hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02") + hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02") + } else { + startTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"]), time.Local) + if startTime.After(date) { + hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_start"] = date.Format("2006-01-02") + } + + endTime, _ := time.ParseInLocation("2006-01-02", utils.AnyToString(hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"]), time.Local) + if endTime.Before(date) { + hasMonths[utils.TimeParseStd(v.Date).Month().String()]["meal_time_end"] = date.Format("2006-01-02") + } + } + if hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] == nil { + hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]float64) + } + if hasKinds[utils.TimeParseStd(v.Date).Month().String()] == nil { + hasKinds[utils.TimeParseStd(v.Date).Month().String()] = make(map[string]string) + } + + hasMonths[utils.TimeParseStd(v.Date).Month().String()]["month"] = int(utils.TimeParseStd(v.Date).Month()) + hasKinds[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] = utils.IntToStr(v.Kind) + hasTotalPrice[utils.TimeParseStd(v.Date).Month().String()][utils.IntToStr(v.Kind)] += utils.StrToFloat64(v.Amount) + v.OrdNo = outTradeNo + } + + centralKitchenForSchoolUserWithDayDb := db.CentralKitchenForSchoolUserWithDayDb{} + centralKitchenForSchoolUserWithDayDb.Set(0) + _, err = centralKitchenForSchoolUserWithDayDb.BatchAddCentralKitchenForSchoolUserWithDays(data) + if err != nil { + return + } + + //TODO::插入数据至 `central_kitchen_for_school_package_ord_for_reserve` + centralKitchenForSchoolPackageOrdForReserve := db.CentralKitchenForSchoolPackageOrdForReserve{} + centralKitchenForSchoolPackageOrdForReserve.Set(outTradeNo) + for k, v := range hasMonths { + for _, v1 := range hasKinds[k] { + _, err = centralKitchenForSchoolPackageOrdForReserve.CentralKitchenForSchoolPackageOrdForReserveInsert(&model.CentralKitchenForSchoolPackageOrdForReserve{ + EnterpriseId: ord.EnterpriseId, + Uid: ord.Uid, + UserIdentityName: ord.UserIdentityName, + UserIdentityId: ord.UserIdentityId, + Kind: utils.StrToInt(v1), + OutTradeNo: ord.OutTradeNo, + ReserveMonth: utils.AnyToString(v["month"]), + MealTimeStart: utils.AnyToString(v["meal_time_start"]), + MealTimeEnd: utils.AnyToString(v["meal_time_end"]), + TotalPrice: utils.Float64ToStr(hasTotalPrice[k][v1]), + CreateAt: time.Now().Format("2006-01-02 15:04:05"), + UpdateAt: time.Now().Format("2006-01-02 15:04:05"), + }) + if err != nil { + return + } + } + } + } + _, err = centralKitchenForSchoolPackageOrd.CentralKitchenForSchoolPackageOrdUpdate(ord, "state", "ord_state") + if err != nil { + return + } + } + state = ord.State + return +} + func CheckAllCallbackParams(c *gin.Context) interface{} { body, _ := ioutil.ReadAll(c.Request.Body) utils.FilePutContents("CheckAllCallbackParams", utils.SerializeStr(string(body))) diff --git a/app/router/customer_router.go b/app/router/customer_router.go index 793a5c3..b2da9f7 100644 --- a/app/router/customer_router.go +++ b/app/router/customer_router.go @@ -20,6 +20,7 @@ func CustomerInit(r *gin.RouterGroup) { r.POST("/downloadCertificates", hdl.DownloadCertificates) //下载微信支付平台证书 r.POST("/curlAlipayPlanetEcocampusApiRosterSignUpInfoTest", hdl.CurlAlipayPlanetEcocampusApiRosterSignUpInfo) r.POST("/alipayJsApiCallBack", hdl.AlipayJsApiCallBack) + r.POST("/wxJsApiCallBack", hdl.WxJsApiCallBack) r.POST("/login", hdl.Login) r.GET("/wxAppletLogin", hdl.WxAppletLogin)