Files
baseapi/platformapi/wxpay/callback.go
2019-10-29 11:38:03 +08:00

64 lines
1.4 KiB
Go

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
}