From 81e54ea039dcb30231347a805e036ef8c57326af Mon Sep 17 00:00:00 2001 From: li Date: Sat, 26 Nov 2022 16:52:05 +0800 Subject: [PATCH] fix: --- controller/activity.go | 12 +- controller/game_card.go | 812 ++++++++++++++++++++++++++++++++++ controller/mall.go | 12 +- controller/order.go | 38 +- controller/user.go | 48 +- controller/user_share_card.go | 11 +- lib/wxpay/wx_pay.go | 2 +- model/mall.go | 50 +++ model/model_test.go | 4 +- model/user.go | 2 +- router/router_app.go | 3 +- 11 files changed, 956 insertions(+), 38 deletions(-) diff --git a/controller/activity.go b/controller/activity.go index bc82afb..74247aa 100644 --- a/controller/activity.go +++ b/controller/activity.go @@ -361,7 +361,7 @@ func PostagePackageBuy(c *gin.Context) { orderSn := model.GetOrderSn() err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: user.MemberLevel, - OrderType: 11, UserCouponId: 0}.Insert() + OrderType: 11, UserCouponId: 0, Attach: wxpay.WxPayPostagePackage}.Insert() if err != nil { logger.Error(errors.New("web pay err")) RespJson(c, status.InternalServerError, nil) @@ -373,9 +373,15 @@ func PostagePackageBuy(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(orderSn, info.PostagePackageFee, user.WxOpenID, "N", wxpay.WxPayPostagePackage, configInfo.NotifyUrl) + //webPay, err := wxpay.WebPay(orderSn, info.PostagePackageFee, user.WxOpenID, "N", wxpay.WxPayPostagePackage, configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("web pay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + webPay, err := wxpay.HmJsPayUnifiedOrder(orderSn, info.PostagePackageFee, user.WxOpenID, configInfo.NotifyUrl) if err != nil { - logger.Error(errors.New("web pay err")) + logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } diff --git a/controller/game_card.go b/controller/game_card.go index 8d23b96..fbbe06c 100644 --- a/controller/game_card.go +++ b/controller/game_card.go @@ -23,6 +23,7 @@ import ( "mh-server/lib/wxpay" "mh-server/model" "sort" + "strconv" "strings" "time" ) @@ -1089,6 +1090,817 @@ func PushWXPayNotice(c *gin.Context) { RespBodyXML(c, ret) } +type HmPushWXPayNoticeReq struct { + AppId string `json:"app_id" form:"app_id"` + BankOrderNo string `json:"bank_order_no" form:"bank_order_no"` + BankTrxNo string `json:"bank_trx_no" form:"bank_trx_no"` + BankWayCode string `json:"bank_way_code" form:"bank_way_code"` + BuyerId string `json:"buyer_id" form:"buyer_id"` + BuyerTradeFundBillDetail string `json:"buyer_trade_fund_bill_detail" form:"buyer_trade_fund_bill_detail"` + NotifyType string `json:"notify_type" form:"notify_type"` + OutOrderNo string `json:"out_order_no" form:"out_order_no"` + PayAmount string `json:"pay_amount" form:"pay_amount"` + PayModeCode string `json:"pay_mode_code" form:"pay_mode_code"` + PaySuccessTime string `json:"pay_success_time" form:"pay_success_time"` + PayWayCode string `json:"pay_way_code" form:"pay_way_code"` + PlatTrxNo string `json:"plat_trx_no" form:"plat_trx_no"` + SettleAmount string `json:"settle_amount" form:"settle_amount"` + SettleAppId string `json:"settle_app_id" form:"settle_app_id"` + Sign string `json:"sign" form:"sign"` + SignType string `json:"sign_type" form:"sign_type"` +} + +// 微信推送支付通知 +func HmPushWXPayNotice(c *gin.Context) { + fmt.Println("微信推送支付通知") + + bankOrderNo := c.Query("bank_order_no") + outOrderNo := c.Query("out_order_no") + payAmount := c.Query("pay_amount") + sign := c.Query("sign") + tradeStatus := c.Query("trade_status") + if tradeStatus != "SUCCESS" { + logger.Error("tradeStatus err:") + RespOK(c, "Error") + return + } + //fmt.Println("URL:", c.Request.URL.String()) + //fmt.Println("sign-----", sign) + substance, err := model.ParaToSubstance(c, sign) + if err != nil { + logger.Error("substance err:", err) + RespOK(c, "Error") + return + } + + err = wxpay.HmVerifySha1Rsa(substance, sign) + if err != nil { + logger.Error("HmVerifySha1Rsa err:", err) + RespOK(c, "Error") + return + } + + record := &model.UserOpenMemberRecord{OpenNo: outOrderNo} + err = record.GetByOpenNo() + if err != nil { + logger.Error("err:", err) + } + if record.State == 2 { + RespOK(c, "SUCCESS") + return + } + + fundRecord := new(model.FundRecord) + payAmountFloat, err := strconv.ParseFloat(payAmount, 64) + if err != nil { + logger.Error("parse err:", err) + } + fundRecord.Amount = int64(payAmountFloat * 100) + + if record.Attach == wxpay.WxPayRentCard { + logger.Info("租借游戏卡 支付成功:") + var order model.Order + err := model.NewOrderQuerySet(model.DB).OrderSnEq(outOrderNo). + PayStatusEq(PayStatusUnPay).CardStatusNe(OrderCardStatusCancel).One(&order) + if err != nil { + logger.Error("err:", err) + return + } + //orderJson, _ := json.Marshal(&order) + //fmt.Println("orderJson:", string(orderJson)) + + begin := model.DB.Begin() + err = model.NewOrderQuerySet(begin).IDEq(order.ID).GetUpdater(). + SetPayStatus(model.PayStatusPaid).SetPayTime(time.Now()).Update() + if err != nil { + begin.Rollback() + logger.Error("err:", err) + return + } + //model.OrderCard{} + _, err = model.NewOrderCardQuerySet(begin).OrderIdEq(order.ID).GetUpdater(). + SetPayStatus(model.PayStatusPaid).UpdateNum() + if err != nil { + begin.Rollback() + logger.Error("err:", err) + return + } + + sub := model.DeliverTaskSub{ + Uid: uint32(order.Uid), + UserAddressId: uint32(order.UserAddressId), + OrderType: 1, + OrderId: order.ID, + StoreId: uint32(order.StoreId), + } + err = sub.Add() + if err != nil { + logger.Error("deliver task sub add err:", err) + } + + err = order.InventoryReduction(begin) + if err != nil { + begin.Rollback() + logger.Error("err:", err) + if order.PostageType == 1 { + // 库存不足取消订单 + orderSn := model.GetOrderSn() + memberRecord := &model.UserOpenMemberRecord{OpenNo: orderSn, OrderType: 2, Order: &order} + err = memberRecord.OrderRefund(outOrderNo) + if err != nil { + logger.Error("err:", err) + return + } + } + + // TODO + if order.PostageType == 2 { + var userCoupon model.UserCoupon + err = model.NewUserCouponQuerySet(model.DB).ActivityTypeEq(3).UidEq(uint32(order.Uid)). + StateEq(2).OrderAscByID().Limit(1).One(&userCoupon) + if err != nil && err != model.RecordNotFound { + logger.Error("user coupon err:", err) + RespJson(c, status.InternalServerError, nil) + return + } + err = model.NewUserCouponQuerySet(model.DB).IDEq(userCoupon.ID).GetUpdater().SetState(1).Update() + if err != nil { + logger.Error("user coupon err:", err) + } + } + + _, err := model.NewOrderQuerySet(model.DB).IDEq(order.ID).GetUpdater(). + SetCardStatus(OrderCardStatusCancel).UpdateNum() + if err != nil { + logger.Error("err:", err) + return + } + _, err = model.NewOrderCardQuerySet(model.DB).OrderIdEq(order.ID).GetUpdater(). + SetCardStatus(OrderCardStatusCancel).UpdateNum() + if err != nil { + logger.Error("err:", err) + return + } + + return + } + err = begin.Commit().Error + if err != nil { + begin.Rollback() + logger.Error("err:", err) + return + } + go model.ShoppingCartCreateOrderByOrder(order) + + fundRecord.Uid = uint32(order.Uid) + fundRecord.FundType = model.FundTypeExpressFee + fundRecord.Remark = "借卡邮费" + + } + + if record.Attach == wxpay.WxPayMember { + logger.Info("开通会员 支付成功:") + logger.Info("用户uid:", outOrderNo) + + remark := "" + if record.MemberLevel == 2 { + remark = "黄金会员费" + } else if record.MemberLevel == 4 { + remark = "白金会员费" + } else if record.MemberLevel == 5 { + remark = "黑金会员费" + } + fundRecord.Uid = uint32(record.Uid) + fundRecord.FundType = model.FundTypeMemberFee + fundRecord.Remark = remark + memberRecord := &model.UserMemberRecord{ + Uid: record.Uid, + AfterMemberLevel: record.MemberLevel, + } + newTime := time.Now() + var spendType uint32 + var user model.User + err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).One(&user) + if err != nil { + logger.Error("err:", err) + return + } else { + spendType = uint32(2) + if !user.OpenMemberTime.IsZero() { + spendType = 3 + } + expireTime := newTime.AddDate(1, 0, 0) + if user.MemberExpire.After(newTime) { + expireTime = user.MemberExpire.AddDate(1, 0, 0) + } + memberRecord.BeforeMemberLevel = user.MemberLevel + memberRecord.BeforeMemberExpire = user.MemberExpire + memberRecord.Serial = uint32(user.MemberExpire.Unix()) + memberRecord.AfterMemberExpire = expireTime + if user.IsMember() { + memberRecord.OpenMemberLevel = user.OpenMemberLevel + memberRecord.OpenMemberTime = user.OpenMemberTime + } else { + memberRecord.OpenMemberLevel = record.MemberLevel + memberRecord.OpenMemberTime = newTime + } + memberConfig, err := model.GetMemberConfig(record.MemberLevel) + if err != nil { + logger.Error("GetMemberConfig err:", err) + return + } + //openMemberTime := newTime + userUpdateQs := model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel). + SetMemberExpire(expireTime).SetDeposit(memberConfig.MemberDeposit) + if user.OpenMemberTime.IsZero() { + //openMemberTime = user.OpenMemberTime + userUpdateQs = userUpdateQs.SetOpenMemberTime(newTime).SetOpenMemberLevel(record.MemberLevel) + memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 1) + } else { + memberRecord.Type = model.GetUserMemberRecordType(record.MemberLevel, 2) + } + _, err = userUpdateQs.UpdateNum() + if err != nil { + logger.Error("err:", err) + return + } + + if record.UserCouponId > 0 { + err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).GetUpdater(). + SetState(2).SetUseTime(utils.Now()).Update() + if err != nil { + logger.Error("update user coupon state err:", err) + } + + var userCoupon model.UserCoupon + err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).One(&userCoupon) + if err != nil { + logger.Error("user coupon err:", err) + } else { + if userCoupon.Approach == 1 { + err = model.StorePromotion(userCoupon.PromotionalSales, userCoupon.Uid, nil, &user) + if err != nil { + logger.Error("store promotion err:", err) + } + } + } + } + + // 邀请记录 + var invite model.UserInvite + //err = model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).OrderDescByID().Limit(1).One(&invite) + err = model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).OrderDescByCreatedAt().Limit(1).One(&invite) + if err != nil && err != model.RecordNotFound { + logger.Error("err:", err) + } else { + //if err == model.RecordNotFound { + // userInvite := &model.UserInvite{ + // FromUid: 0, + // UserType: 0, + // StoreId: 0, + // MemberOpenTime: newTime, + // MemberType: 2, + // ToUid: record.Uid, + // MemberStatus: 2, + // MemberLevel: record.MemberLevel, + // Action: 1, + // SpendType: 1, + // } + // err := userInvite.Create(model.DB) + // if err != nil { + // logger.Error("err:", err) + // } + // err = model.SendUserVm(record.Uid, record.MemberLevel, 100) + // if err != nil { + // logger.Error("send user vm err:", err) + // } + //} + + if err == nil { + //qs := model.NewUserInviteQuerySet(model.DB).ToUidEq(record.Uid).GetUpdater() + if invite.Action != 2 { + qs := model.NewUserInviteQuerySet(model.DB).IDEq(invite.ID).GetUpdater() + // SpendType 类型 + //if user.MemberLevel != 2 { + // qs = qs.SetMemberOpenTime(newTime).SetMemberLevel(record.MemberLevel) + //} + qs = qs.SetMemberOpenTime(newTime).SetMemberLevel(record.MemberLevel) + _, err = qs.SetMemberType(2).SetMemberStatus(2). + SetAction(2).SetSpendType(spendType).UpdateNum() + if err != nil { + logger.Error("update user invite action spend type err:", err) + } + if invite.UserInviteRecordId != 0 { + go func() { + err = model.NewUserInviteRecordQuerySet(model.DB).IDEq(invite.UserInviteRecordId).GetUpdater(). + SetAction(2).SetSpendType(spendType).SetMemberLevel(record.MemberLevel). + SetActionTime(newTime).Update() + if err != nil { + logger.Error("update user invite record err:", err) + } + }() + } + } else { + inviteRecordNew := &model.UserInviteRecord{ + ToUid: invite.ToUid, + FromUid: invite.FromUid, + Action: 2, + SpendType: spendType, + MemberLevel: record.MemberLevel, + First: 0, + Scan: 0, // 自动生成 + ActionTime: newTime, + } + err = model.DB.Create(inviteRecordNew).Error + if err != nil { + logger.Error("create invite record err:", err) + } + + userInviteNew := &model.UserInvite{ + FromUid: invite.FromUid, + UserType: invite.UserType, + StoreId: invite.StoreId, + //MemberOpenTime: invite.MemberOpenTime, + MemberOpenTime: time.Now(), + MemberType: 2, + MemberStatus: 2, + ToUid: invite.ToUid, + StoreType: invite.StoreType, + Action: 2, + SpendType: spendType, + MemberLevel: record.MemberLevel, + UserInviteRecordId: inviteRecordNew.ID, + FirstInvite: 0, + } + err = model.DB.Create(userInviteNew).Error + if err != nil { + logger.Error("create invite record err:", err) + } + + } + + if invite.FromUid != 0 { + inviteUser := model.GetUserByUid(invite.FromUid) + if inviteUser != nil { + if inviteUser.UserType != 2 /*不是店员*/ && user.MemberLevel != 2 { // 邀请 新用户推送一次 + err = model.SendUserVm(inviteUser.Uid, record.MemberLevel, 1) + if err != nil { + logger.Error("send user vm err:", err) + } + } + + if spendType == 2 { + err = model.SendUserVm(user.Uid, record.MemberLevel, 0) + if err != nil { + logger.Error("send user vm err:", err) + } + } + + openMemberChannel := model.OpenMemberChannelUserInvite + userQs := model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater() + + if inviteUser.UserType == 2 { + openMemberChannel = model.OpenMemberChannelStorePromotion + if !user.OpenMemberTime.IsZero() { + userQs = userQs.SetCooperativeBusinessId(inviteUser.CooperativeBusinessId). + SetCooperativeName(inviteUser.CooperativeName) + + fmt.Println("用户续费---") + model.AddCooperativeMemberRenewal(inviteUser.CooperativeBusinessId, + uint32(inviteUser.StoreId), inviteUser.Uid, int(record.MemberLevel)) + + } else { + fmt.Println("用户开通------") + model.AddCooperativeMemberPromotion(inviteUser.CooperativeBusinessId, + uint32(inviteUser.StoreId), inviteUser.Uid, int(record.MemberLevel)) + } + } + + _, err = userQs.SetOpenMemberChannel(openMemberChannel).UpdateNum() + if err != nil { + logger.Error("err:", err) + } + } + } + } + } + + if user.MemberLevel != 2 { + } + go func() { + err = model.DB.Create(memberRecord).Error + if err != nil { + logger.Error("create member record err:", err) + } + }() + model.CreateUserRentCardByMemberLevel(record.Uid, record.MemberLevel, memberConfig.CardMax) + } + _, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID). + GetUpdater().SetState(2).UpdateNum() + if err != nil { + logger.Error("update user open member record state:err", err) + } + fmt.Println("notify.TotalFee:", fundRecord.Amount) + fmt.Println("notify.OutTradeNo:", outOrderNo) + + } + + if record.Attach == wxpay.WxPayDeposit { + //record := &model.UserOpenMemberRecord{OpenNo: notifyInfo.OutTradeNo} + //err := record.GetByOpenNo() + //if err != nil { + // logger.Error("err:", err) + // return + //} + //if record.State == 2 { + // ret.ReturnCode = "SUCCESS" + // RespBodyXML(c, ret) + // return + //} + + //if record.State != 2 { + user := model.GetUserByUid(record.Uid) + if user == nil { + logger.Error("user nil") + return + } + + memberConfig, err := model.GetMemberConfig(user.MemberLevel) + if err != nil { + logger.Error("err:", err) + return + } + + remark := "" + if user.MemberLevel == 2 { + remark = "黄金会员押金" + } else if user.MemberLevel == 4 { + remark = "白金会员押金" + } else if user.MemberLevel == 5 { + remark = "黑金会员押金" + } + fundRecord.Uid = uint32(record.Uid) + fundRecord.FundType = model.FundTypeMemberDeposit + fundRecord.Remark = remark + + num, err := model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater(). + SetDeposit(memberConfig.MemberDeposit).UpdateNum() + if err != nil { + logger.Error("update deposit err:", err) + } + if num == 0 { + logger.Error("update deposit num is 0") + } + _, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum() + if err != nil { + logger.Error("update user open member record state:err", err) + } + //} + } + + if record.Attach == wxpay.WxPayBuyGoods { + _, err = model.NewGoodsOrderQuerySet(model.DB).SerialNoEq(outOrderNo).GetUpdater(). + SetPayTime(time.Now()). + SetPayStatus(model.PayStatusOK). + SetState(model.GoodsOrderStateOnDeliver).UpdateNum() + + if err != nil { + logger.Error("err:", err) + } + var goodsOrder model.GoodsOrder + err = model.NewGoodsOrderQuerySet(model.DB).SerialNoEq(outOrderNo).One(&goodsOrder) + if err != nil { + logger.Error("err:", err) + } + + err = model.OrderUpdateGoodsStock(goodsOrder.GoodsAttributeId, goodsOrder.Quantity, model.DB) + if err != nil { + logger.Error("err:", err) + } + + err = model.UserVmUpdate(goodsOrder.Uid, int(goodsOrder.Vm)*-1, model.VmEventBuyGoods, "购买商品积分抵扣") + if err != nil { + logger.Error("err:", err) + } + sub := model.DeliverTaskSub{ + Uid: uint32(goodsOrder.Uid), + UserAddressId: uint32(goodsOrder.AddressId), + OrderType: 2, + OrderId: goodsOrder.OrderId, + StoreId: 13, + } + err = sub.Add() + if err != nil { + logger.Error("deliver task sub add err:", err) + } + fundRecord.Uid = uint32(goodsOrder.Uid) + fundRecord.FundType = model.FundTypeBuyGoods + fundRecord.Remark = "商城购买" + } + + if record.Attach == wxpay.WxPayUpgradeMember { + //record := &model.UserOpenMemberRecord{OpenNo: notifyInfo.OutTradeNo} + //err := record.GetByOpenNo() + //if err != nil { + // logger.Error("err:", err) + //} + //if record.State == 2 { + // ret.ReturnCode = "SUCCESS" + // RespBodyXML(c, ret) + // return + //} + + fmt.Println("UpgradeMember:", record.Uid) + var user model.User + err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).One(&user) + if err != nil { + logger.Error("user err:", err) + return + } + + memberRecord := &model.UserMemberRecord{ + Uid: record.Uid, + BeforeMemberLevel: user.MemberLevel, + AfterMemberLevel: record.MemberLevel, + BeforeMemberExpire: user.MemberExpire, + AfterMemberExpire: record.MemberExpire, + InviteUid: 0, + DeductionDays: record.DeductionDays, + DeductionFee: record.DeductionFee, + CouponId: record.UserCouponId, + Serial: uint32(user.MemberExpire.Unix()), + Type: model.GetUserMemberRecordType(record.MemberLevel, 3), + OpenMemberLevel: user.OpenMemberLevel, + OpenMemberTime: user.OpenMemberTime, + } + memberRecord.Add() + + memberConfig, err := model.GetMemberConfig(record.MemberLevel) + if err != nil { + logger.Error("GetMemberConfig err:", err) + return + } + var fundRecordRecord model.FundRecord + err = model.NewFundRecordQuerySet(model.DB).UidEq(record.Uid).FundTypeEq(model.FundTypeMemberFee). + CreatedAtGte(time.Now().Add(-10 * time.Minute)).One(&fundRecordRecord) + if err == nil && fundRecordRecord.OutTradeNo != "" { + var userOpenMemberRecord model.UserOpenMemberRecord + err := model.NewUserOpenMemberRecordQuerySet(model.DB).OpenNoEq(fundRecordRecord.OutTradeNo).One(&userOpenMemberRecord) + if err != nil { + logger.Error("user open member record err:", err) + return + } + if userOpenMemberRecord.CreatedAt.After(record.CreatedAt) { + record.MemberExpire = record.MemberExpire.AddDate(1, 0, 0) + } + } + + _, err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel). + SetMemberExpire(record.MemberExpire).SetDeposit(memberConfig.MemberDeposit).UpdateNum() + //err = model.UserUpdate(&model.User{Uid: uint32(record.Uid), MemberLevel: record.MemberLevel, MemberExpire: expireTime, Deposit: memberConfig.MemberDeposit}) + if err != nil { + logger.Error("err:", err) + return + } + // 添加会员时长 等级 借卡数量 + var userRentCard model.UserRentCard + err = model.NewUserRentCardQuerySet(model.DB).UidEq(record.Uid).One(&userRentCard) + if err != nil { + logger.Error("err:", err) + return + } + + _, err = model.NewUserRentCardQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel). + SetLevelRentCount(memberConfig.CardMax).SetCanRentCount(memberConfig.CardMax - userRentCard.HaveRentCount).UpdateNum() + if err != nil { + logger.Error("err:", err) + return + } + + model.CreateUserRentCardByMemberLevel(record.Uid, record.MemberLevel, memberConfig.CardMax) + + if record.UserCouponId > 0 { + _, err = model.NewUserCouponQuerySet(model.DB).IDEq(record.UserCouponId).GetUpdater(). + SetState(2).SetUseTime(utils.Now()).UpdateNum() + if err != nil { + logger.Error("update user coupon state err:", err) + } + } + _, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum() + if err != nil { + logger.Error("update user open member record state:err", err) + } + + fundRecord.Uid = uint32(record.Uid) + fundRecord.FundType = model.FundTypeUpgradeMember + fundRecord.Remark = "升级会员" + } + + if record.Attach == wxpay.WxPayMemberExpireDelay { + //record := &model.UserOpenMemberRecord{OpenNo: notifyInfo.OutTradeNo} + //err := record.GetByOpenNo() + //if err != nil { + // logger.Error("err:", err) + // return + //} + //if record.State == 2 { + // ret.ReturnCode = "SUCCESS" + // RespBodyXML(c, ret) + // return + //} + + var user model.User + err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).One(&user) + if err != nil { + logger.Error("err:", err) + return + } + + _, err = model.NewUserMemberExpireDelayQuerySet(model.DB).UidEq(record.Uid).MemberExpireEq(user.MemberExpire). + GetUpdater().SetIsPay(1).UpdateNum() + if err != nil { + logger.Error("err:", err) + return + } + _, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum() + if err != nil { + logger.Error("update user open member record state:err", err) + } + fundRecord.Uid = uint32(record.Uid) + fundRecord.FundType = model.FundTypeMemberExpireDelay + fundRecord.Remark = "会员过期滞纳金" + } + + if record.Attach == wxpay.WxPayShareCardRetrieve { + //record := &model.UserOpenMemberRecord{OpenNo: notifyInfo.OutTradeNo} + //err := record.GetByOpenNo() + //if err != nil { + // logger.Error("err:", err) + //} + //if record.State == 2 { + // ret.ReturnCode = "SUCCESS" + // RespBodyXML(c, ret) + // return + //} + fmt.Println("UpgradeMember:", record.Uid) + + _, err = model.NewShareCardRetrieveQuerySet(model.DB).IDEq(record.OrderId). + GetUpdater().SetPayState(2).UpdateNum() + if err != nil { + logger.Error("update pay state err:", err) + } + _, err = model.NewShareCardRetrieveCardQuerySet(model.DB).ShareCardRetrieveIdEq(record.OrderId).GetUpdater(). + SetPayState(2).UpdateNum() + if err != nil { + logger.Error("update pay state err:", err) + } + + var share model.ShareCardRetrieve + err = model.NewShareCardRetrieveQuerySet(model.DB).IDEq(record.ID).One(&share) + if err != nil { + log.Error().Msgf("share card retrieve err:%#v", err) + } + if err == nil { + sub := model.DeliverTaskSub{ + Uid: share.Uid, + UserAddressId: share.AddressId, + OrderType: 3, + OrderId: share.ID, + } + err = sub.Add() + if err != nil { + logger.Error("deliver task sub add err:", err) + } + } + _, err = model.NewUserOpenMemberRecordQuerySet(model.DB).IDEq(record.ID).GetUpdater().SetState(2).UpdateNum() + if err != nil { + logger.Error("update user open member record state:err", err) + } + fundRecord.Uid = uint32(record.Uid) + fundRecord.FundType = model.FundTypeExpressFee + fundRecord.Remark = "共享卡收回卡快递费" + } + + if record.Attach == wxpay.WxPayPostagePackage { + //record := &model.UserOpenMemberRecord{OpenNo: notifyInfo.OutTradeNo} + //err := record.GetByOpenNo() + //if err != nil { + // logger.Error("err:", err) + //} + //if record.State == 2 { + // ret.ReturnCode = "SUCCESS" + // RespBodyXML(c, ret) + // return + //} + var activity model.Activity + err = model.NewActivityQuerySet(model.DB).IDEq(3).One(&activity) + if err != nil { + logger.Error("coupon err:", err) + return + } + var coupon model.Coupon + err = model.NewCouponQuerySet(model.DB).ActivityTypeEq(activity.ActivityType).One(&coupon) + if err != nil { + logger.Error("coupon err:", err) + //ret.ReturnCode = "Error" + //RespBodyXML(c, ret) + RespOK(c, "Error") + return + } + + defer func() { + if err := recover(); err != nil { + logger.Error("err:", err) + } + }() + + //info, err := model.PostagePackageFeeConfigInfo() + //if err != nil { + // logger.Error("postage package fee config err") + // ret.ReturnCode = "Error" + // RespBodyXML(c, ret) + // return + //} + + //originalMemberConfig, err := model.GetMemberConfig(record.MemberLevel) + //if err != nil { + // logger.Error("err:", err) + // ret.ReturnCode = "Error" + // RespBodyXML(c, ret) + // return + //} + //days := (info.PostagePackageFee * 365) / originalMemberConfig.MemberFee + user := model.GetUserByUid(record.Uid) + days := model.GetPostagePackageMemberDuration(user.MemberLevel) + durationRecord := &model.UserMemberDurationRecord{ + Uid: record.Uid, + Duration: days, + EventType: 1, + MemberLevel: record.MemberLevel, + } + nowTime := time.Now() + + go func() { + begin := model.DB.Begin() + for i := 0; i < 10; i++ { + userCoupon := &model.UserCoupon{ + Uid: record.Uid, + CouponId: coupon.ID, + CouponType: coupon.CouponType, + ActivityType: activity.ActivityType, + ActivityId: activity.ID, + Value: coupon.Value, + State: 1, + ActiveStart: nowTime, + ActiveEnd: nowTime.AddDate(10, 0, 0), + MemberLevel: record.MemberLevel, + } + err = begin.Create(userCoupon).Error + if err != nil { + begin.Rollback() + logger.Error("user coupon err:", err) + return + } + } + + memberExpire := user.MemberExpire.AddDate(0, 0, int(days)) + err := model.NewUserQuerySet(begin).UidEq(record.Uid).GetUpdater().SetMemberExpire(memberExpire).Update() + if err != nil { + begin.Rollback() + logger.Error("update member expire err:", err) + return + } + + err = begin.Create(durationRecord).Error + if err != nil { + logger.Error("create duration record err:", err) + return + } + + err = begin.Commit().Error + if err != nil { + begin.Rollback() + logger.Error("commit err:", err) + return + } + }() + + fundRecord.Uid = uint32(record.Uid) + fundRecord.FundType = model.FundTypePostagePackageFee + fundRecord.Remark = "购买运费包" + } + + fundRecord.TransactionId = bankOrderNo + fundRecord.OutTradeNo = outOrderNo + fundRecord.Status = 2 + err = model.DB.Create(&fundRecord).Error + if err != nil { + logger.Error("create fund record err:", err) + } + logger.Debug("微信推动支付通知") + RespOK(c, "SUCCESS") +} + type WxPayRefundPlaintext struct { Mchid string `json:"mchid"` OutTradeNo string `json:"out_trade_no"` diff --git a/controller/mall.go b/controller/mall.go index b78aa78..4d856bc 100644 --- a/controller/mall.go +++ b/controller/mall.go @@ -289,15 +289,21 @@ func MallOrderCreate(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(order.SerialNo, order.Rm, user.WxOpenID, "N", - wxpay.WxPayBuyGoods, configInfo.NotifyUrl) + //webPay, err := wxpay.WebPay(order.SerialNo, order.Rm, user.WxOpenID, "N", + // wxpay.WxPayBuyGoods, configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("WebPay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: order.SerialNo, OrderId: order.OrderId, OrderType: 6, Attach: wxpay.WxPayBuyGoods}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } - err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: order.SerialNo, OrderId: order.OrderId, OrderType: 6}.Insert() + webPay, err := wxpay.HmJsPayUnifiedOrder(order.SerialNo, order.Rm, user.WxOpenID, configInfo.NotifyUrl) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) diff --git a/controller/order.go b/controller/order.go index e79a1b3..970d89d 100644 --- a/controller/order.go +++ b/controller/order.go @@ -497,13 +497,26 @@ func RentCardOrderCreate(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(order.OrderSn, req.Price, user.WxOpenID, "N", wxpay.WxPayRentCard, configInfo.NotifyUrl) + + err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, OrderId: order.ID, OrderType: 1, Attach: wxpay.WxPayRentCard}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } + //webPay, err := wxpay.WebPay(order.OrderSn, req.Price, user.WxOpenID, "N", wxpay.WxPayRentCard, configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("WebPay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + webPay, err := wxpay.HmJsPayUnifiedOrder(order.OrderSn, req.Price, user.WxOpenID, configInfo.NotifyUrl) + if err != nil { + logger.Error(errors.New("WebPay err")) + RespJson(c, status.InternalServerError, nil) + return + } //webPay, err := wxpay.HmJsPayUnifiedOrder(order.OrderSn, req.Price, user.WxOpenID, "N", wxpay.WxPayRentCard, configInfo.NotifyUrl) //if err != nil { // logger.Error(errors.New("WebPay err")) @@ -524,13 +537,6 @@ func RentCardOrderCreate(c *gin.Context) { // return //} - err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, OrderId: order.ID, OrderType: 1}.Insert() - if err != nil { - logger.Error(errors.New("WebPay err")) - RespJson(c, status.InternalServerError, nil) - return - } - ret := map[string]interface{}{ "web_pay": webPay, "order_id": order.ID, @@ -681,7 +687,21 @@ func OrderPay(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(order.OrderSn, order.PayPrice, user.WxOpenID, "N", wxpay.WxPayRentCard, configInfo.NotifyUrl) + //webPay, err := wxpay.WebPay(order.OrderSn, order.PayPrice, user.WxOpenID, "N", wxpay.WxPayRentCard, configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("WebPay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + orderSn := model.GetOrderSn() + err = model.UserOpenMemberRecord{Uid: uint32(order.Uid), OpenNo: orderSn, OrderId: order.ID, OrderType: 1, Attach: wxpay.WxPayRentCard}.Insert() + if err != nil { + logger.Error(errors.New("WebPay err")) + RespJson(c, status.InternalServerError, nil) + return + } + + webPay, err := wxpay.HmJsPayUnifiedOrder(order.OrderSn, order.PayPrice, user.WxOpenID, configInfo.NotifyUrl) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) diff --git a/controller/user.go b/controller/user.go index a0bab2c..447a2d3 100644 --- a/controller/user.go +++ b/controller/user.go @@ -307,7 +307,7 @@ func OpenMember(c *gin.Context) { //orderSn := utils.GetSerialNo32HEXString() orderSn := model.GetOrderSn() err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: req.MemberLevel, - UserCouponId: req.UserCouponId}.Insert() + UserCouponId: req.UserCouponId, Attach: wxpay.WxPayMember}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) @@ -326,7 +326,7 @@ func OpenMember(c *gin.Context) { // return //} - webPay, err := wxpay.HmJsPayUnifiedOrder(orderSn, totalFee, user.WxOpenID, "N", wxpay.WxPayRentCard, configInfo.NotifyUrl) + webPay, err := wxpay.HmJsPayUnifiedOrder(orderSn, totalFee, user.WxOpenID, configInfo.NotifyUrl) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) @@ -498,7 +498,7 @@ func UpgradeMember(c *gin.Context) { orderSn := model.GetOrderSn() err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, MemberLevel: req.MemberLevel, OrderType: 9, MemberExpire: memberExpire, - UserCouponId: req.UserCouponId}.Insert() + UserCouponId: req.UserCouponId, Attach: wxpay.WxPayUpgradeMember}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) @@ -510,14 +510,19 @@ func UpgradeMember(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(orderSn, uint32(totalFee), user.WxOpenID, "N", wxpay.WxPayUpgradeMember, - configInfo.NotifyUrl) + //webPay, err := wxpay.WebPay(orderSn, uint32(totalFee), user.WxOpenID, "N", wxpay.WxPayUpgradeMember, + // configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("WebPay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + webPay, err := wxpay.HmJsPayUnifiedOrder(orderSn, uint32(totalFee), user.WxOpenID, configInfo.NotifyUrl) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } - RespOK(c, webPay) } @@ -671,7 +676,7 @@ func PayDeposit(c *gin.Context) { user := model.GetUserByUid(uc.Uid) orderSn := model.GetOrderSn() - err := model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn}.Insert() + err := model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, Attach: wxpay.WxPayDeposit}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) @@ -706,13 +711,18 @@ func PayDeposit(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(orderSn, totalFee, user.WxOpenID, "N", wxpay.WxPayDeposit, configInfo.NotifyUrl) + //webPay, err := wxpay.WebPay(orderSn, totalFee, user.WxOpenID, "N", wxpay.WxPayDeposit, configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("WebPay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + webPay, err := wxpay.HmJsPayUnifiedOrder(orderSn, totalFee, user.WxOpenID, configInfo.NotifyUrl) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } - RespOK(c, webPay) } @@ -862,19 +872,25 @@ func UserMemberExpireDelayingPay(c *gin.Context) { return } orderSn := model.GetOrderSn() - webPay, err := wxpay.WebPay(orderSn, uint32(userMemberExpireDelay.DelayAmount), user.WxOpenID, "N", wxpay.WxPayMemberExpireDelay, configInfo.NotifyUrl) - if err != nil { - logger.Error(errors.New("WebPay err")) - RespJson(c, status.InternalServerError, nil) - return - } - err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, OrderId: 0, OrderType: 3}.Insert() + err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: orderSn, OrderId: 0, OrderType: 3, Attach: wxpay.WxPayMemberExpireDelay}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } + //webPay, err := wxpay.WebPay(orderSn, uint32(userMemberExpireDelay.DelayAmount), user.WxOpenID, "N", wxpay.WxPayMemberExpireDelay, configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("WebPay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + webPay, err := wxpay.HmJsPayUnifiedOrder(orderSn, uint32(userMemberExpireDelay.DelayAmount), user.WxOpenID, configInfo.NotifyUrl) + if err != nil { + logger.Error(errors.New("WebPay err")) + RespJson(c, status.InternalServerError, nil) + return + } ret := make(map[string]interface{}, 0) ret["is_surrender"] = 1 ret["expire_days"] = userMemberExpireDelay.ExpireDays diff --git a/controller/user_share_card.go b/controller/user_share_card.go index 96ab690..352e60b 100644 --- a/controller/user_share_card.go +++ b/controller/user_share_card.go @@ -410,14 +410,19 @@ func ShareCardRetrieveCreate(c *gin.Context) { RespJson(c, status.InternalServerError, nil) return } - webPay, err := wxpay.WebPay(retrieve.OrderSn, req.Amount, user.WxOpenID, "N", wxpay.WxPayShareCardRetrieve, configInfo.NotifyUrl) + //webPay, err := wxpay.WebPay(retrieve.OrderSn, req.Amount, user.WxOpenID, "N", wxpay.WxPayShareCardRetrieve, configInfo.NotifyUrl) + //if err != nil { + // logger.Error(errors.New("WebPay err")) + // RespJson(c, status.InternalServerError, nil) + // return + //} + err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: retrieve.OrderSn, OrderId: retrieve.ID, OrderType: 1, Attach: wxpay.WxPayShareCardRetrieve}.Insert() if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) return } - - err = model.UserOpenMemberRecord{Uid: uc.Uid, OpenNo: retrieve.OrderSn, OrderId: retrieve.ID, OrderType: 1}.Insert() + webPay, err := wxpay.HmJsPayUnifiedOrder(retrieve.OrderSn, req.Amount, user.WxOpenID, configInfo.NotifyUrl) if err != nil { logger.Error(errors.New("WebPay err")) RespJson(c, status.InternalServerError, nil) diff --git a/lib/wxpay/wx_pay.go b/lib/wxpay/wx_pay.go index 963b2bb..4910b43 100644 --- a/lib/wxpay/wx_pay.go +++ b/lib/wxpay/wx_pay.go @@ -1039,7 +1039,7 @@ type HmPayUnifiedOrderRsp struct { } //hm 微信支付 -func HmJsPayUnifiedOrder(orderId string, totalFee uint32, openId, profitSharing, attach, notifyUrl string) (*HmPayUnifiedOrderPayData, error) { +func HmJsPayUnifiedOrder(orderId string, totalFee uint32, openId, notifyUrl string) (*HmPayUnifiedOrderPayData, error) { now := time.Now().Local() strTime := fmt.Sprintf("%04d%02d%02d%02d%02d%02d", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second()) diff --git a/model/mall.go b/model/mall.go index b969e0b..261df3b 100644 --- a/model/mall.go +++ b/model/mall.go @@ -5,9 +5,11 @@ import ( "errors" "fmt" "github.com/codinl/go-logger" + "github.com/gin-gonic/gin" "github.com/jinzhu/gorm" "github.com/rs/zerolog/log" "mh-server/lib/utils" + "net/url" "sort" "strconv" "strings" @@ -1070,3 +1072,51 @@ func UpdateDeliverTaskSubStateCancel(orderId uint32) { // logger.Error("commit err:", err) //} } + +func ParaToSubstance(c *gin.Context, sign string) (string, error) { + urlString := c.Request.URL.String() + urlPara, err := url.QueryUnescape(urlString) + if err != nil { + return "", errors.New("url query unescape err") + } + if !strings.Contains(urlPara, "/api/v1/wxpay/notice?") { + return "", errors.New("url err") + } + + para := strings.Replace(urlPara, "/api/v1/wxpay/notice?", "", -1) + //fmt.Println("para--", para) + conspire := strings.Split(para, "&") + signConspire := make([]string, 0, len(conspire)) + for i, _ := range conspire { + + if !strings.Contains(conspire[i], "sign=") { + //fmt.Println("conspire---------", conspire[i]) + signConspire = append(signConspire, conspire[i]) + } + } + sort.Strings(signConspire) + + //signDataJson2, _ := json.MarshalIndent(&signData, "", " ") + //fmt.Println("signDataJson2", string(signDataJson2)) + + signStr := strings.Join(signConspire, "&") + //signStr = signStr + "&key=" + payKey + logger.Info("签字符串1 :", signStr) + return signStr, nil +} + +//paramMap := make(map[string]string, 0) + +//appId := c.Param("app_id") +//bankTrxNo := c.Param("bank_trx_no") +//bankWayCode := c.Param("bank_way_code") +//buyerId := c.Param("buyer_id") +//billDetail := c.Param("buyer_trade_fund_bill_detail") +//notifyType := c.Param("notify_type") +//payModeCode := c.Param("pay_mode_code") +//paySuccessTime := c.Param("pay_success_time") +//payWayCode := c.Param("pay_way_code") +//platTrxNo := c.Param("plat_trx_no") +//settleAmount := c.Param("settle_amount") +//settleAppId := c.Param("settle_app_id") +//signType := c.Param("sign_type") diff --git a/model/model_test.go b/model/model_test.go index 0b2460a..4a6d8c5 100644 --- a/model/model_test.go +++ b/model/model_test.go @@ -164,6 +164,7 @@ func InitTestDB() { &UserActionLog{}, &UserCoupon{}, &ShopperPromotionCode{}, + &UserOpenMemberRecord{}, ) fmt.Println("DB init success") @@ -211,6 +212,7 @@ func InitDBProd() { &ShopperPromotionCode{}, &UserCoupon{}, + &UserOpenMemberRecord{}, ) if err := DBProd.DB().Ping(); err != nil { @@ -2114,7 +2116,7 @@ func TestSha1withRsa(t *testing.T) { } func TestHmJsPayUnifiedOrder(t *testing.T) { - order, err := wxpay.HmJsPayUnifiedOrder("84FDC15BCC", 2, "ohuHh4riVVPxwKHrYHsWwZRpxVMk", "N", wxpay.WxPayRentCard, "https://dev.switch.deovo.com:8004/api/v1/wxpay/notice") + order, err := wxpay.HmJsPayUnifiedOrder("84FDC15BCC", 2, "ohuHh4riVVPxwKHrYHsWwZRpxVMk", "https://dev.switch.deovo.com:8004/api/v1/wxpay/notice") if err != nil { fmt.Println("err:", err) } diff --git a/model/user.go b/model/user.go index 2049f83..5843311 100644 --- a/model/user.go +++ b/model/user.go @@ -288,7 +288,7 @@ type UserOpenMemberRecord struct { Order *Order `json:"order" gorm:"-"` ShareCardRetrieve *ShareCardRetrieve `json:"share_card_retrieve" gorm:"-"` GoodsOrder *GoodsOrder `json:"goods_order" gorm:"-"` - //Attach string `json:"attach"` + Attach string `json:"attach"` } func (o *UserOpenMemberRecord) TableName() string { diff --git a/router/router_app.go b/router/router_app.go index ec862bf..5770f7e 100644 --- a/router/router_app.go +++ b/router/router_app.go @@ -30,7 +30,8 @@ func ConfigAppRouter(r gin.IRouter) { // //api.POST("sys/config", controller.SysConfig) // 配置 // api.POST("step/config", controller.StepConfig) // 步数配置 // //api.POST("upload_user_info", controller.UploadUserInfo) // 上传用户信息 - api.POST("wxpay/notice", controller.PushWXPayNotice) // 微信推送支付通知 + //api.POST("wxpay/notice", controller.PushWXPayNotice) // 微信推送支付通知 + api.GET("wxpay/notice", controller.HmPushWXPayNotice) // 微信推送支付通知 api.POST("wxpay_refund/notice", controller.PushWXPayRefundNotice) // 微信推送支付退款通知 api.POST("aliyun/sts_token", controller.AliyunStsTokenGet) // 阿里云上传图片token api.POST("auto_reply/focus", controller.AutoReplyFocusMsg) // 自动回复