package svc import ( "applet/app/cfg" "applet/app/comm/db" "applet/app/comm/e" "applet/app/comm/svc" "applet/app/comm/utils" "applet/app/comm/utils/logx" "applet/app/store/md" "code.fnuoos.com/go_rely_warehouse/zyos_go_pay.git/pay" "code.fnuoos.com/go_rely_warehouse/zyos_model.git/src/models" "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/iGoogle-ink/gopay/alipay" "io/ioutil" "net/url" "time" ) func CallBack(c *gin.Context, OrderType string) { orderId, err := AlipayCallback(c) fmt.Println("callback orderId is ", orderId) if err != nil || orderId == "" { _ = logx.Warn(err) return } if OrderType == "money" { err = CommMoneyCallback(c, orderId) } if err != nil { _ = logx.Error(err) c.String(200, "fail") return } c.String(200, "success") return } func CommMoneyCallback(c *gin.Context, oid string) error { sess := svc.MasterDb(c).NewSession() defer sess.Close() sess.Begin() var data models.CampTaskStoreUserAmountOrder sess.Where("oid=?", oid).Get(&data) if data.Id == 0 { sess.Rollback() return e.NewErr(400, "订单不存在") } if data.State == 1 { sess.Rollback() return nil } data.State = 1 _, err := sess.Where("oid=?", data.Oid).Update(&data) if err != nil { sess.Rollback() return e.NewErr(400, "修改失败") } var amountData models.CampTaskStoreUserAmount sess.Where("store_id=?", data.StoreId).Get(&amountData) if amountData.Id == 0 { amountData = models.CampTaskStoreUserAmount{ StoreId: data.StoreId, Amount: "0", } _, err := sess.Insert(&amountData) if err != nil { sess.Rollback() return err } } amountData.Amount = utils.Float64ToStr(utils.StrToFloat64(amountData.Amount) + utils.StrToFloat64(data.Money)) var flow = models.CampTaskDeductMoneyList{ Type: 0, CreateTime: time.Now(), Money: data.Money, AfterMoney: amountData.Amount, StoreId: data.StoreId, Title: "预存款充值", OrdType: "buy", } _, err = sess.Insert(&flow) if err != nil { sess.Rollback() return e.NewErr(400, "修改失败") } _, err = svc.MasterDb(c).Where("id=?", amountData.Id).Update(&amountData) if err != nil { sess.Rollback() return e.NewErr(400, "修改失败") } sess.Commit() return nil } func AlipayCallback(c *gin.Context) (string, error) { data, ok := c.Get("callback") if data == nil || !ok { return "", e.NewErrCode(e.ERR_INVALID_ARGS) } args := data.(*md.AliPayCallback) c.Set("mid", args.MasterID) // 回调交易状态失败 if args.TradeStatus != "TRADE_SUCCESS" { return "", logx.Warn("Alipay Failed : trade status failed") } return args.OutTradeNo, nil } func CheckAllCallbackParams(c *gin.Context) (interface{}, string, string) { body, _ := ioutil.ReadAll(c.Request.Body) fmt.Println(body) utils.FilePutContents("CheckAllCallbackParams", string(body)) dataAlipay, _ := GetAlipayCallbackParams(body) if dataAlipay != nil { return dataAlipay, dataAlipay.OrderType, dataAlipay.PayMethod } return nil, "", "" } func GetAlipayCallbackParams(body []byte) (*md.AliPayCallback, error) { decodeArgs, err := url.QueryUnescape(string(body)) if err != nil { _ = logx.Warn(err) return nil, logx.Warn("回调参数解码错误") } data, err := url.ParseQuery(decodeArgs) if err != nil { return nil, err } dataMap := make(map[string]interface{}) for k := range data { dataMap[k] = data.Get(k) } callbackStr := utils.Serialize(dataMap) fmt.Println("支付宝回调数据", string(callbackStr)) var args md.AliPayCallback if err := json.Unmarshal(callbackStr, &args); err != nil { return nil, logx.Warn(err) } return &args, nil } func AlipayPc(c *gin.Context, p *md.AliPayPayParams) (string, error) { req, err := CommAlipayConfig(c, p) if err != nil { return "", err } param, err := pay.AlipayPc(req) return utils.AnyToString(param), nil } func CommAlipayConfig(c *gin.Context, p *md.AliPayPayParams) (map[string]string, error) { //获取支付配置 req := map[string]string{ "pay_ali_use_type": db.SysCfgGet(c, "pay_ali_use_type"), "private_key": db.SysCfgGet(c, "pay_ali_private_key"), "app_id": db.SysCfgGet(c, "pay_ali_app_id"), "rsa": db.SysCfgGet(c, "pay_ali_key_len_type"), "pkcs": db.SysCfgGet(c, "pay_ali_key_format_type"), } if req["private_key"] == "" || req["app_id"] == "" { return req, e.NewErr(400, "请在后台正确配置支付宝") } if req["pay_ali_use_type"] == "1" { req["private_key"] = db.SysCfgGet(c, "pay_ali_new_private_key") req["app_id"] = db.SysCfgGet(c, "pay_ali_new_app_id") appCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + db.SysCfgGet(c, "pay_app_cert_sn")) if err != nil { fmt.Println(err) return nil, err } if appCertSN == "" { fmt.Println(err) return nil, err } req["pay_app_cert_sn"] = appCertSN aliPayPublicCertSN, err := alipay.GetCertSN(cfg.WxappletFilepath.URL + "/" + db.SysCfgGet(c, "pay_alipayrsa_public_key")) if err != nil { fmt.Println(err) return nil, err } if aliPayPublicCertSN == "" { fmt.Println(err) return nil, err } req["pay_alipayrsa_public_key"] = aliPayPublicCertSN } req["ord_id"] = p.OrdId req["amount"] = p.Amount req["subject"] = p.Subject req["order_type"] = p.OrderType host := c.Request.Host if cfg.Prd == false { host = "https://n40j680693.goho.co" } req["notify_url"] = fmt.Sprintf("%s/api/v1/campTask/store/alipay/pay/callback?master_id=%s&order_type=%s", host, c.GetString("mid"), p.OrderType) req["platform"] = "pc" req["page_url"] = c.GetString("page_url") fmt.Println(req) return req, nil }