forked from x/icebergs
96 lines
3.5 KiB
Go
96 lines
3.5 KiB
Go
package wx
|
|
|
|
import (
|
|
"crypto/sha1"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
ice "github.com/shylinux/icebergs"
|
|
"github.com/shylinux/icebergs/base/mdb"
|
|
"github.com/shylinux/icebergs/base/web"
|
|
kit "github.com/shylinux/toolkits"
|
|
)
|
|
|
|
func _wx_sign(m *ice.Message, nonce, stamp string) string {
|
|
b := sha1.Sum([]byte(strings.Join(kit.Sort([]string{
|
|
fmt.Sprintf("jsapi_ticket=%s", m.Cmdx(ACCESS, TICKET)),
|
|
fmt.Sprintf("url=%s", m.Option(ice.MSG_USERWEB)),
|
|
fmt.Sprintf("timestamp=%s", stamp),
|
|
fmt.Sprintf("noncestr=%s", nonce),
|
|
}), "&")))
|
|
return hex.EncodeToString(b[:])
|
|
}
|
|
func _wx_config(m *ice.Message, nonce string) {
|
|
m.Option(APPID, m.Conf(LOGIN, kit.Keym(APPID)))
|
|
m.Option(SCRIPT, m.Conf(ACCESS, kit.Keym(SCRIPT)))
|
|
m.Option("signature", _wx_sign(m, m.Option("noncestr", nonce), m.Option("timestamp", kit.Format(time.Now().Unix()))))
|
|
}
|
|
|
|
const (
|
|
WEIXIN = "weixin"
|
|
EXPIRE = "expire"
|
|
TICKET = "ticket"
|
|
EXPIRES = "expires"
|
|
SCRIPT = "script"
|
|
CONFIG = "config"
|
|
)
|
|
const (
|
|
ERRCODE = "errcode"
|
|
ERRMSG = "errmsg"
|
|
)
|
|
const ACCESS = "access"
|
|
|
|
func init() {
|
|
Index.Merge(&ice.Context{
|
|
Configs: map[string]*ice.Config{
|
|
ACCESS: {Name: ACCESS, Help: "认证", Value: kit.Data(
|
|
SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js",
|
|
WEIXIN, "https://api.weixin.qq.com",
|
|
)},
|
|
},
|
|
Commands: map[string]*ice.Command{
|
|
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
|
m.Cmd(web.SPIDE, mdb.CREATE, WEIXIN, m.Conf(ACCESS, kit.Keym(WEIXIN)))
|
|
}},
|
|
ACCESS: {Name: "access appid auto ticket token login", Help: "认证", Action: map[string]*ice.Action{
|
|
LOGIN: {Name: "login appid appmm token", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
|
|
m.Conf(LOGIN, kit.Keym(APPID), m.Option(APPID))
|
|
m.Conf(LOGIN, kit.Keym(APPMM), m.Option(APPMM))
|
|
m.Conf(LOGIN, kit.Keym(TOKEN), m.Option(TOKEN))
|
|
}},
|
|
TOKEN: {Name: "token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) {
|
|
if now := time.Now().Unix(); m.Conf(ACCESS, kit.Keym(TOKEN)) == "" || now > kit.Int64(m.Conf(ACCESS, kit.Keym(EXPIRE))) {
|
|
msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/token?grant_type=client_credential",
|
|
APPID, m.Conf(LOGIN, kit.Keym(APPID)), "secret", m.Conf(LOGIN, kit.Keym(APPMM)))
|
|
if m.Warn(msg.Append(ERRCODE) != "", msg.Append(ERRCODE), msg.Append(ERRMSG)) {
|
|
return
|
|
}
|
|
|
|
m.Conf(ACCESS, kit.Keym(EXPIRE), now+kit.Int64(msg.Append("expires_in")))
|
|
m.Conf(ACCESS, kit.Keym(TOKEN), msg.Append("access_token"))
|
|
}
|
|
m.Echo(m.Conf(ACCESS, kit.Keym(TOKEN)))
|
|
}},
|
|
TICKET: {Name: "ticket", Help: "票据", Hand: func(m *ice.Message, arg ...string) {
|
|
if now := time.Now().Unix(); m.Conf(ACCESS, kit.Keym(TICKET)) == "" || now > kit.Int64(m.Conf(ACCESS, kit.Keym(EXPIRES))) {
|
|
msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/ticket/getticket?type=jsapi", "access_token", m.Cmdx(ACCESS, TOKEN))
|
|
if m.Warn(msg.Append(ERRCODE) != "0", msg.Append(ERRCODE), msg.Append(ERRMSG)) {
|
|
return
|
|
}
|
|
|
|
m.Conf(ACCESS, kit.Keym(EXPIRES), now+kit.Int64(msg.Append("expires_in")))
|
|
m.Conf(ACCESS, kit.Keym(TICKET), msg.Append(TICKET))
|
|
}
|
|
m.Echo(m.Conf(ACCESS, kit.Keym(TICKET)))
|
|
}},
|
|
CONFIG: {Name: "config", Help: "配置", Hand: func(m *ice.Message, arg ...string) {
|
|
_wx_config(m, "some")
|
|
}},
|
|
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
|
m.Echo(kit.Formats(m.Confv(ACCESS)))
|
|
}},
|
|
}})
|
|
}
|