package svc import ( "applet/app/db" "applet/app/db/model" "applet/app/e" "applet/app/md" "applet/app/utils" "errors" "fmt" "github.com/gin-gonic/gin" "github.com/shopspring/decimal" "github.com/tidwall/gjson" "math" "math/rand" "time" ) func BalanceCommunityTeam(c *gin.Context) (interface{}, error) { ord, err := CheckCommunityTeam(c) if err != nil || ord == nil { return nil, err } err = BalancePay(c, ord.Amount, utils.Int64ToStr(ord.Oid), md.CommunityTeam) if err != nil { return nil, err } // 回调 CommonCallbackCommunityTeam(c, utils.AnyToString(ord.Oid), md.BALANCE_PAY) return nil, nil } func AlipayCommunityTeam(c *gin.Context) (interface{}, error) { ord, err := CheckCommunityTeam(c) if err != nil { return nil, err } payParams := &md.AliPayPayParams{ Subject: "小店下单", Amount: ord.Amount, OrdId: utils.AnyToString(ord.Oid), OrderType: md.CommunityTeam, Uid: utils.IntToStr(ord.Uid), AgentId: ord.ParentUid, } r, err := PrepareAlipayCode(c, payParams) if err != nil { return nil, err } return r, nil } func WxPayCommunityTeam(c *gin.Context) (interface{}, error) { var r interface{} var err error ord, err := CheckCommunityTeam(c) if err != nil { return nil, err } params := map[string]string{ "subject": md.NeedPayPart[md.AggregationRecharge], "amount": wxMoneyMulHundred(ord.Amount), "order_type": md.AggregationRecharge, "ord_id": utils.AnyToString(ord.Oid), "pay_wx_mch_id": SysCfgGet(c, "pay_wx_mch_id"), "pay_wx_api_key": SysCfgGet(c, "pay_wx_api_key"), "uid": utils.IntToStr(ord.Uid), } if ord.ParentUid > 0 { user, _ := db.UserThirdPartyFindByID(MasterDb(c), ord.ParentUid) if user.WechatPayInfo == "" { return nil, errors.New("支付失败") } params["pay_wx_mch_id"] = gjson.Get(user.WechatPayInfo, "pay_wx_mch_id").String() params["pay_wx_api_key"] = gjson.Get(user.WechatPayInfo, "pay_wx_api_key").String() } params["notify_url"] = fmt.Sprintf(md.CALLBACK_URL, c.Request.Host, c.GetString("mid"), params["order_type"], md.WX_PAY) r, err = CommPayData(c, params) if err != nil { return nil, err } return r, nil } func AlipayCallbackCommunityTeam(c *gin.Context) { orderId, err := AlipayCallback(c) if err != nil || orderId == "" { return } CommonCallbackCommunityTeam(c, orderId, md.ALIPAY) } func WxPayCallbackCommunityTeam(c *gin.Context) { orderId, err := wxPayCallback(c) if err != nil || orderId == "" { return } CommonCallbackCommunityTeam(c, orderId, md.WX_PAY) } // 微信金额乘100 func wxMoneyMulHundred(m string) string { amount, _ := decimal.NewFromString(m) newM := amount.Mul(decimal.NewFromInt(100)) return newM.String() } func CommonCallbackCommunityTeam(c *gin.Context, orderId string, payMethod string) { ord := db.GetOrderEg(db.DBs[c.GetString("mid")], orderId) if ord == nil { return } // 判断是否失效 if ord.State != 0 { return } ord.State = 1 ord.UpdateAt = time.Now() ord.Code = Code() ord.PayAt = time.Now() ord.PayMethod = md.PayMethodIDs[payMethod] MasterDb(c).Where("id=?", ord.Id).Cols("state,update_at,code,pay_at,pay_method").Update(ord) return } func Code() string { rand.Seed(time.Now().UnixNano()) var digits = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") b := make([]rune, 6) for i := range b { if fl := float64(rand.Intn(10)); fl > math.Log10(float64(i+1)) { b[i] = digits[rand.Intn(len(digits))] } else { b[i] = digits[rand.Intn(10)] } } fmt.Println(string(b)) return string(b) } func CheckCommunityTeam(c *gin.Context) (*model.CommunityTeamOrder, error) { var args struct { MainOrdId string `json:"main_ord_id"` } if err := c.ShouldBindJSON(&args); err != nil || args.MainOrdId == "" { return nil, e.NewErrCode(e.ERR_INVALID_ARGS) } // 查询订单 ord := db.GetOrderEg(db.DBs[c.GetString("mid")], args.MainOrdId) if ord == nil { return nil, e.NewErr(403000, "不存在该订单") } // 判断是否失效 if ord.State != 0 { return nil, e.NewErr(403000, "订单已处理") } return ord, nil }