- big big refactor.
This commit is contained in:
81
platformapi/dadaapi/callback.go
Normal file
81
platformapi/dadaapi/callback.go
Normal file
@@ -0,0 +1,81 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user