// 回复消息给微信服务器. // 要求 msg 是有效的消息数据结构(经过 encoding/xml marshal 后符合消息的格式); // 如果有必要可以修改 Request 里面的某些值, 比如 TimeStamp. func WriteResponse(w http.ResponseWriter, r *Request, msg interface{}) (err error) { if w == nil { return errors.New("nil http.ResponseWriter") } if r == nil { return errors.New("nil Request") } if msg == nil { return errors.New("nil message") } MsgRawXML, err := xml.Marshal(msg) if err != nil { return } EncryptedMsg := util.AESEncryptMsg(r.Random, MsgRawXML, r.CorpId, r.AESKey) base64EncryptedMsg := base64.StdEncoding.EncodeToString(EncryptedMsg) responseHttpBody := ResponseHttpBody{ EncryptedMsg: base64EncryptedMsg, TimeStamp: r.TimeStamp, Nonce: r.Nonce, } TimestampStr := strconv.FormatInt(responseHttpBody.TimeStamp, 10) responseHttpBody.MsgSignature = util.MsgSign(r.AgentToken, TimestampStr, responseHttpBody.Nonce, responseHttpBody.EncryptedMsg) return xml.NewEncoder(w).Encode(&responseHttpBody) }
func writeAESResponse(w io.Writer, msg interface{}, timestamp int64, nonce string, AESKey [32]byte, random []byte, AppId, Token string) (err error) { rawXMLMsg, err := xml.Marshal(msg) if err != nil { return } EncryptedMsg := util.AESEncryptMsg(random, rawXMLMsg, AppId, AESKey) base64EncryptedMsg := base64.StdEncoding.EncodeToString(EncryptedMsg) var responseHttpBody response.ResponseHttpBody responseHttpBody.EncryptedMsg = base64EncryptedMsg responseHttpBody.TimeStamp = timestamp responseHttpBody.Nonce = nonce timestampStr := strconv.FormatInt(timestamp, 10) responseHttpBody.MsgSignature = util.MsgSignature(Token, timestampStr, nonce, base64EncryptedMsg) return xml.NewEncoder(w).Encode(&responseHttpBody) }