package jdapi import ( "fmt" "net/http" "net/url" "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/platform/common" "git.rosy.net.cn/baseapi/utils" ) type JDCallbackResponse struct { Code string `json:"code"` Msg string `json:"msg"` Data string `json:"data"` } type JDOrderMsg struct { Id int `json:"-"` // 用于传递Jdorder的主键值,减少一次读库操作 BillId string `json:"billId"` StatusId string `json:"statusId"` Timestamp string `json:"timestamp"` Remark string `json:"remark"` } type JDDeliveryStatusMsg struct { OrderId string DeliveryStatusTime string DeliveryManNo string DeliveryManName string DeliveryManPhone string DeliveryCarrierNo string DeliveryCarrierName string DeliveryStatus int Remark string FailType string CreatePin string OpTime int64 InputTime string } var ( SuccessResponse = &JDCallbackResponse{Code: "0", Msg: "success", Data: ""} ) func (j *JDAPI) unmarshalData(strData string, msg interface{}) (callbackResponse *JDCallbackResponse) { err := utils.UnmarshalUseNumber([]byte(strData), msg) if err != nil { return &JDCallbackResponse{ Code: JDerrorCodeAbnormalParam, Msg: fmt.Sprintf(common.CBErrMsgUnmarshal, strData, err), Data: strData, } } return nil } func (j *JDAPI) CheckCallbackValidation(request *http.Request) (callbackResponse *JDCallbackResponse) { mapData := make(map[string]string) mapData["token"] = request.FormValue("token") mapData["app_key"] = request.FormValue("app_key") mapData["timestamp"] = request.FormValue("timestamp") mapData["format"] = request.FormValue("format") mapData["app_secret"] = j.appSecret mapData["v"] = request.FormValue("v") mapData[JD_PARAM_JSON] = request.FormValue(JD_PARAM_JSON) sign := j.signParams(mapData) if sign != request.FormValue(signKey) { baseapi.SugarLogger.Infof("Signature is not ok, mine:%v, get:%v", sign, request.FormValue(signKey)) return &JDCallbackResponse{ Code: JDerrorCodeInvalidSign, Msg: "signature is invalid", Data: string(utils.MustMarshal(mapData)), } } return nil } func (j *JDAPI) getCommonOrderCallbackMsg(request *http.Request, msg interface{}, needDecode bool) (callbackResponse *JDCallbackResponse) { if callbackResponse = j.CheckCallbackValidation(request); callbackResponse != nil { return callbackResponse } jdParamJSON := request.FormValue(JD_PARAM_JSON) if needDecode { if jdParamJSON2, err := url.QueryUnescape(jdParamJSON); err == nil { jdParamJSON = jdParamJSON2 } else { return &JDCallbackResponse{ Code: JDerrorCodeAbnormalParam, Msg: fmt.Sprintf(common.CBErrMsgUnescape, jdParamJSON, err), Data: jdParamJSON, } } } if callbackResponse = j.unmarshalData(jdParamJSON, msg); callbackResponse != nil { return callbackResponse } return nil } func (j *JDAPI) GetOrderCallbackMsg(request *http.Request) (msg *JDOrderMsg, callbackResponse *JDCallbackResponse) { msg = new(JDOrderMsg) callbackResponse = j.getCommonOrderCallbackMsg(request, msg, false) return msg, callbackResponse } func (j *JDAPI) GetOrderApplyCancelCallbackMsg(request *http.Request) (msg *JDOrderMsg, callbackResponse *JDCallbackResponse) { msg = new(JDOrderMsg) callbackResponse = j.getCommonOrderCallbackMsg(request, msg, true) return msg, callbackResponse } func (j *JDAPI) GetOrderDeliveryCallbackMsg(request *http.Request) (msg *JDDeliveryStatusMsg, callbackResponse *JDCallbackResponse) { msg = new(JDDeliveryStatusMsg) callbackResponse = j.getCommonOrderCallbackMsg(request, msg, true) return msg, callbackResponse }