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