- fix jd callback msg handling, some callback msg should unescqpe firstly.

This commit is contained in:
gazebo
2018-06-27 14:54:36 +08:00
parent b0d9fad396
commit e96e04ae0e
4 changed files with 88 additions and 34 deletions

View File

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

View File

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

View File

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

View File

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