From 82fa077c1be0885edc05921d23c871e832b4b433 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Dec 2019 18:37:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=AC=E4=B8=9C=E5=9B=9E=E8=B0=83=E6=96=B0?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platformapi/jdapi/callback.go | 117 +++++++++++++++++++++++++++------- 1 file changed, 93 insertions(+), 24 deletions(-) diff --git a/platformapi/jdapi/callback.go b/platformapi/jdapi/callback.go index ed20a4a9..84eac71a 100644 --- a/platformapi/jdapi/callback.go +++ b/platformapi/jdapi/callback.go @@ -89,6 +89,8 @@ const ( // 订单 CallbackMsgDeliveryCarrierModify = "deliveryCarrierModify" // 订单转自送消息(是指转自送成功后,用处不大) CallbackMsgOrderAccounting = "orderAccounting" // 订单应结消息 + CallbackMsgApplyCancelOrder = "applyCancelOrder" + CallbackMsgPushDeliveryStatus = "pushDeliveryStatus" // 账务 CallbackMsgEndOrderFinance = "endOrderFinance" // 订单金额拆分完成消息 @@ -99,6 +101,8 @@ const ( CallbackMsgUpdateApplyAfterSaleBill = "updateApplyAfterSaleBill" // 修改售后单申请消息 CallbackMsgNewAfterSaleBill = "newAfterSaleBill" // 新建售后单消息 CallbackMsgAfterSaleBillStatus = "afterSaleBillStatus" // 售后单状态消息 + + CallbackMsgStockIsHave = "stockIsHave" ) type CallbackResponse struct { @@ -107,6 +111,20 @@ type CallbackResponse struct { Data string `json:"data"` } +type CallbackMsg struct { + MsgURL string `json:"-"` + + AppKey string `json:"app_key"` + Token string `json:"token"` + Timestamp string `json:"timestamp"` + Sign string `json:"sign"` + Format string `json:"format"` + V string `json:"v"` + + JdParamJSON string `json:"jd_param_json"` + Param interface{} `json:"-"` +} + type CallbackOrderMsg struct { MsgURL string `json:"msgURL"` BillID string `json:"billId"` @@ -117,7 +135,6 @@ type CallbackOrderMsg struct { } type CallbackDeliveryStatusMsg struct { - MsgURL string `json:"msgURL"` OrderID string `json:"orderId"` DeliveryStatusTime string `json:"deliveryStatusTime"` DeliveryManNo string `json:"deliveryManNo"` @@ -133,6 +150,16 @@ type CallbackDeliveryStatusMsg struct { InputTime string `json:"inputTime"` } +type CallbackStoreStockMsg struct { + StationNo string `json:"stationNo"` + SkuID int64 `json:"skuId"` + Have bool `json:"have"` + Vendibility int `json:"vendibility"` + OperPin string `json:"operPin"` + OperTime int64 `json:"operTime"` + OperSource int `json:"operSource"` +} + const ( OpenSourceJDLSP = 1 OpenSourceJDMedicineCity = 2 @@ -149,20 +176,15 @@ const ( OpenSourceBatchTask = 14 ) -type CallbackStoreStockMsg struct { - MsgURL string `json:"msgURL"` - StationNo string `json:"stationNo"` - SkuId int64 `json:"skuId"` - Have bool `json:"have"` - Vendibility int `json:"vendibility"` - OperPin string `json:"operPin"` - OperTime int64 `json:"operTime"` - OperSource int `json:"operSource"` -} - var ( SuccessResponse = &CallbackResponse{Code: "0", Msg: "success", Data: ""} FormatErrorResponse = &CallbackResponse{Code: "-1", Msg: "failed", Data: ""} + + needDecodeMap = map[string]bool{ + CallbackMsgApplyCancelOrder: true, + CallbackMsgPushDeliveryStatus: true, + CallbackMsgStockIsHave: true, + } ) func Err2CallbackResponse(err error, data string) *CallbackResponse { @@ -231,29 +253,32 @@ func (a *API) GetOrderCallbackMsg(values url.Values, msgURL string) (msg *Callba } func (a *API) GetOrderDeliveryCallbackMsg(values url.Values, msgURL string) (msg *CallbackDeliveryStatusMsg, callbackResponse *CallbackResponse) { - if callbackResponse = a.getCommonOrderCallbackMsg(values, &msg); callbackResponse == nil { - msg.MsgURL = msgURL - } + callbackResponse = a.getCommonOrderCallbackMsg(values, &msg) return msg, callbackResponse } func (a *API) GetStoreStockCallbackMsg(values url.Values, msgURL string) (msg *CallbackStoreStockMsg, callbackResponse *CallbackResponse) { - msg = new(CallbackStoreStockMsg) - msg.MsgURL = msgURL var tmpMsg map[string]interface{} callbackResponse = a.getCommonOrderCallbackMsg(values, &tmpMsg) if callbackResponse == nil { - msg.StationNo = utils.Interface2String(tmpMsg["stationNo"]) - msg.SkuId = utils.Str2Int64(utils.Interface2String(tmpMsg["skuId"])) - msg.Vendibility = int(utils.Str2Int64(utils.Interface2String(tmpMsg["vendibility"]))) - msg.OperPin = utils.Interface2String(tmpMsg["operPin"]) - msg.OperTime = utils.Str2Int64(utils.Interface2String(tmpMsg["operTime"])) - msg.OperSource = int(utils.Str2Int64((utils.Interface2String(tmpMsg["operSource"])))) - msg.Have = utils.Interface2String(tmpMsg["have"]) == "true" + msg = map2StockCallbackMsg(tmpMsg) } return msg, callbackResponse } +func map2StockCallbackMsg(mapData map[string]interface{}) (msg *CallbackStoreStockMsg) { + msg = &CallbackStoreStockMsg{ + StationNo: utils.Interface2String(mapData["stationNo"]), + SkuID: utils.Str2Int64(utils.Interface2String(mapData["skuId"])), + Vendibility: int(utils.Str2Int64(utils.Interface2String(mapData["vendibility"]))), + OperPin: utils.Interface2String(mapData["operPin"]), + OperTime: utils.Str2Int64(utils.Interface2String(mapData["operTime"])), + OperSource: int(utils.Str2Int64((utils.Interface2String(mapData["operSource"])))), + Have: utils.Interface2String(mapData["have"]) == "true", + } + return msg +} + func getMsgURLFromRequest(request *http.Request) (msgURL string) { index := strings.Index(request.URL.Path, CallbackPrefix) if index >= 0 { @@ -261,3 +286,47 @@ func getMsgURLFromRequest(request *http.Request) (msgURL string) { } return msgURL } + +func GetCallbackMsg2(request *http.Request) (callbackMsg *CallbackMsg, callbackResponse *CallbackResponse) { + msgURL := getMsgURLFromRequest(request) + data, err := ioutil.ReadAll(request.Body) + if err != nil { + return nil, Err2CallbackResponse(err, "") + } + values, err := utils.HTTPBody2Values(data, needDecodeMap[msgURL]) + if err != nil { + return nil, FormatErrorResponse + } + mapData := utils.URLValues2Map(values) + if err = utils.Map2StructByJson(mapData, &callbackMsg, false); err == nil { + callbackMsg.MsgURL = msgURL + if msgURL == CallbackMsgDeliveryCarrierModify { + var deliveryMsg *CallbackDeliveryStatusMsg + err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &deliveryMsg) + callbackMsg.Param = deliveryMsg + } else if msgURL == CallbackMsgStockIsHave { + var mapData map[string]interface{} + if err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &mapData); err == nil { + callbackMsg.Param = map2StockCallbackMsg(mapData) + } + } else { + var orderMsg *CallbackOrderMsg + err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &orderMsg) + callbackMsg.Param = orderMsg + } + } + if err != nil { + return nil, Err2CallbackResponse(err, "") + } + return callbackMsg, callbackResponse +} + +func (a *API) CheckCallbackValidation2(callbackMsg *CallbackMsg) (callbackResponse *CallbackResponse) { + mapData := utils.Struct2FlatMap(callbackMsg) + sign := a.signParams(mapData) + if sign != callbackMsg.Sign { + baseapi.SugarLogger.Infof("Signature is not ok, mine:%v, get:%v", sign, callbackMsg.Sign) + return FormatErrorResponse + } + return nil +}