Files
baseapi/platform/dadaapi/callback.go
gazebo 851b2c1eeb - dadaapi added.
- refactor.
2018-06-21 14:23:01 +08:00

84 lines
2.2 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 (
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
}