需求
公司内部活动报名,需要员工登录 & 发送报名通知
我们将在 fastwego/wxwork 的辅助下快速完成活动报名 App 的开发
技术原理
企业微信提供了 获取 员工信息 接口 和 发送消息 接口
所以,我们只需开发一个服务,员工完成登录后 记录session,报名成功后 发送消息 即可
配置企业微信内部应用
-
设置工作台应用主页
-
可以在企业微信工作台看到入口
-
点击进入主页
-
点击登录 可以获取员工信息
-
点击报名后,可以收到通知
主要代码:
var Corp *corporation.Corporation
var App *corporation.App
func init() {
// 加载配置文件
viper.SetConfigFile(".env")
_ = viper.ReadInConfig()
Corp = corporation.New(corporation.Config{
Corpid: viper.GetString("CorpId"),
})
App = Corp.NewApp(corporation.AppConfig{
AgentId: viper.GetString("AgentId"),
Secret: viper.GetString("Secret"),
})
fmt.Println(Corp, App)
}
func main() {
router := gin.New()
router.Use(gin.Logger(), gin.Recovery())
// Session
store := cookie.NewStore([]byte("secret"))
router.Use(sessions.Sessions("gosession", store))
router.GET("/", Index)
router.GET("/login", Login)
svr := &http.Server{
Addr: viper.GetString("LISTEN"),
Handler: router,
}
go func() {
err := svr.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
log.Fatalln(err)
}
}()
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
timeout := time.Duration(5) * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
if err := svr.Shutdown(ctx); err != nil {
log.Fatalln(err)
}
}
type User struct {
Userid string `json:"userid"`
Name string `json:"name"`
Avatar string `json:"avatar"`
Message string `json:"message"`
}
func Index(c *gin.Context) {
session := sessions.Default(c)
user := session.Get("user")
loginUser, ok := user.(User)
if !ok {
loginUser = User{}
}
join := c.Query("join")
if len(join) > 0 {
// 发送 报名信息
type Textcard struct {
Title string `json:"title"`
Description string `json:"description"`
URL string `json:"url"`
Btntxt string `json:"btntxt"`
}
textCard := struct {
Touser string `json:"touser"`
Msgtype string `json:"msgtype"`
Agentid string `json:"agentid"`
Textcard Textcard `json:"textcard"`
}{
Touser: loginUser.Userid,
Msgtype: "textcard",
Agentid: App.Config.AgentId,
}
textCard.Textcard = Textcard{Title: "报名成功", Description: "请来我办公室 <br> <div class='highlight'>记得带上吃饭的家伙 ~</div>", URL: viper.GetString("ServerUrl"), Btntxt: "好的"}
payload, err := json.Marshal(textCard)
fmt.Println(string(payload), err)
if err != nil {
return
}
resp, err := message.Send(App, payload)
fmt.Println(string(resp), err)
loginUser.Message = "报名成功~"
}
t1, err := template.ParseFiles("index.html")
if err != nil {
fmt.Println(err)
return
}
t1.Execute(c.Writer, loginUser)
}
func Login(c *gin.Context) {
code := c.Query("code")
// 跳转登录
if len(code) == 0 {
var redirectUri = viper.GetString("ServerUrl") + "/login"
link := oauth.GetAuthorizeUrl(viper.GetString("CorpId"), redirectUri, "STATE")
c.Redirect(302, link)
return
}
// 获取用户身份
accessToken, err := App.AccessToken.GetAccessTokenHandler(App)
userInfo, err := oauth.GetUserInfo(accessToken, code)
fmt.Println(userInfo, err)
if err != nil {
return
}
// 获取员工详细信息
params := url.Values{}
params.Add("userid", userInfo.UserID)
resp, err := contact.UserGet(App, params)
fmt.Println(string(resp), err)
if err != nil {
return
}
user := User{}
err = json.Unmarshal(resp, &user)
if err != nil {
fmt.Println(err)
return
}
// 记录 Session
gob.Register(User{})
session := sessions.Default(c)
session.Set("user", user)
fmt.Println(user)
err = session.Save()
if err != nil {
fmt.Println(err)
return
}
// 返回首页
c.Header("Content-Type", "text/html")
_, _ = c.Writer.WriteString(`<html"><head><meta http-equiv="refresh" content="0;URL='/'" /></head><body></body></html>`)
}
结语
恭喜你!在 fastwego/wxwork 的辅助下,5分钟内就完成了一款企业内部 App 开发
完整演示代码:github.com/fastwego/wx…