package api import ( "encoding/json" "fmt" "go_zh/model" "go_zh/pkg/validator" "go_zh/request/api" "go_zh/server" "go_zh/server/chinaums" "github.com/gin-gonic/gin" "github.com/shopspring/decimal" ) type ShopOrderController struct { BaseController } func (shopOrder ShopOrderController) GetOrderSn(c *gin.Context) { mId := c.GetInt("mId") //数据验证 var data api.CreateOrderRequest msg, ok := validator.ValidatorData(c, &data) if !ok { shopOrder.responseError(c, 400, msg) return } if data.PayType == 1 { if mId == 0 { shopOrder.responseError(c, 401, "缺少登陆信息") return } } //对金额进行精度处理 money, err := decimal.NewFromString(data.PayMoney) if err != nil { shopOrder.responseError(c, 400, "金额错误") return } //对最小金额做判断 minMoney, _ := decimal.NewFromString("0.01") if money.LessThan(minMoney) { //当 money 小于 minMoney 时 shopOrder.responseError(c, 400, "金额不合法") return } redisServer := server.GetRedisServerInstance() //获取商户银联信息 shopMchidModel := model.XShopMchid{} var shopMchidInfo = model.XShopMchid{} shopMchidKey := fmt.Sprintf("%s%s", "shopMachidInfo", data.ShopId) shopMchidJson := redisServer.GetStr(shopMchidKey) if len(shopMchidJson) == 0 { //没缓存信息 shopMchidInfo, err = shopMchidModel.GetShopBankMchid(data.ShopId) if err != nil { shopOrder.responseError(c, 400, "商户号信息错误"+err.Error()) return } //存入缓存 jsonData, _ := json.Marshal(shopMchidInfo) redisServer.SetStr(shopMchidKey, string(jsonData), 120) } else { _ = json.Unmarshal([]byte(shopMchidJson), &shopMchidInfo) } isBank := 0 if shopMchidInfo.ID > 0 { //如果有银联信息就是银联支付 isBank = 1 } //获取商户配置 shopSetModel := model.XShopSet{} var shopSetInfo = model.XShopSet{} shopSetKey := fmt.Sprintf("%s%s", "shopSetInfo", data.ShopId) shopSetJson := redisServer.GetStr(shopSetKey) if len(shopSetJson) == 0 { //没缓存信息 shopSetInfo, err = shopSetModel.GetShopSetInfo(data.ShopId) if err != nil { shopOrder.responseError(c, 400, "商户配置信息错误") return } //存入缓存 shopSetJsonData, _ := json.Marshal(shopSetInfo) redisServer.SetStr(shopSetKey, string(shopSetJsonData), 120) } else { _ = json.Unmarshal([]byte(shopSetJson), &shopSetInfo) } var discount decimal.Decimal if shopSetInfo.ID <= 0 { //如果没有 discount, _ = decimal.NewFromString("0") } else { discount = shopSetInfo.Discount } orderSnServer := server.GetOrderSnServerInstance(1) orderSn := orderSnServer.GenerateString("382FS") //创建订单信息 shopOrderModel := model.XShopOrder{} shopOrderModel.ShopID = data.ShopId shopOrderModel.PayType = data.PayType shopOrderModel.MID = mId shopOrderModel.RsSn = orderSn shopOrderModel.PayMoney = money shopOrderModel.Status = 1 shopOrderModel.Discount = discount shopOrderModel.IsClearing = 0 shopOrderModel.IsReport = 0 shopOrderModel.PayCodeSource = data.PayCodeSource shopOrderModel.IsBank = isBank err = shopOrderModel.CreateShopOrder() if err != nil { shopOrder.responseError(c, 400, "订单创建失败") return } chinaumsServer := chinaums.GetOrderSnServerInstance() weChatV2Server := server.GetWeChatV2ServerInstance() aliPayServer := server.GetAliPayServerInstance() var payUrl string var zfbPay string var wxData interface{} var notifyUrl string if data.PayType == 1 { //微信支付 //查询当前用户 openid memberOpenIdModel := model.XMemberOpenID{} var memberOpenIdInfo = model.XMemberOpenID{} memberOpenIdInfo, err = memberOpenIdModel.GetMemberOpenInfo(mId, 1) if err != nil { shopOrder.responseError(c, 409, "会员信息错误") return } if len(memberOpenIdInfo.Openid) <= 0 { shopOrder.responseError(c, 409, "会员信息错误") return } memberOpenId := memberOpenIdInfo.Openid if isBank == 1 { payUrl = chinaumsServer.ShopOrderWxH5Pay(shopMchidInfo, shopOrderModel.RsSn, shopOrderModel.PayMoney, notifyUrl, memberOpenId) } else { notifyUrl = "http://127.0.0.1/api/notify/shopOrder" clientIP := c.ClientIP() wxData = weChatV2Server.WeChatV2JsPay(shopOrderModel.RsSn, shopOrderModel.PayMoney, notifyUrl, "订单支付", memberOpenId, clientIP) } } else { //支付宝支付 if isBank == 1 { payUrl = chinaumsServer.ShopOrderAliH5Pay(shopMchidInfo, shopOrderModel.RsSn, shopOrderModel.PayMoney, notifyUrl) } else { notifyUrl = "http://127.0.0.1/api/notify/shopOrder" returnUrl := "http://127.0.0.1/api/notify/shopOrder" zfbPay = aliPayServer.GetAliWapPay(shopOrderModel.RsSn, shopOrderModel.PayMoney, "订单支付", notifyUrl, returnUrl) } } result := make(map[string]interface{}) result["is_bank"] = isBank result["wx_pay"] = wxData result["zfb_pay"] = zfbPay result["pay_url"] = payUrl shopOrder.responseSuccess(c, result) } // GetOrderInfo 获取订单详情 func (shopOrder ShopOrderController) GetOrderInfo(c *gin.Context) { //数据验证 var data api.GetOrderInfoRequest msg, ok := validator.ValidatorData(c, &data) if !ok { shopOrder.responseError(c, 400, msg) return } shopOrderModel := model.XShopOrder{} info, err := shopOrderModel.GetOrderInfo(data.OrderSn) if err != nil { shopOrder.responseError(c, 400, "订单查询失败") return } if info.RsSn == "" { shopOrder.responseError(c, 400, "订单不存在") return } shopOrder.responseSuccess(c, info) } // GetShopBankOrder 获取商户银联待入账金额列表(最新 10 条) func (shopOrder ShopOrderController) GetShopBankOrder(c *gin.Context) { // 获取当前登录会员 ID mId := c.GetInt("mId") if mId == 0 { shopOrder.responseError(c, 401, "缺少登陆信息") return } // 根据会员 ID 获取店铺信息 shopModel := model.XShop{} shop, err := shopModel.GetShopByMemberId(mId) if err != nil || shop.ID == 0 { shopOrder.responseError(c, 400, "未找到店铺信息") return } // 查询订单列表(最新 10 条) shopOrderModel := model.XShopOrder{} items, err := shopOrderModel.GetBankOrderList(shop.ID) if err != nil { shopOrder.responseError(c, 400, "订单列表查询失败") return } // 获取银联待入账总金额 totalBankMoney, err := shopOrderModel.GetTotalBankMoney(shop.ID) if err != nil { shopOrder.responseError(c, 400, "总金额查询失败") return } // 获取商户配置(折扣比例) shopSetModel := model.XShopSet{} shopSetInfo, err := shopSetModel.GetShopSetInfo(shop.ID) if err != nil { // 如果没有配置,使用默认值 0 shopSetInfo.Discount, _ = decimal.NewFromString("0") } // 计算清分金额和待入账金额 discountPercent := shopSetInfo.Discount clearingMoney := discountPercent.Div(decimal.NewFromInt(100)).Mul(totalBankMoney) bankWaitMoney := totalBankMoney.Sub(clearingMoney) // 处理每个订单项,计算实际收益金额 for i := range items { itemClearingMoney := discountPercent.Div(decimal.NewFromInt(100)).Mul(items[i].PayMoney) items[i].PayMoney = items[i].PayMoney.Sub(itemClearingMoney) items[i].IsClearing = 0 // 设置为待清分状态 } // 构建响应数据 result := map[string]interface{}{ "total_money": bankWaitMoney.String(), "list": items, } shopOrder.responseSuccess(c, result) }