京东回调新实现
This commit is contained in:
@@ -89,6 +89,8 @@ const (
|
|||||||
// 订单
|
// 订单
|
||||||
CallbackMsgDeliveryCarrierModify = "deliveryCarrierModify" // 订单转自送消息(是指转自送成功后,用处不大)
|
CallbackMsgDeliveryCarrierModify = "deliveryCarrierModify" // 订单转自送消息(是指转自送成功后,用处不大)
|
||||||
CallbackMsgOrderAccounting = "orderAccounting" // 订单应结消息
|
CallbackMsgOrderAccounting = "orderAccounting" // 订单应结消息
|
||||||
|
CallbackMsgApplyCancelOrder = "applyCancelOrder"
|
||||||
|
CallbackMsgPushDeliveryStatus = "pushDeliveryStatus"
|
||||||
|
|
||||||
// 账务
|
// 账务
|
||||||
CallbackMsgEndOrderFinance = "endOrderFinance" // 订单金额拆分完成消息
|
CallbackMsgEndOrderFinance = "endOrderFinance" // 订单金额拆分完成消息
|
||||||
@@ -99,6 +101,8 @@ const (
|
|||||||
CallbackMsgUpdateApplyAfterSaleBill = "updateApplyAfterSaleBill" // 修改售后单申请消息
|
CallbackMsgUpdateApplyAfterSaleBill = "updateApplyAfterSaleBill" // 修改售后单申请消息
|
||||||
CallbackMsgNewAfterSaleBill = "newAfterSaleBill" // 新建售后单消息
|
CallbackMsgNewAfterSaleBill = "newAfterSaleBill" // 新建售后单消息
|
||||||
CallbackMsgAfterSaleBillStatus = "afterSaleBillStatus" // 售后单状态消息
|
CallbackMsgAfterSaleBillStatus = "afterSaleBillStatus" // 售后单状态消息
|
||||||
|
|
||||||
|
CallbackMsgStockIsHave = "stockIsHave"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CallbackResponse struct {
|
type CallbackResponse struct {
|
||||||
@@ -107,6 +111,20 @@ type CallbackResponse struct {
|
|||||||
Data string `json:"data"`
|
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 {
|
type CallbackOrderMsg struct {
|
||||||
MsgURL string `json:"msgURL"`
|
MsgURL string `json:"msgURL"`
|
||||||
BillID string `json:"billId"`
|
BillID string `json:"billId"`
|
||||||
@@ -117,7 +135,6 @@ type CallbackOrderMsg struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type CallbackDeliveryStatusMsg struct {
|
type CallbackDeliveryStatusMsg struct {
|
||||||
MsgURL string `json:"msgURL"`
|
|
||||||
OrderID string `json:"orderId"`
|
OrderID string `json:"orderId"`
|
||||||
DeliveryStatusTime string `json:"deliveryStatusTime"`
|
DeliveryStatusTime string `json:"deliveryStatusTime"`
|
||||||
DeliveryManNo string `json:"deliveryManNo"`
|
DeliveryManNo string `json:"deliveryManNo"`
|
||||||
@@ -133,6 +150,16 @@ type CallbackDeliveryStatusMsg struct {
|
|||||||
InputTime string `json:"inputTime"`
|
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 (
|
const (
|
||||||
OpenSourceJDLSP = 1
|
OpenSourceJDLSP = 1
|
||||||
OpenSourceJDMedicineCity = 2
|
OpenSourceJDMedicineCity = 2
|
||||||
@@ -149,20 +176,15 @@ const (
|
|||||||
OpenSourceBatchTask = 14
|
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 (
|
var (
|
||||||
SuccessResponse = &CallbackResponse{Code: "0", Msg: "success", Data: ""}
|
SuccessResponse = &CallbackResponse{Code: "0", Msg: "success", Data: ""}
|
||||||
FormatErrorResponse = &CallbackResponse{Code: "-1", Msg: "failed", 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 {
|
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) {
|
func (a *API) GetOrderDeliveryCallbackMsg(values url.Values, msgURL string) (msg *CallbackDeliveryStatusMsg, callbackResponse *CallbackResponse) {
|
||||||
if callbackResponse = a.getCommonOrderCallbackMsg(values, &msg); callbackResponse == nil {
|
callbackResponse = a.getCommonOrderCallbackMsg(values, &msg)
|
||||||
msg.MsgURL = msgURL
|
|
||||||
}
|
|
||||||
return msg, callbackResponse
|
return msg, callbackResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *API) GetStoreStockCallbackMsg(values url.Values, msgURL string) (msg *CallbackStoreStockMsg, callbackResponse *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{}
|
var tmpMsg map[string]interface{}
|
||||||
callbackResponse = a.getCommonOrderCallbackMsg(values, &tmpMsg)
|
callbackResponse = a.getCommonOrderCallbackMsg(values, &tmpMsg)
|
||||||
if callbackResponse == nil {
|
if callbackResponse == nil {
|
||||||
msg.StationNo = utils.Interface2String(tmpMsg["stationNo"])
|
msg = map2StockCallbackMsg(tmpMsg)
|
||||||
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"
|
|
||||||
}
|
}
|
||||||
return msg, callbackResponse
|
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) {
|
func getMsgURLFromRequest(request *http.Request) (msgURL string) {
|
||||||
index := strings.Index(request.URL.Path, CallbackPrefix)
|
index := strings.Index(request.URL.Path, CallbackPrefix)
|
||||||
if index >= 0 {
|
if index >= 0 {
|
||||||
@@ -261,3 +286,47 @@ func getMsgURLFromRequest(request *http.Request) (msgURL string) {
|
|||||||
}
|
}
|
||||||
return msgURL
|
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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user