- fix jd callback msg handling, some callback msg should unescqpe firstly.
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user