From 82fa077c1be0885edc05921d23c871e832b4b433 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 6 Dec 2019 18:37:48 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BA=AC=E4=B8=9C=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E6=96=B0=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 +} From 61176c26186b671a12d3a3b02355e556978958af Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 7 Dec 2019 19:16:55 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BA=AC=E4=B8=9C=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E9=87=8D=E6=96=B0=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 | 21 +++-- platformapi/jdapi/callback_test.go | 123 +++++++++++++++++++++++++++++ platformapi/jdapi/order_test.go | 123 ----------------------------- 3 files changed, 133 insertions(+), 134 deletions(-) create mode 100644 platformapi/jdapi/callback_test.go diff --git a/platformapi/jdapi/callback.go b/platformapi/jdapi/callback.go index 84eac71a..e2cf34e1 100644 --- a/platformapi/jdapi/callback.go +++ b/platformapi/jdapi/callback.go @@ -122,7 +122,7 @@ type CallbackMsg struct { V string `json:"v"` JdParamJSON string `json:"jd_param_json"` - Param interface{} `json:"-"` + Param interface{} `json:"param"` } type CallbackOrderMsg struct { @@ -287,17 +287,17 @@ func getMsgURLFromRequest(request *http.Request) (msgURL string) { return msgURL } -func GetCallbackMsg2(request *http.Request) (callbackMsg *CallbackMsg, callbackResponse *CallbackResponse) { +func GetCallbackMsg2(request *http.Request) (callbackMsg *CallbackMsg, mapData map[string]interface{}, callbackResponse *CallbackResponse) { msgURL := getMsgURLFromRequest(request) data, err := ioutil.ReadAll(request.Body) if err != nil { - return nil, Err2CallbackResponse(err, "") + return nil, nil, Err2CallbackResponse(err, "") } values, err := utils.HTTPBody2Values(data, needDecodeMap[msgURL]) if err != nil { - return nil, FormatErrorResponse + return nil, nil, FormatErrorResponse } - mapData := utils.URLValues2Map(values) + mapData = utils.URLValues2Map(values) if err = utils.Map2StructByJson(mapData, &callbackMsg, false); err == nil { callbackMsg.MsgURL = msgURL if msgURL == CallbackMsgDeliveryCarrierModify { @@ -316,16 +316,15 @@ func GetCallbackMsg2(request *http.Request) (callbackMsg *CallbackMsg, callbackR } } if err != nil { - return nil, Err2CallbackResponse(err, "") + return nil, nil, Err2CallbackResponse(err, "") } - return callbackMsg, callbackResponse + return callbackMsg, mapData, callbackResponse } -func (a *API) CheckCallbackValidation2(callbackMsg *CallbackMsg) (callbackResponse *CallbackResponse) { - mapData := utils.Struct2FlatMap(callbackMsg) +func (a *API) CheckCallbackValidation2(mapData map[string]interface{}, signInData string) (callbackResponse *CallbackResponse) { sign := a.signParams(mapData) - if sign != callbackMsg.Sign { - baseapi.SugarLogger.Infof("Signature is not ok, mine:%v, get:%v", sign, callbackMsg.Sign) + if sign != signInData { + baseapi.SugarLogger.Infof("Signature is not ok, mine:%s, signInData:%s", sign, signInData) return FormatErrorResponse } return nil diff --git a/platformapi/jdapi/callback_test.go b/platformapi/jdapi/callback_test.go new file mode 100644 index 00000000..4ba252f4 --- /dev/null +++ b/platformapi/jdapi/callback_test.go @@ -0,0 +1,123 @@ +package jdapi + +import ( + "io/ioutil" + "net/http" + "net/url" + "strings" + "testing" + + "git.rosy.net.cn/baseapi/utils" +) + +func TestGetCallbackMsg(t *testing.T) { + for _, strPair := range [][]string{ + []string{ + CallbackMsgOrderAccounting, + ` + timestamp=2019-12-03+06%3A28%3A40&sign=84AF173723A89E95AD7D0CFECA293683&v=1.0&jd_param_json=%7B%22billId%22%3A%22929053552000142%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222019-12-03+06%3A28%3A37%22%7D&token=77e703b7-7997-441b-a12a-2e522efb117a&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json + `, + }, + []string{ + CallbackMsgPushDeliveryStatus, + ` + timestamp=2018-06-27%2B09%253A08%253A41&sign=54D9A8515BB5650DC3B81366E3286570&v=1.0&jd_param_json=%257B%2522createPin%2522%253A%2522JD_21134dac1c251d2%2522%252C%2522deliveryCarrierName%2522%253A%2522%25E8%25BE%25BE%25E8%25BE%25BE%25E4%25B8%2593%25E9%2580%2581%2522%252C%2522deliveryCarrierNo%2522%253A%25229966%2522%252C%2522deliveryStatus%2522%253A%252210%2522%252C%2522deliveryStatusTime%2522%253A%25222018-06-27%2B09%253A08%253A41%2522%252C%2522inputTime%2522%253A%25222018-06-27%2B09%253A08%253A41%2522%252C%2522orderId%2522%253A%2522815324888000121%2522%257D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json + `, + }, + []string{ + CallbackMsgApplyCancelOrder, + ` + timestamp=2018-06-27%2B13%253A35%253A29&sign=F1398D658514D8864FFB56F5EF2C4792&v=1.0&jd_param_json=%257B%2522billId%2522%253A%2522815339944000322%2522%252C%2522remark%2522%253A%2522%25E5%2595%2586%25E5%25AE%25B6%25E7%25BC%25BA%25E8%25B4%25A7%2522%252C%2522statusId%2522%253A%252220030%2522%252C%2522timestamp%2522%253A%25222018-06-27%2B13%253A35%253A24%2522%257D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json + `, + }, + } { + callbackStr := strings.TrimSpace(strPair[1]) + callbackMsg, mapData, resp := GetCallbackMsg2(utils.BuildRequest(http.MethodPost, strPair[0], callbackStr, "")) + if resp != nil { + t.Fatal(resp) + } + resp = api.CheckCallbackValidation2(mapData, callbackMsg.Sign) + if resp != nil { + t.Fatal(resp) + } + sugarLogger.Debug(utils.Format4Output(callbackMsg, false)) + } +} + +func TestSimulateSendNewOrderMsg(t *testing.T) { + orderInfo := &CallbackOrderMsg{ + BillID: "813344594000041", + StatusID: OrderStatusPurchased, + Timestamp: utils.GetCurTimeStr(), + } + params := make(url.Values) + params.Set("token", api.token) + params.Set("app_key", api.appKey) + params.Set("timestamp", utils.GetCurTimeStr()) + params.Set("v", "1.0") + params.Set("format", "json") + params.Set(paramJson, string(utils.MustMarshal(orderInfo))) + + mapData := utils.URLValues2Map(params) + params.Set(signKey, api.signParams(mapData)) + + response, err := http.PostForm("http://callback.test.jxc4.com/djsw/newOrder", params) + if err != nil { + t.Fatal(err) + } + bodyData, _ := ioutil.ReadAll(response.Body) + sugarLogger.Debug(string(bodyData)) +} + +/* +DELETE t1 +FROM jdorder t1 +WHERE t1.jdorderid = 815438712001141; +*/ +func TestCallbackMsgPlayback(t *testing.T) { + baseURL := "http://callback.test.jxc4.com:8080/" + playbackData := [][]string{ + []string{ + "timestamp=2018-06-28+16%3A33%3A06&sign=B9FF8D5428F1DD1031DEF84AD08AB546&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222018-06-28+16%3A33%3A03%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", + baseURL + "djsw/newOrder", + }, + []string{ + "timestamp=2018-06-28+16%3A40%3A19&sign=10C8ACAC71D954C0607046AC669079ED&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%222%22%2C%22timestamp%22%3A%222018-06-28+16%3A40%3A19%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", + baseURL + "djsw/pickFinishOrder", + }, + []string{ + "timestamp=2018-06-28%2B16%253A40%253A19&sign=E270E90A7F1712331AD210CCB477ED32&v=1.0&jd_param_json=%257B%2522createPin%2522%253A%2522JD_33d45ba55afeb1%2522%252C%2522deliveryCarrierName%2522%253A%2522%25E8%25BE%25BE%25E8%25BE%25BE%25E4%25B8%2593%25E9%2580%2581%2522%252C%2522deliveryCarrierNo%2522%253A%25229966%2522%252C%2522deliveryStatus%2522%253A%252210%2522%252C%2522deliveryStatusTime%2522%253A%25222018-06-28%2B16%253A40%253A19%2522%252C%2522inputTime%2522%253A%25222018-06-28%2B16%253A40%253A19%2522%252C%2522orderId%2522%253A%2522815438712001141%2522%257D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", + baseURL + "djsw/pushDeliveryStatus", + }, + []string{ + "sign=5d506d2ed7d0f353bd578df64a47c1a2b596278a×tamp=1530176122&delivery_id=423701&status=0&appkey=3c0a05d464c247c19d7ec13accc78605&order_id=815438712001141&mt_peisong_id=1530176122092538", + baseURL + "mtps/status", + }, + []string{ + "sign=037e8ef50ce575c3fcc00b9507a46432c0a64768×tamp=1530176299&delivery_id=423701&status=20&appkey=3c0a05d464c247c19d7ec13accc78605&courier_phone=13281800720&courier_name=%E6%9D%8E%E5%B7%9D&order_id=815438712001141&mt_peisong_id=1530176122092538", + baseURL + "mtps/status", + }, + []string{ + "timestamp=2018-06-28+16%3A58%3A20&sign=1DD702433D915DE19F4AC3DD39287E04&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%2233040%22%2C%22timestamp%22%3A%222018-06-28+16%3A58%3A20%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", + baseURL + "djsw/deliveryOrder", + }, + []string{ + "sign=73aae156870e530541d3da1c372411e9bc589470×tamp=1530176533&delivery_id=423701&status=30&appkey=3c0a05d464c247c19d7ec13accc78605&courier_phone=13281800720&courier_name=%E6%9D%8E%E5%B7%9D&order_id=815438712001141&mt_peisong_id=1530176122092538", + baseURL + "mtps/status", + }, + []string{ + "sign=ffe6c9ac09d21505106631bb92fb983599dde69d×tamp=1530177544&delivery_id=423701&status=50&appkey=3c0a05d464c247c19d7ec13accc78605&courier_phone=13281800720&courier_name=%E6%9D%8E%E5%B7%9D&order_id=815438712001141&mt_peisong_id=1530176122092538", + baseURL + "mtps/status", + }, + []string{ + "timestamp=2018-06-28+17%3A19%3A25&sign=06D8763C5B569485FD250F5C283E8B76&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%2233060%22%2C%22timestamp%22%3A%222018-06-28+17%3A19%3A04%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", + baseURL + "djsw/finishOrder", + }, + } + for _, v := range playbackData { + _, err := utils.SendFakeRequest(http.MethodPost, v[1], v[0], "") + if err != nil { + t.Fatal(err) + } + } +} diff --git a/platformapi/jdapi/order_test.go b/platformapi/jdapi/order_test.go index f9bb832a..21f46625 100644 --- a/platformapi/jdapi/order_test.go +++ b/platformapi/jdapi/order_test.go @@ -1,10 +1,6 @@ package jdapi import ( - "io/ioutil" - "net/http" - "net/url" - "strings" "testing" "git.rosy.net.cn/baseapi/utils" @@ -51,125 +47,6 @@ func TestOrderQuery(t *testing.T) { } } -func TestGetOrderCallbackMsg(t *testing.T) { - callbackStr := strings.TrimSpace(` - timestamp=2019-12-03+06%3A28%3A40&sign=84AF173723A89E95AD7D0CFECA293683&v=1.0&jd_param_json=%7B%22billId%22%3A%22929053552000142%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222019-12-03+06%3A28%3A37%22%7D&token=77e703b7-7997-441b-a12a-2e522efb117a&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json - - `) - values, _, msgURL, resp := GetCallbackMsg(utils.BuildRequest(http.MethodPost, "", callbackStr, ""), false) - result, resp := api.GetOrderCallbackMsg(values, msgURL) - - if resp != nil { - t.Fatal(resp) - } - sugarLogger.Debug(result) -} - -func TestGetOrderDeliveryCallbackMsg(t *testing.T) { - callbackStr := strings.TrimSpace(` - timestamp=2018-06-27%2B09%253A08%253A41&sign=54D9A8515BB5650DC3B81366E3286570&v=1.0&jd_param_json=%257B%2522createPin%2522%253A%2522JD_21134dac1c251d2%2522%252C%2522deliveryCarrierName%2522%253A%2522%25E8%25BE%25BE%25E8%25BE%25BE%25E4%25B8%2593%25E9%2580%2581%2522%252C%2522deliveryCarrierNo%2522%253A%25229966%2522%252C%2522deliveryStatus%2522%253A%252210%2522%252C%2522deliveryStatusTime%2522%253A%25222018-06-27%2B09%253A08%253A41%2522%252C%2522inputTime%2522%253A%25222018-06-27%2B09%253A08%253A41%2522%252C%2522orderId%2522%253A%2522815324888000121%2522%257D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json - -`) - values, _, msgURL, resp := GetCallbackMsg(utils.BuildRequest(http.MethodPost, "", callbackStr, ""), true) - result, resp := api.GetOrderDeliveryCallbackMsg(values, msgURL) - - if resp != nil { - t.Fatal(resp) - } - sugarLogger.Debug(result) -} - -func TestGetOrderApplyCancelCallbackMsg(t *testing.T) { - callbackStr := strings.TrimSpace(` - timestamp=2018-06-27%2B13%253A35%253A29&sign=F1398D658514D8864FFB56F5EF2C4792&v=1.0&jd_param_json=%257B%2522billId%2522%253A%2522815339944000322%2522%252C%2522remark%2522%253A%2522%25E5%2595%2586%25E5%25AE%25B6%25E7%25BC%25BA%25E8%25B4%25A7%2522%252C%2522statusId%2522%253A%252220030%2522%252C%2522timestamp%2522%253A%25222018-06-27%2B13%253A35%253A24%2522%257D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json - - `) - values, _, msgURL, resp := GetCallbackMsg(utils.BuildRequest(http.MethodPost, "", callbackStr, ""), true) - result, resp := api.GetOrderApplyCancelCallbackMsg(values, msgURL) - - if resp != nil { - t.Fatal(resp) - } - sugarLogger.Debug(result) -} - -func TestSimulateSendNewOrderMsg(t *testing.T) { - orderInfo := &CallbackOrderMsg{ - BillID: "813344594000041", - StatusID: OrderStatusPurchased, - Timestamp: utils.GetCurTimeStr(), - } - params := make(url.Values) - params.Set("token", api.token) - params.Set("app_key", api.appKey) - params.Set("timestamp", utils.GetCurTimeStr()) - params.Set("v", "1.0") - params.Set("format", "json") - params.Set(paramJson, string(utils.MustMarshal(orderInfo))) - - mapData := utils.URLValues2Map(params) - params.Set(signKey, api.signParams(mapData)) - - response, err := http.PostForm("http://callback.test.jxc4.com/djsw/newOrder", params) - if err != nil { - t.Fatal(err) - } - bodyData, _ := ioutil.ReadAll(response.Body) - sugarLogger.Debug(string(bodyData)) -} - -/* -DELETE t1 -FROM jdorder t1 -WHERE t1.jdorderid = 815438712001141; -*/ -func TestCallbackMsgPlayback(t *testing.T) { - baseURL := "http://callback.test.jxc4.com:8080/" - playbackData := [][]string{ - []string{ - "timestamp=2018-06-28+16%3A33%3A06&sign=B9FF8D5428F1DD1031DEF84AD08AB546&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222018-06-28+16%3A33%3A03%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", - baseURL + "djsw/newOrder", - }, - []string{ - "timestamp=2018-06-28+16%3A40%3A19&sign=10C8ACAC71D954C0607046AC669079ED&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%222%22%2C%22timestamp%22%3A%222018-06-28+16%3A40%3A19%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", - baseURL + "djsw/pickFinishOrder", - }, - []string{ - "timestamp=2018-06-28%2B16%253A40%253A19&sign=E270E90A7F1712331AD210CCB477ED32&v=1.0&jd_param_json=%257B%2522createPin%2522%253A%2522JD_33d45ba55afeb1%2522%252C%2522deliveryCarrierName%2522%253A%2522%25E8%25BE%25BE%25E8%25BE%25BE%25E4%25B8%2593%25E9%2580%2581%2522%252C%2522deliveryCarrierNo%2522%253A%25229966%2522%252C%2522deliveryStatus%2522%253A%252210%2522%252C%2522deliveryStatusTime%2522%253A%25222018-06-28%2B16%253A40%253A19%2522%252C%2522inputTime%2522%253A%25222018-06-28%2B16%253A40%253A19%2522%252C%2522orderId%2522%253A%2522815438712001141%2522%257D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", - baseURL + "djsw/pushDeliveryStatus", - }, - []string{ - "sign=5d506d2ed7d0f353bd578df64a47c1a2b596278a×tamp=1530176122&delivery_id=423701&status=0&appkey=3c0a05d464c247c19d7ec13accc78605&order_id=815438712001141&mt_peisong_id=1530176122092538", - baseURL + "mtps/status", - }, - []string{ - "sign=037e8ef50ce575c3fcc00b9507a46432c0a64768×tamp=1530176299&delivery_id=423701&status=20&appkey=3c0a05d464c247c19d7ec13accc78605&courier_phone=13281800720&courier_name=%E6%9D%8E%E5%B7%9D&order_id=815438712001141&mt_peisong_id=1530176122092538", - baseURL + "mtps/status", - }, - []string{ - "timestamp=2018-06-28+16%3A58%3A20&sign=1DD702433D915DE19F4AC3DD39287E04&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%2233040%22%2C%22timestamp%22%3A%222018-06-28+16%3A58%3A20%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", - baseURL + "djsw/deliveryOrder", - }, - []string{ - "sign=73aae156870e530541d3da1c372411e9bc589470×tamp=1530176533&delivery_id=423701&status=30&appkey=3c0a05d464c247c19d7ec13accc78605&courier_phone=13281800720&courier_name=%E6%9D%8E%E5%B7%9D&order_id=815438712001141&mt_peisong_id=1530176122092538", - baseURL + "mtps/status", - }, - []string{ - "sign=ffe6c9ac09d21505106631bb92fb983599dde69d×tamp=1530177544&delivery_id=423701&status=50&appkey=3c0a05d464c247c19d7ec13accc78605&courier_phone=13281800720&courier_name=%E6%9D%8E%E5%B7%9D&order_id=815438712001141&mt_peisong_id=1530176122092538", - baseURL + "mtps/status", - }, - []string{ - "timestamp=2018-06-28+17%3A19%3A25&sign=06D8763C5B569485FD250F5C283E8B76&v=1.0&jd_param_json=%7B%22billId%22%3A%22815438712001141%22%2C%22statusId%22%3A%2233060%22%2C%22timestamp%22%3A%222018-06-28+17%3A19%3A04%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json", - baseURL + "djsw/finishOrder", - }, - } - for _, v := range playbackData { - _, err := utils.SendFakeRequest(http.MethodPost, v[1], v[0], "") - if err != nil { - t.Fatal(err) - } - } -} func TestOrderAcceptOperate(t *testing.T) { err := api.OrderAcceptOperate("813344594000041", true, "") if err != nil { From bd0285aaf30bb3d0e27fe3607a0649b1c3ff7254 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 7 Dec 2019 23:52:35 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BC=98=E5=8C=96jdapi.CallbackMsg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platformapi/jdapi/callback.go | 28 +++++++++++++++++++--------- platformapi/jdapi/callback_test.go | 30 ++++++++++++++++++++++++++---- platformapi/jdapi/jdapi.go | 4 ++++ 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/platformapi/jdapi/callback.go b/platformapi/jdapi/callback.go index e2cf34e1..eecc46e5 100644 --- a/platformapi/jdapi/callback.go +++ b/platformapi/jdapi/callback.go @@ -112,7 +112,7 @@ type CallbackResponse struct { } type CallbackMsg struct { - MsgURL string `json:"-"` + MsgURL string `json:"msgURL"` AppKey string `json:"app_key"` Token string `json:"token"` @@ -122,11 +122,11 @@ type CallbackMsg struct { V string `json:"v"` JdParamJSON string `json:"jd_param_json"` - Param interface{} `json:"param"` + Param interface{} `json:"-"` // 这里json必须是-,否则会导致json encode时死递归 } type CallbackOrderMsg struct { - MsgURL string `json:"msgURL"` + *CallbackMsg BillID string `json:"billId"` OutBillID string `json:"outBillId"` StatusID string `json:"statusId"` @@ -135,6 +135,7 @@ type CallbackOrderMsg struct { } type CallbackDeliveryStatusMsg struct { + *CallbackMsg OrderID string `json:"orderId"` DeliveryStatusTime string `json:"deliveryStatusTime"` DeliveryManNo string `json:"deliveryManNo"` @@ -151,6 +152,7 @@ type CallbackDeliveryStatusMsg struct { } type CallbackStoreStockMsg struct { + *CallbackMsg StationNo string `json:"stationNo"` SkuID int64 `json:"skuId"` Have bool `json:"have"` @@ -247,7 +249,9 @@ func (a *API) getCommonOrderCallbackMsg(values url.Values, msg interface{}) (cal func (a *API) GetOrderCallbackMsg(values url.Values, msgURL string) (msg *CallbackOrderMsg, callbackResponse *CallbackResponse) { if callbackResponse = a.getCommonOrderCallbackMsg(values, &msg); callbackResponse == nil { - msg.MsgURL = msgURL + msg.CallbackMsg = &CallbackMsg{ + MsgURL: msgURL, + } } return msg, callbackResponse } @@ -302,17 +306,23 @@ func GetCallbackMsg2(request *http.Request) (callbackMsg *CallbackMsg, mapData m callbackMsg.MsgURL = msgURL if msgURL == CallbackMsgDeliveryCarrierModify { var deliveryMsg *CallbackDeliveryStatusMsg - err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &deliveryMsg) - callbackMsg.Param = deliveryMsg + if err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &deliveryMsg); err == nil { + callbackMsg.Param = deliveryMsg + deliveryMsg.CallbackMsg = callbackMsg + } } else if msgURL == CallbackMsgStockIsHave { var mapData map[string]interface{} if err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &mapData); err == nil { - callbackMsg.Param = map2StockCallbackMsg(mapData) + stockMsg := map2StockCallbackMsg(mapData) + callbackMsg.Param = stockMsg + stockMsg.CallbackMsg = callbackMsg } } else { var orderMsg *CallbackOrderMsg - err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &orderMsg) - callbackMsg.Param = orderMsg + if err = utils.UnmarshalUseNumber([]byte(callbackMsg.JdParamJSON), &orderMsg); err == nil { + callbackMsg.Param = orderMsg + orderMsg.CallbackMsg = callbackMsg + } } } if err != nil { diff --git a/platformapi/jdapi/callback_test.go b/platformapi/jdapi/callback_test.go index 4ba252f4..b79832c4 100644 --- a/platformapi/jdapi/callback_test.go +++ b/platformapi/jdapi/callback_test.go @@ -13,10 +13,11 @@ import ( func TestGetCallbackMsg(t *testing.T) { for _, strPair := range [][]string{ []string{ - CallbackMsgOrderAccounting, + "newOrder", ` - timestamp=2019-12-03+06%3A28%3A40&sign=84AF173723A89E95AD7D0CFECA293683&v=1.0&jd_param_json=%7B%22billId%22%3A%22929053552000142%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222019-12-03+06%3A28%3A37%22%7D&token=77e703b7-7997-441b-a12a-2e522efb117a&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json - `, + timestamp=2019-12-07+06%3A27%3A42&sign=565F552F7BD692664A24C0F869A2FEC5&v=1.0&jd_param_json=%7B%22billId%22%3A%221100001049331247%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222019-12-07+06%3A27%3A38%22%7D&token=77e703b7-7997-441b-a12a-2e522efb117a&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json + + `, }, []string{ CallbackMsgPushDeliveryStatus, @@ -32,10 +33,11 @@ func TestGetCallbackMsg(t *testing.T) { }, } { callbackStr := strings.TrimSpace(strPair[1]) - callbackMsg, mapData, resp := GetCallbackMsg2(utils.BuildRequest(http.MethodPost, strPair[0], callbackStr, "")) + callbackMsg, mapData, resp := GetCallbackMsg2(utils.BuildRequest(http.MethodPost, "/djsw/"+strPair[0], callbackStr, "")) if resp != nil { t.Fatal(resp) } + sugarLogger.Debug(callbackMsg.MsgURL) resp = api.CheckCallbackValidation2(mapData, callbackMsg.Sign) if resp != nil { t.Fatal(resp) @@ -44,6 +46,26 @@ func TestGetCallbackMsg(t *testing.T) { } } +func TestGetOrderCallbackMsg(t *testing.T) { + callbackStr := strings.TrimSpace( + ` + timestamp=2019-12-03+06%3A28%3A40&sign=84AF173723A89E95AD7D0CFECA293683&v=1.0&jd_param_json=%7B%22billId%22%3A%22929053552000142%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222019-12-03+06%3A28%3A37%22%7D&token=77e703b7-7997-441b-a12a-2e522efb117a&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json + + `) + values, token, msgURL, resp := GetCallbackMsg(utils.BuildRequest(http.MethodPost, "/djsw/"+CallbackMsgOrderAccounting, callbackStr, ""), false) + if resp != nil { + t.Fatal(resp) + } + sugarLogger.Debug(token) + sugarLogger.Debug(msgURL) + orderMsg, resp := api.GetOrderCallbackMsg(values, msgURL) + if resp != nil { + t.Fatal(resp) + } + sugarLogger.Debug(utils.Format4Output(orderMsg, false)) + sugarLogger.Debug(orderMsg.MsgURL) +} + func TestSimulateSendNewOrderMsg(t *testing.T) { orderInfo := &CallbackOrderMsg{ BillID: "813344594000041", diff --git a/platformapi/jdapi/jdapi.go b/platformapi/jdapi/jdapi.go index 58ba54c2..4db8077a 100644 --- a/platformapi/jdapi/jdapi.go +++ b/platformapi/jdapi/jdapi.go @@ -153,6 +153,10 @@ func (a *API) GetToken() (token string) { return a.token } +func (a *API) GetAppKey() (appKey string) { + return a.appKey +} + func (a *API) AccessAPI2(apiStr string, jdParams map[string]interface{}, traceInfo string) (retVal map[string]interface{}, err error) { params := make(map[string]interface{}) params["v"] = "1.0" From 55f8bc41f9e0110d35c1902b546ed2d8770f0d0f Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 8 Dec 2019 18:36:10 +0800 Subject: [PATCH 4/4] fk --- platformapi/jdapi/callback.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/platformapi/jdapi/callback.go b/platformapi/jdapi/callback.go index eecc46e5..6949c498 100644 --- a/platformapi/jdapi/callback.go +++ b/platformapi/jdapi/callback.go @@ -257,7 +257,11 @@ func (a *API) GetOrderCallbackMsg(values url.Values, msgURL string) (msg *Callba } func (a *API) GetOrderDeliveryCallbackMsg(values url.Values, msgURL string) (msg *CallbackDeliveryStatusMsg, callbackResponse *CallbackResponse) { - callbackResponse = a.getCommonOrderCallbackMsg(values, &msg) + if callbackResponse = a.getCommonOrderCallbackMsg(values, &msg); callbackResponse == nil { + msg.CallbackMsg = &CallbackMsg{ + MsgURL: msgURL, + } + } return msg, callbackResponse } @@ -266,6 +270,9 @@ func (a *API) GetStoreStockCallbackMsg(values url.Values, msgURL string) (msg *C callbackResponse = a.getCommonOrderCallbackMsg(values, &tmpMsg) if callbackResponse == nil { msg = map2StockCallbackMsg(tmpMsg) + msg.CallbackMsg = &CallbackMsg{ + MsgURL: msgURL, + } } return msg, callbackResponse }