京东回调新实现

This commit is contained in:
gazebo
2019-12-06 18:37:48 +08:00
parent 8d067aff33
commit 82fa077c1b

View File

@@ -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
}