Files
baseapi/platformapi/dadaapi/callback.go
2018-06-22 22:26:12 +08:00

82 lines
2.1 KiB
Go

package dadaapi
import (
"crypto/md5"
"fmt"
"sort"
"strings"
"github.com/fatih/structs"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/utils"
)
const (
ResponseHttpCodeSuccess = 200
ResponseHttpCodeGeneralErr = 555
)
type CallbackMsg 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 CallbackResponse struct {
Code int
Dummy string `json:"dummy"`
}
var (
SuccessResponse = &CallbackResponse{Code: ResponseHttpCodeSuccess}
FailedResponse = &CallbackResponse{Code: ResponseHttpCodeGeneralErr}
)
func (a *API) signCallbackParams(mapData map[string]interface{}) string {
values := make([]string, 0)
for _, k := range []string{"client_id", "order_id", "update_time"} {
values = append(values, fmt.Sprint(mapData[k]))
}
sort.Strings(values)
finalStr := strings.Join(values, "")
// baseapi.SugarLogger.Debugf("sign str:%v", finalStr)
return fmt.Sprintf("%x", md5.Sum([]byte(finalStr)))
}
func (a *API) unmarshalData(data []byte, msg interface{}) (callbackResponse *CallbackResponse) {
err := utils.UnmarshalUseNumber(data, msg)
if err != nil {
return FailedResponse
}
return nil
}
func (a *API) CheckCallbackValidation(mapData map[string]interface{}) (callbackResponse *CallbackResponse) {
sign := a.signCallbackParams(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 (a *API) GetOrderCallbackMsg(data []byte) (msg *CallbackMsg, callbackResponse *CallbackResponse) {
msg = new(CallbackMsg)
if callbackResponse = a.unmarshalData(data, msg); callbackResponse != nil {
return nil, FailedResponse
}
mapData := structs.Map(msg)
callbackResponse = a.CheckCallbackValidation(mapData)
return msg, callbackResponse
}