DengBiao 1 anno fa
parent
commit
4e5fcb3eeb
5 ha cambiato i file con 213 aggiunte e 86 eliminazioni
  1. +33
    -0
      app/customer/hdl/hdl_call_back.go
  2. +4
    -86
      app/customer/hdl/hdl_pay.go
  3. +34
    -0
      app/customer/md/alipay.go
  4. +141
    -0
      app/customer/svc/svc_pay.go
  5. +1
    -0
      app/router/customer_router.go

+ 33
- 0
app/customer/hdl/hdl_call_back.go Vedi File

@@ -0,0 +1,33 @@
package hdl

import (
"applet/app/customer/md"
"applet/app/customer/svc"
"applet/app/e"
"fmt"
"github.com/gin-gonic/gin"
)

func AlipayJsApiCallBack(c *gin.Context) {
data := svc.CheckAllCallbackParams(c)
if data == nil {
e.OutErr(c, e.ERR_INVALID_ARGS)
return
}
c.Set("callback", data)
args, ok := data.(*md.AliPayCallback)
if !ok {
fmt.Println("反射ok失败")
e.OutErr(c, e.ERR_INVALID_ARGS, "反射失败")
return
}

_, err := svc.DealCentralKitchenForSchoolOrderCallBack(args.OutTradeNo, args.TradeStatus)
if err != nil {
e.OutErr(c, e.ERR, err.Error())
return
}
//TODO::此处需要直接输出 success,避免支付宝重复回调
//c.Header("Content-Type", "text/html; charset=utf-8")
c.String(200, "success")
}

+ 4
- 86
app/customer/hdl/hdl_pay.go Vedi File

@@ -38,6 +38,7 @@ func BuyPackage(c *gin.Context) {

func OrdState(c *gin.Context) {
outTradeNo := c.DefaultQuery("out_trade_no", "")

centralKitchenForSchoolPackageOrd := db.CentralKitchenForSchoolPackageOrd{}
centralKitchenForSchoolPackageOrd.Set(outTradeNo)
ord, err := centralKitchenForSchoolPackageOrd.GetCentralKitchenForSchoolPackageOrd()
@@ -71,92 +72,9 @@ func OrdState(c *gin.Context) {
e.OutErr(c, e.ERR, err2.Error())
return
}
if result.TradeStatus == "TRADE_CLOSED" {
ord.State = enum.CentralKitchenForSchoolPackageOrdStateForFail
}

if result.TradeStatus == "TRADE_SUCCESS" {
ord.State = enum.CentralKitchenForSchoolPackageOrdStateForSuccess
ord.OrdState = enum.CentralKitchenForSchoolPackageOrdOrdStateForSuccess

//TODO::将预留数据插入到 `central_kitchen_for_school_user_with_day`
var data []*model.CentralKitchenForSchoolUserWithDay
err4 := json.Unmarshal([]byte(ord.WithDayData), &data)
if err4 != nil {
e.OutErr(c, e.ERR, err4.Error())
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)
_, err5 := centralKitchenForSchoolUserWithDayDb.BatchAddCentralKitchenForSchoolUserWithDays(data)
if err != nil {
e.OutErr(c, e.ERR, err5.Error())
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] {
_, err3 := 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 err3 != nil {
e.OutErr(c, e.ERR, err3.Error())
return
}
}
}
}
_, err3 := centralKitchenForSchoolPackageOrd.CentralKitchenForSchoolPackageOrdUpdate(ord, "state", "ord_state")
if err3 != nil {
e.OutErr(c, e.ERR_DB_ORM, err3.Error())
ord.State, err2 = svc.DealCentralKitchenForSchoolOrderCallBack(outTradeNo, result.TradeStatus)
if err != nil {
e.OutErr(c, e.ERR, err2.Error())
return
}
}


+ 34
- 0
app/customer/md/alipay.go Vedi File

@@ -0,0 +1,34 @@
package md

// AliPayCallback 支付宝的回调结构体
type AliPayCallback struct {
AppID string `json:"app_id"`
AuthAppID string `json:"auth_app_id"`
BuyerID string `json:"buyer_id"`
BuyerLogonID string `json:"buyer_logon_id"`
BuyerPayAmount string `json:"buyer_pay_amount"`
Charset string `json:"charset"`
FundBillList string `json:"fund_bill_list"`
GmtCreate string `json:"gmt_create"`
GmtPayment string `json:"gmt_payment"`
InvoiceAmount string `json:"invoice_amount"`
OrderType string `json:"order_type"`
MasterID string `json:"master_id"`
NotifyID string `json:"notify_id"`
NotifyTime string `json:"notify_time"`
NotifyType string `json:"notify_type"`
OutTradeNo string `json:"out_trade_no"`
PassbackParams string `json:"passback_params"`
PointAmount string `json:"point_amount"`
ReceiptAmount string `json:"receipt_amount"`
SellerEmail string `json:"seller_email"`
SellerID string `json:"seller_id"`
Sign string `json:"sign"`
SignType string `json:"sign_type"`
Subject string `json:"subject"`
TotalAmount string `json:"total_amount"`
TradeNo string `json:"trade_no"`
TradeStatus string `json:"trade_status"`
Version string `json:"version"`
PayMethod string `json:"pay_method"`
}

+ 141
- 0
app/customer/svc/svc_pay.go Vedi File

@@ -6,8 +6,13 @@ import (
"applet/app/db/model"
enum2 "applet/app/enum"
"applet/app/utils"
"applet/app/utils/logx"
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"io/ioutil"
"net/url"
"time"
)

@@ -230,3 +235,139 @@ func NursingHomeBuyPackageReq(c *gin.Context, req md.NursingHomeBuyPackageReq) (
tradeNo = resp.TradeNo
return
}

func DealCentralKitchenForSchoolOrderCallBack(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 == "TRADE_CLOSED" {
ord.State = enum2.CentralKitchenForSchoolPackageOrdStateForFail
}

if tradeStatus == "TRADE_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)))
dataAlipay, _ := GetAlipayCallbackParams(body)
if dataAlipay != nil {
return dataAlipay
}
return nil
}

// GetAlipayCallbackParams 支付宝参数解析
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
}

+ 1
- 0
app/router/customer_router.go Vedi File

@@ -18,6 +18,7 @@ func CustomerInit(r *gin.RouterGroup) {
r.GET("/sanHu", hdl.SanHu)
r.POST("/test", hdl.Demo)
r.POST("/curlAlipayPlanetEcocampusApiRosterSignUpInfoTest", hdl.CurlAlipayPlanetEcocampusApiRosterSignUpInfo)
r.POST("/alipayJsApiCallBack", hdl.AlipayJsApiCallBack)

r.POST("/login", hdl.Login)
r.POST("/register", hdl.Register)


Caricamento…
Annulla
Salva