kefu/controller/shout.go

423 lines
11 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controller
import (
"encoding/json"
"fmt"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"github.com/silenceper/wechat/v2/officialaccount/message"
"kefu/common"
"kefu/lib"
"kefu/models"
"kefu/tools"
"kefu/types"
"kefu/ws"
"log"
"regexp"
"strconv"
"strings"
)
func SendServerJiang(title string, content string, domain string) string {
noticeServerJiang, err := strconv.ParseBool(models.FindConfig("NoticeServerJiang"))
serverJiangAPI := models.FindConfig("ServerJiangAPI")
if err != nil || !noticeServerJiang || serverJiangAPI == "" {
log.Println("do not notice serverjiang:", serverJiangAPI, noticeServerJiang)
return ""
}
sendStr := fmt.Sprintf("%s%s", title, content)
desp := title + ":" + content + "[登录](http://" + domain + "/main)"
url := serverJiangAPI + "?text=" + sendStr + "&desp=" + desp
//log.Println(url)
res := tools.Get(url)
return res
}
func SendVisitorLoginNotice(kefuName, visitorName, avator, content, visitorId string) {
if !tools.LimitFreqSingle("sendnotice:"+visitorId, 1, 5) {
log.Println("SendVisitorLoginNotice limit")
return
}
userInfo := make(map[string]string)
userInfo["username"] = visitorName
userInfo["avator"] = avator
userInfo["content"] = content
msg := ws.TypeMessage{
Type: "notice",
Data: userInfo,
}
str, _ := json.Marshal(msg)
ws.OneKefuMessage(kefuName, str)
}
func SendNoticeEmail(username, subject, entId, content string) {
if !tools.LimitFreqSingle("send_notice_email:"+username, 1, 10) {
log.Println("send_notice_email limit")
return
}
configs := models.FindEntConfigByEntid(entId)
smtp := ""
email := ""
password := ""
for _, config := range configs {
if config.ConfKey == "NoticeEmailAddress" {
email = config.ConfValue
}
if config.ConfKey == "NoticeEmailPassword" {
password = config.ConfValue
}
if config.ConfKey == "NoticeEmailSmtp" {
smtp = config.ConfValue
}
}
if smtp == "" || email == "" || password == "" {
return
}
log.Println("发送访客通知邮件:" + smtp + "," + email + "," + password)
err := tools.SendSmtp(smtp, email, password, []string{email}, subject, content)
if err != nil {
log.Println("发送访客通知邮件失败:")
log.Println(err)
}
}
func SendEntSmtpEmail(subject, msg, entId string) {
if !tools.LimitFreqSingle("send_ent_email:"+entId, 1, 2) {
log.Println("send_ent_email limit")
return
}
configs := models.FindEntConfigByEntid(entId)
smtp := ""
email := ""
password := ""
for _, config := range configs {
if config.ConfKey == "NoticeEmailAddress" {
email = config.ConfValue
}
if config.ConfKey == "NoticeEmailPassword" {
password = config.ConfValue
}
if config.ConfKey == "NoticeEmailSmtp" {
smtp = config.ConfValue
}
}
if smtp == "" || email == "" || password == "" {
return
}
err := tools.SendSmtp(smtp, email, password, []string{email}, subject, msg)
if err != nil {
log.Println(err)
}
}
func SendAppGetuiPush(kefu string, title, content string) {
clientModel := &models.User_client{
Kefu: kefu,
}
clientInfos := clientModel.FindClients()
if len(clientInfos) == 0 {
return
}
appid := models.FindConfig("GetuiAppID")
appkey := models.FindConfig("GetuiAppKey")
appsecret := models.FindConfig("GetuiAppSecret")
appmastersecret := models.FindConfig("GetuiMasterSecret")
token := models.FindConfig("GetuiToken")
getui := &lib.Getui{
AppId: appid,
AppKey: appkey,
AppSecret: appsecret,
AppMasterSecret: appmastersecret,
}
for _, client := range clientInfos {
res, err := getui.PushSingle(token, client.Client_id, title, content)
//不正确的账号
if res == 20001 && err.Error() == "target user is invalid" {
clientModel2 := &models.User_client{
Kefu: kefu,
Client_id: client.Client_id,
}
clientModel2.DeleteClient()
}
if res == 10001 {
token, _ = getui.GetGetuiToken()
models.UpdateConfig("GetuiToken", token)
getui.PushSingle(token, client.Client_id, title, content)
}
}
}
// 发送邮件验证码
func SendEmailAuthCode(c *gin.Context) {
email := c.PostForm("email")
//验证邮箱
matched, _ := regexp.MatchString("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*", email)
if !matched {
c.JSON(200, gin.H{
"code": types.ApiCode.INVALID,
"msg": "邮箱格式不正确",
})
return
}
if !tools.LimitFreqSingle("send_email_authcode:"+email, 1, 50) {
log.Println("send_email_authcode limit " + email)
c.JSON(200, gin.H{
"code": types.ApiCode.FREQ_LIMIT,
"msg": types.ApiCode.GetMessage(types.ApiCode.FREQ_LIMIT),
})
return
}
smtp := models.FindConfig("NoticeEmailSmtp")
sender := models.FindConfig("NoticeEmailAddress")
password := models.FindConfig("NoticeEmailPassword")
if smtp == "" || sender == "" || password == "" {
c.JSON(200, gin.H{
"code": types.ApiCode.INVALID,
"msg": "系统没有配置发送邮箱",
})
return
}
ranNum := tools.RandNum(6)
session := sessions.DefaultMany(c, "go-session")
session.Set("emailCode"+email, ranNum)
_ = session.Save()
content := strings.Replace(common.NoticeTemplate, "[:content]", "你好,验证码为 "+ranNum, -1)
log.Println("发送邮件验证码:" + smtp + "," + sender + "," + password + "," + email + "," + content)
logContent := fmt.Sprintf("'%s'获取邮箱验证码 %s", email, ranNum)
go models.CreateFlyLog(email, c.ClientIP(), logContent, "user")
err := tools.SendSmtp(smtp, sender, password, []string{email}, "在线客服系统验证码", content)
if err != nil {
logContent := "发送邮件验证码失败:" + err.Error()
log.Println(logContent)
go models.CreateFlyLog(email, c.ClientIP(), logContent, "user")
c.JSON(200, gin.H{
"code": types.ApiCode.EMAIL_FAILD,
"msg": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}
// 发送注册通知邮件
func SendRegisterEmail(username, nickname, loginEmail string) {
smtp := models.FindConfig("NoticeEmailSmtp")
sender := models.FindConfig("NoticeEmailAddress")
password := models.FindConfig("NoticeEmailPassword")
if smtp == "" || sender == "" || password == "" {
return
}
content := fmt.Sprintf("账户:%s邮箱%s昵称%s注册成功", username, nickname, loginEmail)
err := tools.SendSmtp(smtp, sender, password, []string{sender}, "在线客服系统注册成功", content)
if err != nil {
log.Println("发送邮件失败:", err)
}
}
// 发送短信验证码
func SendSmsCode(c *gin.Context) {
phone := c.Query("phone")
//验证
matched, _ := regexp.MatchString("1[3-9]\\d{9}$", phone)
if !matched {
c.JSON(200, gin.H{
"code": types.ApiCode.INVALID,
"msg": types.ApiCode.GetMessage(types.ApiCode.INVALID),
})
return
}
if !tools.LimitFreqSingle("sendsms:"+c.ClientIP(), 1, 50) {
c.JSON(200, gin.H{
"code": types.ApiCode.FREQ_LIMIT,
"msg": types.ApiCode.GetMessage(types.ApiCode.FREQ_LIMIT),
})
return
}
ranNum := tools.RandNum(6)
session := sessions.DefaultMany(c, "go-session-a")
session.Set("smsCode"+phone, ranNum)
_ = session.Save()
log.Println("发送短信验证码:", phone, ranNum)
err := lib.SendSms(phone, ranNum)
if err != nil {
log.Println("发送短信验证码:", err)
c.JSON(200, gin.H{
"code": types.ApiCode.EMAIL_FAILD,
"msg": err.Error(),
})
return
}
kefuName, _ := c.Get("kefu_name")
entId, _ := c.Get("ent_id")
logContent := fmt.Sprintf("'%s'手机%s发送短信验证码'%s'", kefuName, phone, ranNum)
go models.CreateFlyLog(entId.(string), c.ClientIP(), logContent, "sms")
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}
// 发送微信模板消息
func PostSendWechatTemplate(c *gin.Context) {
entId := c.PostForm("ent_id")
kefuName := c.PostForm("kefu_name")
tel := c.PostForm("tel")
customer := models.FindCustomerWhere("kefu_name = ? and tel = ?", kefuName, tel)
if customer.AcountOpenid == "" {
c.JSON(200, gin.H{
"code": 200,
"msg": "未查询到绑定的公众号OpenID",
})
return
}
templateId := c.PostForm("template_id")
url := c.PostForm("url")
keyword1 := c.PostForm("keyword1")
keyword2 := c.PostForm("keyword2")
keyword3 := c.PostForm("keyword3")
keyword4 := c.PostForm("keyword4")
keyword5 := c.PostForm("keyword5")
keyword6 := c.PostForm("keyword6")
remark := c.PostForm("remark")
wechatConfig, _ := lib.NewWechatLib(entId)
msgData := make(map[string]*message.TemplateDataItem)
msgData["keyword1"] = &message.TemplateDataItem{
Value: keyword1,
Color: "",
}
msgData["keyword2"] = &message.TemplateDataItem{
Value: keyword2,
Color: "",
}
msgData["keyword3"] = &message.TemplateDataItem{
Value: keyword3,
Color: "",
}
msgData["keyword4"] = &message.TemplateDataItem{
Value: keyword4,
Color: "",
}
msgData["keyword5"] = &message.TemplateDataItem{
Value: keyword5,
Color: "",
}
msgData["keyword6"] = &message.TemplateDataItem{
Value: keyword6,
Color: "",
}
msgData["remark"] = &message.TemplateDataItem{
Value: remark,
Color: "",
}
msg := &message.TemplateMessage{
ToUser: customer.AcountOpenid,
Data: msgData,
TemplateID: templateId,
URL: url,
}
_, err := SendWechatTemplate(wechatConfig, msg)
if err != nil {
c.JSON(200, gin.H{
"code": 400,
"msg": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}
// 发送微信模板消息
func PostSendWechatTemplateByOpenid(c *gin.Context) {
openid := c.PostForm("openid")
entId := c.PostForm("ent_id")
if openid == "" {
c.JSON(200, gin.H{
"code": 400,
"msg": "请传递公众号OpenID",
})
return
}
templateId := c.PostForm("template_id")
url := c.PostForm("url")
keyword1 := c.PostForm("keyword1")
keyword2 := c.PostForm("keyword2")
keyword3 := c.PostForm("keyword3")
keyword4 := c.PostForm("keyword4")
keyword5 := c.PostForm("keyword5")
keyword6 := c.PostForm("keyword6")
remark := c.PostForm("remark")
systemBussinesId := models.FindConfig("SystemBussinesId")
if entId == "" {
entId = systemBussinesId
}
wechatConfig, _ := lib.NewWechatLib(entId)
msgData := make(map[string]*message.TemplateDataItem)
msgData["keyword1"] = &message.TemplateDataItem{
Value: keyword1,
Color: "",
}
msgData["keyword2"] = &message.TemplateDataItem{
Value: keyword2,
Color: "",
}
msgData["keyword3"] = &message.TemplateDataItem{
Value: keyword3,
Color: "",
}
msgData["keyword4"] = &message.TemplateDataItem{
Value: keyword4,
Color: "",
}
msgData["keyword5"] = &message.TemplateDataItem{
Value: keyword5,
Color: "",
}
msgData["keyword6"] = &message.TemplateDataItem{
Value: keyword6,
Color: "",
}
msgData["remark"] = &message.TemplateDataItem{
Value: remark,
Color: "",
}
msg := &message.TemplateMessage{
ToUser: openid,
Data: msgData,
TemplateID: templateId,
URL: url,
}
_, err := SendWechatTemplate(wechatConfig, msg)
if err != nil {
c.JSON(200, gin.H{
"code": 400,
"msg": err.Error(),
})
return
}
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
})
}