customer info
This commit is contained in:
parent
940a627ade
commit
e04e84cb8a
|
@ -2,10 +2,13 @@ package qyweixin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"crypto/sha1"
|
||||||
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/smbrave/goutil"
|
||||||
"github.com/spf13/cast"
|
"github.com/spf13/cast"
|
||||||
"gitlab.batiao8.com/open/gosdk/util"
|
"gitlab.batiao8.com/open/gosdk/util"
|
||||||
"gitlab.batiao8.com/open/gosdk/wechat"
|
"gitlab.batiao8.com/open/gosdk/wechat"
|
||||||
|
@ -51,6 +54,14 @@ type MessageRequest struct {
|
||||||
} `json:"video"`
|
} `json:"video"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type JsapiConfig struct {
|
||||||
|
Corpid string `json:"corpid"`
|
||||||
|
Agent string `json:"agent"`
|
||||||
|
Signature string `json:"signature"`
|
||||||
|
Noncestr string `json:"noncestr"`
|
||||||
|
Timestamp string `json:"timestamp"`
|
||||||
|
}
|
||||||
|
|
||||||
type BaseResponse struct {
|
type BaseResponse struct {
|
||||||
ErrCode int `json:"errcode"`
|
ErrCode int `json:"errcode"`
|
||||||
ErrMsg string `json:"errmsg"`
|
ErrMsg string `json:"errmsg"`
|
||||||
|
@ -301,6 +312,26 @@ func (a *App) Upload(path, kind string) (string, error) {
|
||||||
return cast.ToString(result["media_id"]), nil
|
return cast.ToString(result["media_id"]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q *App) GetJsapiConfig(url string) (*JsapiConfig, error) {
|
||||||
|
ticket, err := q.getJsapiTicket()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
cfg := new(JsapiConfig)
|
||||||
|
noncestr := goutil.RandomStr(32)
|
||||||
|
timstamp := cast.ToString(time.Now().Unix())
|
||||||
|
str := "jsapi_ticket=" + cast.ToString(ticket) + "&noncestr=" + noncestr + "×tamp=" + timstamp + "&url=" + url
|
||||||
|
h := sha1.New()
|
||||||
|
h.Write([]byte(str))
|
||||||
|
signature := hex.EncodeToString(h.Sum(nil))
|
||||||
|
cfg.Signature = signature
|
||||||
|
cfg.Timestamp = timstamp
|
||||||
|
cfg.Noncestr = noncestr
|
||||||
|
cfg.Agent = q.config.Agent
|
||||||
|
cfg.Corpid = q.config.Corpid
|
||||||
|
return cfg, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (q *App) Callback(ctx *gin.Context) {
|
func (q *App) Callback(ctx *gin.Context) {
|
||||||
|
|
||||||
//配置微信参数
|
//配置微信参数
|
||||||
|
@ -350,6 +381,22 @@ func (q *App) Callback(ctx *gin.Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q *App) getJsapiTicket() (string, error) {
|
||||||
|
|
||||||
|
resp, err := http.Get("https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token=" + q.GetToken() + "&type=agent_config")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
body, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
jsonData := make(map[string]interface{})
|
||||||
|
json.Unmarshal(body, &jsonData)
|
||||||
|
return cast.ToString(jsonData["ticket"]), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (q *App) refreshToken() error {
|
func (q *App) refreshToken() error {
|
||||||
if time.Now().Unix() <= q.tokenExpire-600 {
|
if time.Now().Unix() <= q.tokenExpire-600 {
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -2,6 +2,7 @@ package qyweixin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/spf13/cast"
|
"github.com/spf13/cast"
|
||||||
"gitlab.batiao8.com/open/gosdk/util"
|
"gitlab.batiao8.com/open/gosdk/util"
|
||||||
|
@ -76,6 +77,14 @@ type CustomerEvent struct {
|
||||||
NewServicerUserid string `json:"new_servicer_userid"`
|
NewServicerUserid string `json:"new_servicer_userid"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CustomerInfo struct {
|
||||||
|
Nickname string `json:"nickname"`
|
||||||
|
Avatar string `json:"avatar"`
|
||||||
|
Gender int `json:"gender"`
|
||||||
|
Unionid string `json:"unionid"`
|
||||||
|
Context interface{} `json:"enter_Session_Context"`
|
||||||
|
}
|
||||||
|
|
||||||
type AppCustomer struct {
|
type AppCustomer struct {
|
||||||
App
|
App
|
||||||
}
|
}
|
||||||
|
@ -228,6 +237,64 @@ func (a *AppCustomer) SyncMessage(openKfId, cursor, token string) ([]*CustomerMe
|
||||||
return message, cursor, nil
|
return message, cursor, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (q *AppCustomer) GetServiceLink(openKfId, sence string) (string, error) {
|
||||||
|
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["open_kfid"] = openKfId
|
||||||
|
params["scene"] = sence
|
||||||
|
reqBody, _ := json.Marshal(params)
|
||||||
|
reqUrl := "https://qyapi.weixin.qq.com/cgi-bin/kf/add_contact_way?access_token=" + q.GetToken()
|
||||||
|
rspBody, err := util.HttpPostJson(reqUrl, nil, reqBody)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
result, err := q.GetResult(rspBody)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
customerServcieUrl := cast.ToString(result["url"])
|
||||||
|
if customerServcieUrl == "" {
|
||||||
|
return "", fmt.Errorf("%d:%s", cast.ToInt64(result["errcode"]), cast.ToString(result["errmsg"]))
|
||||||
|
}
|
||||||
|
return customerServcieUrl, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *AppCustomer) GetCustomerInfo(externalUserid string) (*CustomerInfo, error) {
|
||||||
|
|
||||||
|
postdata := map[string]interface{}{
|
||||||
|
"external_userid_list": []string{
|
||||||
|
externalUserid,
|
||||||
|
},
|
||||||
|
"need_enter_session_context": 1,
|
||||||
|
}
|
||||||
|
dataByte, err := json.Marshal(postdata)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
rspBody, err := util.HttpPostJson("https://qyapi.weixin.qq.com/cgi-bin/kf/customer/batchget?access_token="+q.GetToken(), nil, dataByte)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result, err := q.GetResult(rspBody)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
users := cast.ToSlice(result["customer_list"])
|
||||||
|
if len(users) == 0 {
|
||||||
|
return nil, errors.New("no user info")
|
||||||
|
}
|
||||||
|
user := cast.ToStringMap(users[0])
|
||||||
|
u := new(CustomerInfo)
|
||||||
|
u.Nickname = cast.ToString(user["nickname"])
|
||||||
|
u.Avatar = cast.ToString(user["avatar"])
|
||||||
|
u.Unionid = cast.ToString(user["unionid"])
|
||||||
|
u.Gender = cast.ToInt(user["gender"])
|
||||||
|
u.Context = user["enter_session_context"]
|
||||||
|
return u, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *CustomerMessage) From(data map[string]interface{}) {
|
func (m *CustomerMessage) From(data map[string]interface{}) {
|
||||||
m.SyncTime = time.Now().Unix()
|
m.SyncTime = time.Now().Unix()
|
||||||
m.SendTime = cast.ToInt64(data["send_time"])
|
m.SendTime = cast.ToInt64(data["send_time"])
|
||||||
|
|
Loading…
Reference in New Issue