package dadaapi import ( "crypto/md5" "fmt" "sort" "strings" "github.com/fatih/structs" "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" ) const ( DadaResponseHttpCodeSuccess = 200 DadaResponseHttpCodeGeneralErr = 555 ) type DadaCallbackMsg struct { ClientId string `json:"client_id"` OrderId string `json:"order_id"` OrderStatus int `json:"order_status"` CancelReason string `json:"cancel_reason"` CancelFrom int `json:"cancel_from"` UpdateTime int `json:"update_time"` Signature string `json:"signature"` DmId int `json:"dm_id"` DmName string `json:"dm_name"` DmMobile string `json:"dm_mobile"` } type DadaCallbackResponse struct { Code int Dummy string `json:"dummy"` } var ( SuccessResponse = &DadaCallbackResponse{Code: DadaResponseHttpCodeSuccess} FailedResponse = &DadaCallbackResponse{Code: DadaResponseHttpCodeGeneralErr} ) func (d *DadaAPI) signParamsCallback(mapData map[string]interface{}) string { values := make([]string, 0) for k, v := range mapData { if k != signKey { values = append(values, fmt.Sprint(v)) } } sort.Strings(values) finalStr := strings.Join(values, "") // baseapi.SugarLogger.Debugf("sign str:%v", finalStr) return fmt.Sprintf("%x", md5.Sum([]byte(finalStr))) } func (d *DadaAPI) unmarshalData(data []byte, msg interface{}) (callbackResponse *DadaCallbackResponse) { err := utils.UnmarshalUseNumber(data, msg) if err != nil { return FailedResponse } return nil } func (d *DadaAPI) CheckCallbackValidation(mapData map[string]interface{}) (callbackResponse *DadaCallbackResponse) { sign := d.signParamsCallback(mapData) if remoteSign, _ := mapData[signKey].(string); sign != remoteSign { baseapi.SugarLogger.Infof("Signature is not ok, mine:%v, get:%v", sign, remoteSign) return FailedResponse } return nil } func (d *DadaAPI) GetOrderCallbackMsg(data []byte) (orderMsg *DadaCallbackMsg, callbackResponse *DadaCallbackResponse) { orderMsg = new(DadaCallbackMsg) if callbackResponse = d.unmarshalData(data, orderMsg); callbackResponse != nil { return nil, FailedResponse } mapData := structs.Map(orderMsg) callbackResponse = d.CheckCallbackValidation(mapData) return orderMsg, callbackResponse }