package wxpay import ( "encoding/xml" "fmt" "io/ioutil" "net/http" "git.rosy.net.cn/baseapi/utils" ) type CDData string func (c CDData) MarshalXML(e *xml.Encoder, start xml.StartElement) error { return e.EncodeElement(struct { string `xml:",cdata"` }{string(c)}, start) } type CallbackResponse struct { XMLName xml.Name `json:"-" xml:"xml"` ReturnCode string `json:"return_code" xml:"return_code"` ReturnMsg CDData `json:"return_msg" xml:"return_msg"` } var ( SuccessResponse = &CallbackResponse{ ReturnCode: ResponseCodeSuccess, ReturnMsg: "OK", } ) func Err2CallbackResponse(err error, data string) *CallbackResponse { if err == nil { return SuccessResponse } returnMsg := err.Error() if data != "" { returnMsg = fmt.Sprintf("%s,%s", returnMsg, data) } return &CallbackResponse{ ReturnCode: ResponseCodeFail, ReturnMsg: CDData(returnMsg), } } func (a *API) GetCallbackMsg(request *http.Request) (msg map[string]interface{}, callbackResponse *CallbackResponse) { data, err := ioutil.ReadAll(request.Body) if err != nil { return nil, Err2CallbackResponse(err, "") } msg, _, err = a.checkResultAsMap(string(data)) if err != nil { return nil, Err2CallbackResponse(err, "") } sign := utils.Interface2String(msg[sigKey]) desiredSign := a.signParam(msg) if desiredSign != sign { return nil, Err2CallbackResponse(fmt.Errorf("desiredSign:%s <> sign:%s", desiredSign, sign), "") } return msg, nil }