package controller import ( "crypto/sha1" "encoding/hex" "encoding/xml" "fmt" "github.com/codinl/go-logger" "github.com/gin-gonic/gin" "io/ioutil" "mh-server/model" "sort" "strings" ) const ( TOKEN = "QoI6tG856JFGLZaWy2ljffJlkBOYeU" ENCODINGAESKEY = "QoI6tG856JFGLZaWy2ljffJlkBOYeU6GSfGuzpt18Pu" ) //func checkout(response http.ResponseWriter, request *http.Request) { func WxMsg(c *gin.Context) { // 获取参数 signature := c.PostForm("signature") timestamp := c.PostForm("timestamp") nonce := c.PostForm("nonce") echostr := c.PostForm("echostr") //timestamp := request.FormValue("echostr") //nonce := request.FormValue("nonce") //echostr := request.FormValue("echostr") //将token、timestamp、nonce三个参数进行字典序排序 var tempArray = []string{TOKEN, timestamp, nonce} sort.Strings(tempArray) //将三个参数字符串拼接成一个字符串进行sha1加密 var sha1String string = "" for _, v := range tempArray { sha1String += v } h := sha1.New() h.Write([]byte(sha1String)) sha1String = hex.EncodeToString(h.Sum([]byte(""))) //获得加密后的字符串可与signature对比 if sha1String == signature { _, err := c.Writer.Write([]byte(echostr)) if err != nil { fmt.Println("响应失败。。。") } } else { fmt.Println("验证失败") } } var focusPublicContent = `欢迎关注go2game 我们主要提供switch游戏卡带租赁及回收,开通会员后你可享受: “0”元租卡,次数不限 游戏任选,支持邮寄 立即免费租卡带 卡带回收点这里 ` + fmt.Sprintf("回复“领券”获取优惠券兑换码(使用:小程序个人中心→优惠券→兑换优惠券)") var concernedPublicContent = `欢迎关注go2game 我们主要提供switch游戏卡带租赁及回收,开通会员后你可享受: “0”元租卡,次数不限 游戏任选,支持邮寄 立即免费租卡带 卡带回收点这里 ` func AutoReplyFocusMsg(c *gin.Context) { body, err := ioutil.ReadAll(c.Request.Body) if err != nil { logger.Error(err) } //fmt.Println("接收消息:", string(body)) receiveMsg := new(model.WxReplyTextReceiveMsg) err = xml.Unmarshal(body, receiveMsg) if err != nil { logger.Error("receive msg unmarshal err:", err) } receiveMsg.ToUserName = model.WipeStringSpace(receiveMsg.ToUserName) receiveMsg.FromUserName = model.WipeStringSpace(receiveMsg.FromUserName) msg := &model.WxReplyTextMsg{ ToUserName: receiveMsg.FromUserName, FromUserName: receiveMsg.ToUserName, CreateTime: receiveMsg.CreateTime, //MsgType: receiveMsg.MsgType, MsgType: "text", Content: "", } //fmt.Println("receiveMsg.MsgType:", receiveMsg.MsgType) //fmt.Println("receiveMsg.Event:", receiveMsg.Event) //if receiveMsg.MsgType == "event" && receiveMsg.Event == "subscribe" { if receiveMsg.MsgType == "event" && receiveMsg.Event == "subscribe" { exist, err := model.QueryRecordExist(fmt.Sprintf("SELECT * FROM public_record WHERE open_id='%s'", receiveMsg.FromUserName)) if err != nil { logger.Error("exist err:", err) } if exist { //fmt.Println("已领取券") msg.Content = concernedPublicContent } else { msg.Content = focusPublicContent record := &model.PublicRecord{ OpenId: receiveMsg.FromUserName, FocusState: 1, RedeemCodeState: 1, } err := model.DB.Create(record).Error if err != nil { logger.Error("create public record err:", err) } //fmt.Println("关注记录") } //msg.Content = concernedPublicContent } //if receiveMsg.MsgType == "text" && receiveMsg.Content == "关注" { // exist, err := model.QueryRecordExist(fmt.Sprintf("SELECT * FROM public_record WHERE open_id='%s'", receiveMsg.FromUserName)) // if err != nil { // logger.Error("exist err:", err) // } // if exist { // msg.Content = concernedPublicContent // } else { // msg.Content = focusPublicContent // // record := &model.PublicRecord{ // OpenId: receiveMsg.FromUserName, // FocusState: 1, // RedeemCodeState: 1, // } // err := model.DB.Create(record).Error // if err != nil { // logger.Error("create public record err:", err) // } // } //} if receiveMsg.MsgType == "text" && receiveMsg.Content == "领券" { //model.PublicRecord{} var publicRecord model.PublicRecord err = model.NewPublicRecordQuerySet(model.DB).OpenIdEq(receiveMsg.FromUserName).One(&publicRecord) if err != nil && err != model.RecordNotFound { logger.Error("public record err:", err) } if err == model.RecordNotFound { msg.Content = "你还没有关注公众号,兄弟!" } if err == nil { if publicRecord.RedeemCodeState == 1 { //fmt.Println("关注领券") var redeemCode model.RedeemCode err = model.NewRedeemCodeQuerySet(model.DB).StatusEq(model.RedeemCodeStatusStock). CodeTypeEq(model.CodeTypeDeductionCoupon5).OrderAscByID().Limit(1).One(&redeemCode) if err != nil { logger.Error("redeem code err:", err) } msg.Content = redeemCode.SerialCode err = model.NewRedeemCodeQuerySet(model.DB).IDEq(redeemCode.ID).GetUpdater().SetStatus(model.RedeemCodeStatusHold).Update() if err != nil { logger.Error("update redeem code err:", err) } err = model.NewPublicRecordQuerySet(model.DB).IDEq(publicRecord.ID).GetUpdater().SetRedeemCodeId(redeemCode.ID). SetSerialCode(redeemCode.SerialCode).SetRedeemCodeState(2).Update() if err != nil { logger.Error("update public record err:", err) } } if publicRecord.RedeemCodeState == 2 { //fmt.Println("已关注领券") msg.Content = publicRecord.SerialCode } if publicRecord.RedeemCodeState == 3 { msg.Content = "你已领取兑换码,兄嘚!" } } } if msg.Content == "" { fmt.Println("无数据") msg.Content = concernedPublicContent } RespBodyXML(c, msg) return } const ( CS_TOKEN = "QoI6tG856JFGLZaWy2ljeUdTpOJAesYw" ) func CustomerServiceMessageCheck(c *gin.Context) { Signature := c.Query("signature") Timestamp := c.Query("timestamp") Nonce := c.Query("nonce") Echostr := c.Query("echostr") //logger.Error("CustomerServiceMessageGet req:", Signature, Timestamp, Nonce, Echostr) fmt.Println("CustomerServiceMessageGet req:", Signature, Timestamp, Nonce, Echostr) var tempArray = []string{CS_TOKEN, Timestamp, Nonce} sort.Strings(tempArray) var sha1String = "" sha1String = strings.Join(tempArray, "") h := sha1.New() h.Write([]byte(sha1String)) sha1String = hex.EncodeToString(h.Sum([]byte(""))) if sha1String == Signature { _, err := c.Writer.Write([]byte(Echostr)) if err != nil { fmt.Println("响应失败") logger.Error("Signature 响应失败", err) } } else { fmt.Println("验证失败") logger.Error("Signature 验证失败") } }