@@ -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") | |||
} |
@@ -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 | |||
} | |||
} | |||
@@ -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"` | |||
} |
@@ -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 | |||
} |
@@ -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) | |||