diff --git a/platformapi/elmapi/callback.go b/platformapi/elmapi/callback.go index 34e55aa4..a5dfedd5 100644 --- a/platformapi/elmapi/callback.go +++ b/platformapi/elmapi/callback.go @@ -38,7 +38,7 @@ var ( SuccessResponse = &CallbackResponse{"ok"} ) -func (e *API) unmarshalData(data []byte, msg interface{}) (callbackResponse *CallbackResponse) { +func (a *API) unmarshalData(data []byte, msg interface{}) (callbackResponse *CallbackResponse) { err := utils.UnmarshalUseNumber(data, msg) if err != nil { return &CallbackResponse{ @@ -48,8 +48,8 @@ func (e *API) unmarshalData(data []byte, msg interface{}) (callbackResponse *Cal return nil } -func (e *API) CheckCallbackValidation(mapData map[string]interface{}) (callbackResponse *CallbackResponse) { - sign := e.signParamsMap(mapData, "") +func (a *API) CheckCallbackValidation(mapData map[string]interface{}) (callbackResponse *CallbackResponse) { + sign := a.signParamsMap(mapData, "") if remoteSign, _ := mapData[signKey].(string); sign != remoteSign { baseapi.SugarLogger.Infof("Signature is not ok, mine:%v, get:%v", sign, remoteSign) return &CallbackResponse{Message: platformapi.ErrStrCallbackSignatureIsWrong} @@ -57,13 +57,13 @@ func (e *API) CheckCallbackValidation(mapData map[string]interface{}) (callbackR return nil } -func (e *API) GetCallbackMsg(data []byte) (msg *CallbackMsg, callbackResponse *CallbackResponse) { +func (a *API) GetCallbackMsg(data []byte) (msg *CallbackMsg, callbackResponse *CallbackResponse) { msg = new(CallbackMsg) - if callbackResponse = e.unmarshalData(data, msg); callbackResponse != nil { + if callbackResponse = a.unmarshalData(data, msg); callbackResponse != nil { return nil, callbackResponse } mapData := structs.Map(msg) - callbackResponse = e.CheckCallbackValidation(mapData) + callbackResponse = a.CheckCallbackValidation(mapData) return msg, callbackResponse } diff --git a/platformapi/jdapi/callback.go b/platformapi/jdapi/callback.go index 6e70125b..80990c02 100644 --- a/platformapi/jdapi/callback.go +++ b/platformapi/jdapi/callback.go @@ -32,7 +32,7 @@ type CallbackDeliveryStatusMsg struct { DeliveryManPhone string `json:"deliveryManPhone"` DeliveryCarrierNo string `json:"deliveryCarrierNo"` DeliveryCarrierName string `json:"deliveryCarrierName"` - DeliveryStatus int `json:"deliveryStatus"` + DeliveryStatus string `json:"deliveryStatus"` Remark string `json:"remark"` FailType string `json:"failType"` CreatePin string `json:"createPin"` @@ -41,7 +41,8 @@ type CallbackDeliveryStatusMsg struct { } var ( - SuccessResponse = &CallbackResponse{Code: "0", Msg: "success", Data: ""} + SuccessResponse = &CallbackResponse{Code: "0", Msg: "success", Data: ""} + FormatErrorResponse = &CallbackResponse{Code: "-1", Msg: "failed", Data: ""} ) func (a *API) unmarshalData(strData string, msg interface{}) (callbackResponse *CallbackResponse) { @@ -56,19 +57,18 @@ func (a *API) unmarshalData(strData string, msg interface{}) (callbackResponse * return nil } -func (a *API) CheckCallbackValidation(request *http.Request) (callbackResponse *CallbackResponse) { +func (a *API) CheckCallbackValidation(values url.Values) (callbackResponse *CallbackResponse) { mapData := make(map[string]interface{}) - mapData["token"] = request.FormValue("token") - mapData["app_key"] = request.FormValue("app_key") - mapData["timestamp"] = request.FormValue("timestamp") - mapData["format"] = request.FormValue("format") + mapData["token"] = values.Get("token") + mapData["app_key"] = values.Get("app_key") + mapData["timestamp"] = values.Get("timestamp") + mapData["format"] = values.Get("format") mapData["app_secret"] = a.appSecret - mapData["v"] = request.FormValue("v") - mapData[paramJson] = request.FormValue(paramJson) - + mapData["v"] = values.Get("v") + mapData[paramJson] = values.Get(paramJson) sign := a.signParams(mapData) - if sign != request.FormValue(signKey) { - baseapi.SugarLogger.Infof("Signature is not ok, mine:%v, get:%v", sign, request.FormValue(signKey)) + if sign != values.Get(signKey) { + baseapi.SugarLogger.Infof("Signature is not ok, mine:%v, get:%v", sign, values.Get(signKey)) return &CallbackResponse{ Code: ResponseCodeInvalidSign, Msg: platformapi.ErrStrCallbackSignatureIsWrong, @@ -79,23 +79,16 @@ func (a *API) CheckCallbackValidation(request *http.Request) (callbackResponse * } func (a *API) getCommonOrderCallbackMsg(request *http.Request, msg interface{}, needDecode bool) (callbackResponse *CallbackResponse) { - if callbackResponse = a.CheckCallbackValidation(request); callbackResponse != nil { + result, err := utils.HTTPRequest2Values(request, needDecode) + if err != nil { + return FormatErrorResponse + } + if callbackResponse = a.CheckCallbackValidation(result); callbackResponse != nil { return callbackResponse } - jdParamJSON := request.FormValue(paramJson) - if needDecode { - if jdParamJSON2, err := url.QueryUnescape(jdParamJSON); err == nil { - jdParamJSON = jdParamJSON2 - } else { - return &CallbackResponse{ - Code: ResponseCodeAbnormalParam, - Msg: fmt.Sprintf(platformapi.ErrStrUnescapeError, jdParamJSON, err), - Data: jdParamJSON, - } - } - } - + jdParamJSON := result.Get(paramJson) + baseapi.SugarLogger.Debug(jdParamJSON) if callbackResponse = a.unmarshalData(jdParamJSON, msg); callbackResponse != nil { return callbackResponse } diff --git a/platformapi/jdapi/jdapi_test.go b/platformapi/jdapi/jdapi_test.go index 5ac07180..b6f6f02e 100644 --- a/platformapi/jdapi/jdapi_test.go +++ b/platformapi/jdapi/jdapi_test.go @@ -2,6 +2,8 @@ package jdapi import ( "net/http" + "net/http/httptest" + "strings" "testing" "git.rosy.net.cn/baseapi" @@ -19,8 +21,8 @@ func init() { logger, _ := zap.NewDevelopment() sugarLogger = logger.Sugar() baseapi.Init(sugarLogger) - jdapi = New("91633f2a-c5f5-4982-a925-a220d19095c3", "1dba76d40cac446ca500c0391a0b6c9d", "a88d031a1e7b462cb1579f12e97fe7f4") - // jdapi = New("c8854ef2-f80a-45ee-aceb-dc8014d646f8", "06692746f7224695ad4788ce340bc854", "d6b42a35a7414a5490d811654d745c84") + // jdapi = New("91633f2a-c5f5-4982-a925-a220d19095c3", "1dba76d40cac446ca500c0391a0b6c9d", "a88d031a1e7b462cb1579f12e97fe7f4") // prod + jdapi = New("c8854ef2-f80a-45ee-aceb-dc8014d646f8", "06692746f7224695ad4788ce340bc854", "d6b42a35a7414a5490d811654d745c84") //test } func TestTest(t *testing.T) { @@ -117,3 +119,39 @@ func TestOrderQuery(t *testing.T) { t.Fatal("OrderQuery get data wrong") } } + +func TestGetOrderCallbackMsg(t *testing.T) { + callbackStr := "timestamp=2018-06-27+12%3A43%3A51&sign=84096ADFAB81E224D6231269AD1F6AAB&v=1.0&jd_param_json=%7B%22billId%22%3A%22815338526000221%22%2C%22statusId%22%3A%2232000%22%2C%22timestamp%22%3A%222018-06-27+12%3A42%3A34%22%7D&token=91633f2a-c5f5-4982-a925-a220d19095c3&app_key=1dba76d40cac446ca500c0391a0b6c9d&format=json" + request := httptest.NewRequest("POST", "http://test.jxc4.com", strings.NewReader(callbackStr)) + request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + result, resp := jdapi.GetOrderCallbackMsg(request) + + if resp != nil { + t.Fatal(resp) + } + sugarLogger.Debug(result) +} + +func TestGetOrderDeliveryCallbackMsg(t *testing.T) { + callbackStr := "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" + request := httptest.NewRequest("POST", "http://test.jxc4.com", strings.NewReader(callbackStr)) + request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + result, resp := jdapi.GetOrderDeliveryCallbackMsg(request) + + if resp != nil { + t.Fatal(resp) + } + sugarLogger.Debug(result) +} + +func TestGetOrderApplyCancelCallbackMsg(t *testing.T) { + callbackStr := "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" + request := httptest.NewRequest("POST", "http://test.jxc4.com", strings.NewReader(callbackStr)) + request.Header.Set("Content-Type", "application/x-www-form-urlencoded") + result, resp := jdapi.GetOrderApplyCancelCallbackMsg(request) + + if resp != nil { + t.Fatal(resp) + } + sugarLogger.Debug(result) +} diff --git a/utils/utils.go b/utils/utils.go index dfafcdaa..65edb9dc 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -181,6 +181,29 @@ func HTTPResponse2Json(response *http.Response) (map[string]interface{}, error) return jsonResult, nil } +func HTTPRequest2Values(request *http.Request, needDecode bool) (url.Values, error) { + bodyData, err := ioutil.ReadAll(request.Body) + if err != nil { + baseapi.SugarLogger.Errorf("ioutil.ReadAll error:%v", err) + return nil, err + } + bodyStr := string(bodyData) + if needDecode { + bodyStr1, err := url.QueryUnescape(bodyStr) + if err != nil { + baseapi.SugarLogger.Errorf("QueryUnescape error:%v", err) + return nil, err + } + bodyStr = bodyStr1 + } + result, err := url.ParseQuery(bodyStr) + if err != nil { + baseapi.SugarLogger.Errorf("ParseQuery error:%v", err) + return nil, err + } + return result, nil +} + func MustInterface2Int64(data interface{}) int64 { dataNumber, ok := data.(json.Number) if !ok {