Skip to content

neatstudio/wechat

 
 

Repository files navigation

微信公众平台 golang SDK

Version: 0.6.9 NOTE: 在 v1.0.0 之前 API 都有可能微调

基本定型了,目前我认为该有的API都有了。因为我的公众号只有基本接口,不好调试,所以请大家发现问题一定要通知我,我好更新;或者等我以后开发过程中发现问题更新。

简介

目前完全实现的功能是被动消息的接收和处理(因为我的公众平台只有这个基本接口,订阅号、没有认证); 其他部分的实现都是参考微信官方的 API 文档,欢迎大家测试和 fork。

代码还在继续添加中,欢迎大家 push issues。 联系方式:chanxuehong@gmail.com

入门

wechat 主要分为 Client 和 Server 两个部分,Client 和 Server 都是并发安全的。

Client 实现的是主动发送请求的功能,比如发送客服消息,群发消息,创建自定义菜单...... Client 是并发安全的,在你的应用中一般只用常驻一个 Client 对象就可以了。

Server 实现的是处理被动接收的消息的功能,微信服务器推送过来的普通消息 和 事件推送消息都是 Server 处理的。 Server 实现了 http.Handler 接口,所以一般的应用就是实例化一个 Server 的实例,然后注册到特定的 pattern 上:

server := wechat.NewServer(setting)
http.Handle("/path", server)

安装

通过执行下列语句就可以完成安装

go get github.com/chanxuehong/wechat

示例

Server示例:被动处理文本消息

package main

import (
	"github.com/chanxuehong/wechat"
	"github.com/chanxuehong/wechat/message"
	"net/http"
)

// 处理用户发送过来的 文本消息
func TextRequestHandler(w http.ResponseWriter, r *http.Request, rqst *message.Request) {
	//TODO: 添加你的代码
}

func main() {
	setting := wechat.ServerSetting{
		Token:              "yourToken",
		TextRequestHandler: TextRequestHandler,
	}

	wechatServer := wechat.NewServer(&setting)
	http.Handle("/path", wechatServer)

	http.ListenAndServe(":80", nil) // 启动接收微信数据服务器
}

自定义处理函数

在 wechat.ServerSetting 里可以设置自定义的处理函数, 如果不设置则默认什么都不操作。

处理函数的定义可以使用下面的形式。

// 非法的请求(包括不是微信服务器发送过来的和签名认证不通过的)处理函数
type InvalidRequestHandlerFunc func(http.ResponseWriter, *http.Request, error)
// 目前 SDK 不能识别的请求处理函数
type UnknownRequestHandlerFunc func(http.ResponseWriter, *http.Request, *message.Request)
// 正常的从微信服务器推送过来的请求处理函数,都可以自定义。SDK提供了下面的自定义点:
type RequestHandlerFunc func(http.ResponseWriter, *http.Request, *message.Request)

Client示例:创建一个临时的二维码

package main

import (
	"fmt"
	"github.com/chanxuehong/wechat"
)

func main() {
	c := wechat.NewClient("appid", "appsecret", nil)

	qrcode, err := c.QRCodeCreate(100, 1000)
	if err != nil {
		fmt.Println(err)
		return
	}

	fmt.Println(qrcode)
}

OAuth2:网页授权获取用户基本信息

// 下面代码没有经过实际验证,只是我根据文档来写的,哈哈。
// 因为我没有接口测试,所以如果有问题一定要告诉我!谢谢!
package main

import (
	"github.com/chanxuehong/wechat"
	"net/http"
)

// 一个应用只用一个全局变量
var oauth2Config = wechat.NewOAuth2Config("appid", "appsecret", "redirectURL", "scope0", "scope1")

// 引导用户到认证页面认证
func landing(w http.ResponseWriter, r *http.Request) {
	var state = "state"
	// TODO: state 做相应处理,好识别下次跳转回来的 state 参数
	http.Redirect(w, r, oauth2Config.AuthCodeURL(state), http.StatusFound)
}

// 跳转后的页面请求处理,授权和不授权都会跳转到这里,只是授权有 code 参数,不授权没有
// redirect_uri/?code=CODE&state=STATE
// redirect_uri?state=STATE
func handler(w http.ResponseWriter, r *http.Request) {
	if err := r.ParseForm(); err != nil {
		// TODO: 处理 error
		return
	}

	state := r.FormValue("state")

	// TODO: 处理这个 state 参数, 判断是否是有效的
	_ = state // 实际开发中不要有这个
	// 假如 state 是有效的

	if code := r.FormValue("code"); code != "" { // 授权

		client := wechat.SNSClient{
			OAuth2Config: oauth2Config,
		}
		token, err := client.Exchange(code)
		if err != nil {
			// ...
			return
		}

		// 这里把 token 根据 token.OpenId 缓存起来,以后可以直接用

		userinfo, err := client.UserInfo(token.OpenId, "zh_CN")
		if err != nil {
			// ...
			return
		}

		// 处理 userinfo
		_ = userinfo

	} else { // 不授权

	}
}

func main() {
	// 为 http 添加路由处理,然后在运行 http service
}

About

wechat(微信 / weixin) sdk for go(golang)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published