Golang Go语言中重新造个 go-wechat 轮子

发布于 1周前 作者 vueper 来自 Go语言

目前 wechat Go 相关 SDK 普遍存在以下问题:

1 、缺失单元测试

2 、代码规范(命名等)不够 Go

3 、不够灵活

举个 Github 上 Star 最高的一个库的例子,不能自定义 http.Client 、http.ServeMux

//使用 memcache 保存 access_token ,也可选择 redis 或自定义 cache
wc := wechat.NewWechat()
memory := cache.NewMemory()
cfg := &offConfig.Config{
    AppID:     "xxx",
    AppSecret: "xxx",
    Token:     "xxx",
    //EncodingAESKey: "xxxx",
    Cache: memory,
}
officialAccount := wc.GetOfficialAccount(cfg)

// 传入 request 和 responseWriter server := officialAccount.GetServer(req, rw) //设置接收消息的处理方法 server.SetMessageHandler(func(msg *message.MixMessage) *message.Reply {

//回复消息:演示回复用户发送的消息
text := message.NewText(msg.Content)
return &message.Reply{MsgType: message.MsgTypeText, MsgData: text}

})

//处理消息接收以及回复 err := server.Serve() if err != nil { fmt.Println(err) return } //发送回复的消息 server.Send()

作为一个库,不够灵活,是属于破坏性代码的一类库。

4 、不能自定义 access_token 的管理逻辑

比如公众号,多个项目都要使用 access_token 的情况下如果不能自定义 token 管理逻辑,则 token 会再重新获取后失效之前的。

所以在新项目中需要 wechat sdk 的时候,单元测试、灵活、易于使用成了优先考虑的。

举个例子:

NewClient 时可以传递自己的 http.Client ,自定义超时等逻辑。

type handler struct{}

func (s *handler) HandleTextMessage(message *officialaccount.TextMessage) (officialaccount.ReplyMessage, error) { // 处理业务逻辑 // 响应消息给微信 }

func main() { config := &officialaccount.Config{AppID: “appid”, Secret: “secret”, Token: “token”} client := officialaccount.NewClient(config, nil)

http.Handle("/wx", client.Serve(&handler{}))
http.ListenAndServe(":8080", nil)

}

易于使用

	ctx := context.Background()
	client.User.UpdateRemark(ctx, "openid", "remark")

api & testing


// xx.go

type IPListResponse struct { IPList []*string json:"ip_list" }

// IPList 获取微信服务器 IP 地址 // // 参考文档: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_the_WeChat_server_IP_address.html func (s *BasicService) IPList(ctx context.Context) (*IPListResponse, *Response, error) { req, err := s.client.NewRequest(“GET”, “get_api_domain_ip”, nil) if err != nil { return nil, nil, err } ipResp := new(IPListResponse) resp, err := s.client.Do(ctx, req, ipResp) if err != nil { return nil, resp, err } return ipResp, resp, nil }

// xx_test.go

func TestBasicService_IPList(t *testing.T) {
	client, mux, _, teardown := setup()
	defer teardown()

	mux.HandleFunc("/get_api_domain_ip", func(w http.ResponseWriter, r *http.Request) {
		testMethod(t, r, "GET")

		fmt.Fprint(w, `{"ip_list":["127.0.0.1"]}`)
	})

	ctx := context.Background()
	ipList, _, err := client.Basic.IPList(ctx)
	assert.Nil(t, err)

	want := &IPListResponse{IPList: []*string{String("127.0.0.1")}}
	assert.Equal(t, want, ipList)
}

目前进展:完成了公众号平台接口、单元测试,下一步:小程序


Golang Go语言中重新造个 go-wechat 轮子

更多关于Golang Go语言中重新造个 go-wechat 轮子的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

然后轮子呢?/doge

更多关于Golang Go语言中重新造个 go-wechat 轮子的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


自己写 go 的时候随心所欲为所欲为,直到看别人写的 go 代码。这个语法。

sorry 还没写完,所以还没 github

这个是基于 web 的协议吗 还是移动端的

分享一个 KIVC5B

op 怎么没有下文了,烂尾了?

在Go语言社区中,“重新造轮子”通常指的是重新开发一个已经存在且功能相似的库或工具。对于“go-wechat”这样的项目,如果考虑重新开发,以下是一些建议:

首先,明确重新开发的动机。是现有库存在性能瓶颈、功能缺失,还是API设计不够优雅?明确这些问题可以帮助你更好地定位新项目的目标和方向。

其次,深入研究现有“go-wechat”库的代码和设计。了解其架构、API接口以及可能存在的问题。这不仅有助于避免在新项目中重蹈覆辙,还能为你提供灵感和改进方向。

在开发过程中,注重代码质量和性能优化。Go语言以其高效和简洁著称,因此在新项目中应充分利用这些特性。同时,保持API的简洁和易用性,以便其他开发者能够轻松上手。

此外,考虑与现有生态系统的兼容性。如果可能的话,尽量保持与“go-wechat”相似或兼容的API接口,这将有助于降低迁移成本并吸引更多用户。

最后,不要忽视文档和社区建设。编写清晰的文档和示例代码,可以帮助其他开发者更快地理解和使用你的项目。同时,积极参与开源社区,与其他开发者交流心得和经验,将有助于提高项目的知名度和影响力。

总之,重新开发“go-wechat”是一个具有挑战性的任务,但如果你能够明确目标、深入研究、注重质量和兼容性,并积极参与社区建设,那么你的新项目将有望成为一个更加优秀和受欢迎的替代品。

回到顶部