微信公众号开发教程详细完整第1篇

| 版权声明:本文为博主原创文章,未经博主允许不得转载。

 

从2014.12月份左右接触微信公众号开发,短短续续也有了一年多在这期间做了不知道多少个公众号,各种奇葩的功能都有涉猎。从一无所知的小白,到对整个微信公众号生态的理解,不知道经历了多少个日日夜夜,鬼知道我经历了什么。此次教程不谈什么微信公众号O2O(基本死光了)也不谈什么分答,大字(基本被微信封的差不多了),这次我们只是对微信公众号的二次开发者们,希望对你们有所帮助,也希望有更多的朋友一起探讨,讨论。

 

下面说一下这个教程的前言:首先此次教程非常详细基本上包含了微信公众号平台大部分的功能。编程语言上面我选择了golang,至于为什么?因为之前基本上用java和python都写过了再写一次感觉烦的要死。正好最近一年大部分时间都在用go语言编程。所以选择了go。针对go我选择了一个开源的框架gin。(https://github.com/gin-gonic/gin) 也许有人看到这就放弃了。但是相信我语言并不是编程最重要的,只要你理解了原理,语言永远只是工具。这个教程很可能初期会很基础,有做过一两次微信公众号开发的同学可以在其后的教程中留下你们希望我来做什么功能,我会尽快更新。下面进入正题。

 

接入微信公众号平台(开发者模式)

如果想接入微信的公众号,首先要成为开发者,具体的流程大家直接百度就可以了。成为开发者后在微信公众号的后台(https://mp.weixin.qq.com)

  开发->基本配置->服务器配置

注意:启用并设置服务器配置后,用户发给公众号的消息以及开发者需要的事件推送,将被微信转发到该URL中

  URL:这个是你服务的访问地址必须是域名一级二级无所谓但是注意端口

  Token:这个是用来验证消息来源是微信的参数 要和你服务中的token一致

  EncodingAESKey: 点击随机生成即可

  消息加解密方式:为了方便我们先选择明文

这是点击提交按钮后,微信服务器将发送GET请求到填写的服务器地址URL上并携带signature、timestamp、nonce、echostr四个参数。这是我们就需要在自己的服务中验证URL的有效性。下面我展示部分DEMO 虽然都是go语言的但是我尽量加上备注。

首先是路由,我才用的是gin当中的分组路由模式:

	//微信服务器连接
	weChatCoreGroupR := e.Group("/weChatCore")
	{
		weChatCoreGroupR.GET("", handler.GetWeChatCore)
		weChatCoreGroupR.POST("", handler.PostWeChatCore)
	}

其中的GetWeChatCore就是接受服务器发送请求的函数。

func GetWeChatCore(c *gin.Context) {
	//接受微信传过来的参数
	signature := c.Query("signature")
	timestamp := c.Query("timestamp")
	nonce := c.Query("nonce")
	echostr := c.Query("echostr")
	//获取所有微信公众号信息
	results, err := store.GetAdapterWechatAccounts(c)
	if err != nil {
		//错误返回
		AbortWithError(c, 400, errors.ErrorCode["NOT_EXIST"],
			errors.ErrorMessage["NOT_EXIST"])
	}
	//验证微信连接
	for _, v := range *results {
		if wechatUtil.SignAccount(v.Token, timestamp, nonce, signature, echostr) {
			c.String(200, echostr)
			break
		}
	}
}

这段代码中的获取所有微信公众号信息下的函数results, err := store.GetAdapterWechatAccounts(c) 其实就是从数据库中查询你的微信公众账号信息。这里我是因为有多个账号信息所以需要没别比对。SignAccount这个函数就是验证的过程:

//验证微信来源
func SignAccount(token, timestamp, nonce, signature, echostr string) bool {
	s := []string{token, timestamp, nonce}
	sort.Sort(sort.StringSlice(s))//将token、timestamp、nonce三个参数进行字典序排序
	s0 := strings.Join(s, "")//将三个参数字符串拼接成一个字符串
	t := sha1.New()//sha1加密
	io.WriteString(t, s0)
	s1 := fmt.Sprintf("%x", t.Sum(nil))
	if signature == s1 {//与signature对比
		return true
	}
	return false
}

这样就大功告成了,但有一点要注意的就是:

  若确认此次GET请求来自微信服务器,请原样返回echostr参数内容

这里说的返回事返回一个string类型的echostr  不是json 注意!

 

恭喜你到这里基本就完成了和微信服务器的对接工作。下面我说一些需要注意的点:

1.当你的服务跑起来了,然后你高高兴兴的跑去微信后台去编辑你的服务器配置,出现各种失败的情况。别着急!

2.检查token是否一样 URL是否正确 token一定要和你本地的token是一样的。

3.多提交几遍,也许就好了。微信公众号的坑多着呢。。。

 

| 下期预告

  微信公众号中消息的处理。

 

posted @ 2017-03-23 12:18  石头城123  阅读(24210)  评论(12编辑  收藏  举报