一、开发者基本配置

1、公众平台官网登录之后,找到“基本配置”菜单栏。 2、填写基本配置。

  • URL:外网服务器地址。
  • Token:自主设置,这个token只用于验证开发者服务器。
  • 消息加密方式:选择明文,为了方便开发。
  • Encoding AESKey:选择消息加密方式为明文后,这里留空。

3、现在选择提交肯定是验证token失败,因为还需要完成计入逻辑的编写。

二、接入逻辑验证

在公众平台开发者文档中,关于URL验证逻辑如下:

开发者提交信息(包括URL、Token)后,微信服务器将发送Http Get请求到填写的URL上,GET请求携带四个参数:signature、timestamp、nonce和echostr。 公众号服务程序应该按如下要求进行接入验证:

  • 将token、timestamp、nonce三个参数进行字典序排序
  • 将三个参数字符串拼接成一个字符串进行sha1加密
  • 将加密后获得的字符串与signature对比,如果一致,说明该请求来源于微信
  • 如果请求来自于微信,则原样返回echostr参数内容

微信服务器发出的验证Request如下:

GET /?signature=c9ca8290c93ab42b540787c38054d464bd64914d&echostr=7606640543862274806&timestamp=1526371062&nonce=3235028343

验证返回如下:

7606640543862274806

以上完成后,接入验证就会生效,开发者配置提交就会成功,实现代码如下:

// Validator url is wechat send
func HandleCheckSignature(c *gin.Context) {
        signature, _ := c.GetQuery("signature")
        timeStamp, _ := c.GetQuery("timestamp")
        nonce, _ := c.GetQuery("nonce")
        echoStr, _ := c.GetQuery("echostr")

        tmpStrings := []string{conf.Conf.App.Token, timeStamp, nonce}
        sort.Strings(tmpStrings)
        tmpStr := tmpStrings[0] + tmpStrings[1] + tmpStrings[2]
        tmp := StrToSha1(tmpStr)
        if tmp == signature {
                c.String(200, echoStr)
        } else {
                c.String(401, "Unauthorized")
        }
}

func StrToSha1(data string) string {
        t := sha1.New()
        io.WriteString(t, data)
        return fmt.Sprintf("%x", t.Sum(nil))
}

这里使用gin框架搭建公众号后台服务。

三、实现“你问我答”和“图尚往来”逻辑

1、“你问我答” 粉丝给公众号一条文本消息,公众号立马回复相同文本消息给粉丝。

  • 接受的文本消息

    <xml>
          <ToUserName><![CDATA[公众号]]></ToUserName>
           <FromUserName><![CDATA[粉丝号]]></FromUserName>
           <CreateTime>1460537339</CreateTime>
           <MsgType><![CDATA[text]]></MsgType>
           <Content><![CDATA[test]]></Content>
           <MsgId>6272960105994287618</MsgId>
    </xml>
    
  • 返回的文本消息

    <xml>
           <ToUserName><![CDATA[粉丝号]]></ToUserName>
           <FromUserName><![CDATA[公众号]]></FromUserName>
           <CreateTime>1460541339</CreateTime>
           <MsgType><![CDATA[text]]></MsgType>
           <Content><![CDATA[test]]></Content>
    </xml>
    

2、“图”尚往来 粉丝给公众号一条图片消息,公众号立马回复相同图片消息给粉丝。

  • 接收的图片信息
    <xml>
          <ToUserName><![CDATA[公众号]]></ToUserName>
           <FromUserName><![CDATA[粉丝号]]></FromUserName>
           <CreateTime>1460536575</CreateTime>
           <MsgType><![CDATA[image]]></MsgType>
           <PicUrl><![CDATA[http://mmbiz.qpic.cn/xxxxxx /0]]></PicUrl>
           <MsgId>6272956824639273066</MsgId>
           <MediaId><![CDATA[gyci5a-xxxxx-OL]]></MediaId>
    </xml>
    
  • 返回的图片信息
    <xml>
           <ToUserName><![CDATA[粉丝号]]></ToUserName>
           <FromUserName><![CDATA[公众号]]></FromUserName>
           <CreateTime>1460536576</CreateTime>
           <MsgType><![CDATA[image]]></MsgType>
           <Image>
                   <MediaId><![CDATA[gyci5oxxxxxxv3cOL]]></MediaId>
           </Image>
    </xml>
    

注意: 假如服务器无法保证在五秒内处理回复,则必须回复“success”或者“”(空串),否则微信后台会发起三次重试。

3、实现效果如下:

完整代码地址:https://github.com/markbest/wechat

results matching ""

    No results matching ""