117 lines
3.0 KiB
Go
117 lines
3.0 KiB
Go
package handler
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/json"
|
||
"fmt"
|
||
"io"
|
||
"net/http"
|
||
"time"
|
||
|
||
"gotest/internal/config"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// CustomerHandler 客户信息收集处理器
|
||
type CustomerHandler struct {
|
||
cfg *config.Config
|
||
}
|
||
|
||
// NewCustomerHandler 创建客户信息收集处理器
|
||
func NewCustomerHandler(cfg *config.Config) *CustomerHandler {
|
||
return &CustomerHandler{cfg: cfg}
|
||
}
|
||
|
||
// CustomerRequest 客户信息请求
|
||
type CustomerRequest struct {
|
||
Name string `json:"name" binding:"required"`
|
||
Phone string `json:"phone" binding:"required"`
|
||
Company string `json:"company"`
|
||
Email string `json:"email"`
|
||
Needs string `json:"needs" binding:"required"`
|
||
}
|
||
|
||
// Submit 提交客户信息 POST /api/v1/customer/submit
|
||
func (h *CustomerHandler) Submit(c *gin.Context) {
|
||
var req CustomerRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
FailBadRequest(c, "请填写完整的联系信息")
|
||
return
|
||
}
|
||
|
||
// 构建企业微信消息内容
|
||
content := fmt.Sprintf("【新客户咨询】\n"+
|
||
"━━━━━━━━━━━━━━━━━━━━\n"+
|
||
"👤 姓名:%s\n"+
|
||
"📱 电话:%s\n"+
|
||
"📧 邮箱:%s\n"+
|
||
"🏢 公司:%s\n"+
|
||
"💼 需求:%s\n"+
|
||
"⏰ 时间:%s\n"+
|
||
"━━━━━━━━━━━━━━━━━━━━",
|
||
req.Name, req.Phone, req.Email, req.Company, req.Needs, time.Now().Format("2006-01-02 15:04:05"))
|
||
|
||
// 发送到企业微信webhook
|
||
if err := h.sendToWechatWebhook(content); err != nil {
|
||
// 即使webhook失败,也记录下来并返回成功(避免暴露内部错误)
|
||
fmt.Printf("发送企业微信webhook失败: %v\n", err)
|
||
}
|
||
|
||
Success(c, gin.H{
|
||
"message": "提交成功,我们会尽快联系您!",
|
||
})
|
||
}
|
||
|
||
// sendToWechatWebhook 发送消息到企业微信群机器人
|
||
func (h *CustomerHandler) sendToWechatWebhook(content string) error {
|
||
if h.cfg.WechatWebhook.URL == "" {
|
||
return fmt.Errorf("企业微信webhook URL未配置")
|
||
}
|
||
|
||
// 构建消息体
|
||
message := map[string]interface{}{
|
||
"msgtype": "text",
|
||
"text": map[string]string{
|
||
"content": content,
|
||
},
|
||
}
|
||
|
||
jsonData, err := json.Marshal(message)
|
||
if err != nil {
|
||
return fmt.Errorf("序列化消息失败: %w", err)
|
||
}
|
||
|
||
// 发送POST请求
|
||
resp, err := http.Post(h.cfg.WechatWebhook.URL, "application/json", bytes.NewBuffer(jsonData))
|
||
if err != nil {
|
||
return fmt.Errorf("发送请求失败: %w", err)
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
// 读取响应
|
||
body, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
return fmt.Errorf("读取响应失败: %w", err)
|
||
}
|
||
|
||
// 检查响应状态
|
||
if resp.StatusCode != http.StatusOK {
|
||
return fmt.Errorf("请求失败,状态码: %d,响应: %s", resp.StatusCode, string(body))
|
||
}
|
||
|
||
// 解析响应JSON
|
||
var result map[string]interface{}
|
||
if err := json.Unmarshal(body, &result); err != nil {
|
||
return fmt.Errorf("解析响应失败: %w", err)
|
||
}
|
||
|
||
// 检查企业微信返回的错误码
|
||
if errcode, ok := result["errcode"].(float64); ok && errcode != 0 {
|
||
errmsg, _ := result["errmsg"].(string)
|
||
return fmt.Errorf("企业微信返回错误: %v - %s", errcode, errmsg)
|
||
}
|
||
|
||
return nil
|
||
}
|