|
@@ -51,9 +51,9 @@ type WXMsg struct { |
|
|
MsgType string |
|
|
MsgType string |
|
|
Content string |
|
|
Content string |
|
|
MsgId int64 |
|
|
MsgId int64 |
|
|
Event string //事件类型,subscribe |
|
|
|
|
|
EventKey string //事件KEY值,qrscene_为前缀,后面为二维码的参数值 |
|
|
|
|
|
Ticket string //二维码的ticket,可用来换取二维码图片 |
|
|
|
|
|
|
|
|
Event string // 事件类型,subscribe |
|
|
|
|
|
EventKey string // 事件KEY值,qrscene_为前缀,后面为二维码的参数值 |
|
|
|
|
|
Ticket string // 二维码的ticket,可用来换取二维码图片 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// WXTextMsg 微信文本消息结构体 |
|
|
// WXTextMsg 微信文本消息结构体 |
|
@@ -68,31 +68,31 @@ type WXTextMsg struct { |
|
|
|
|
|
|
|
|
// WXEventForSubscribeMsg 扫描带参数二维码事件消息结构体(用户未关注时,进行关注后的事件推送) |
|
|
// WXEventForSubscribeMsg 扫描带参数二维码事件消息结构体(用户未关注时,进行关注后的事件推送) |
|
|
type WXEventForSubscribeMsg struct { |
|
|
type WXEventForSubscribeMsg struct { |
|
|
ToUserName string //开发者微信号 |
|
|
|
|
|
FromUserName string //发送方帐号(一个OpenID) |
|
|
|
|
|
CreateTime int64 //消息创建时间 (整型) |
|
|
|
|
|
MsgType string //消息类型,event |
|
|
|
|
|
Event string //事件类型,subscribe |
|
|
|
|
|
EventKey string //事件KEY值,qrscene_为前缀,后面为二维码的参数值 |
|
|
|
|
|
Ticket string //二维码的ticket,可用来换取二维码图片 |
|
|
|
|
|
|
|
|
ToUserName string // 开发者微信号 |
|
|
|
|
|
FromUserName string // 发送方帐号(一个OpenID) |
|
|
|
|
|
CreateTime int64 // 消息创建时间 (整型) |
|
|
|
|
|
MsgType string // 消息类型,event |
|
|
|
|
|
Event string // 事件类型,subscribe |
|
|
|
|
|
EventKey string // 事件KEY值,qrscene_为前缀,后面为二维码的参数值 |
|
|
|
|
|
Ticket string // 二维码的ticket,可用来换取二维码图片 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// WXEventForScanMsg 扫描带参数二维码事件消息结构体(用户已关注时的事件推送) |
|
|
// WXEventForScanMsg 扫描带参数二维码事件消息结构体(用户已关注时的事件推送) |
|
|
type WXEventForScanMsg struct { |
|
|
type WXEventForScanMsg struct { |
|
|
ToUserName string //开发者微信号 |
|
|
|
|
|
FromUserName string //发送方帐号(一个OpenID) |
|
|
|
|
|
CreateTime int64 //消息创建时间 (整型) |
|
|
|
|
|
MsgType string //消息类型,event |
|
|
|
|
|
Event string //事件类型,subscribe |
|
|
|
|
|
EventKey string //事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id |
|
|
|
|
|
Ticket string //二维码的ticket,可用来换取二维码图片 |
|
|
|
|
|
|
|
|
ToUserName string // 开发者微信号 |
|
|
|
|
|
FromUserName string // 发送方帐号(一个OpenID) |
|
|
|
|
|
CreateTime int64 // 消息创建时间 (整型) |
|
|
|
|
|
MsgType string // 消息类型,event |
|
|
|
|
|
Event string // 事件类型,subscribe |
|
|
|
|
|
EventKey string // 事件KEY值,是一个32位无符号整数,即创建二维码时的二维码scene_id |
|
|
|
|
|
Ticket string // 二维码的ticket,可用来换取二维码图片 |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// WXMsgReceive 微信消息接收 |
|
|
// WXMsgReceive 微信消息接收 |
|
|
func WXMsgReceive(c *gin.Context) { |
|
|
func WXMsgReceive(c *gin.Context) { |
|
|
log.Printf("[消息接收] - 收到新消息") |
|
|
log.Printf("[消息接收] - 收到新消息") |
|
|
var msg WXMsg |
|
|
var msg WXMsg |
|
|
err := c.ShouldBindXML(&msg) |
|
|
|
|
|
|
|
|
err := c.ShouldBindJSON(&msg) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
log.Printf("[消息接收] - XML数据包解析失败: %v\n", err) |
|
|
log.Printf("[消息接收] - XML数据包解析失败: %v\n", err) |
|
|
return |
|
|
return |
|
@@ -100,24 +100,24 @@ func WXMsgReceive(c *gin.Context) { |
|
|
utils.FilePutContents("WXMsgReceive", utils.SerializeStr(msg)) |
|
|
utils.FilePutContents("WXMsgReceive", utils.SerializeStr(msg)) |
|
|
log.Printf("[消息接收] - 收到消息, 消息类型为: %s", msg.MsgType) |
|
|
log.Printf("[消息接收] - 收到消息, 消息类型为: %s", msg.MsgType) |
|
|
if msg.MsgType == "event" { |
|
|
if msg.MsgType == "event" { |
|
|
//事件类型消息 |
|
|
|
|
|
|
|
|
// 事件类型消息 |
|
|
eventMsg := msg |
|
|
eventMsg := msg |
|
|
log.Printf("[事件类型]-收到消息, 事件类型为: %s, 事件KEY值为: %s\n, 二维码的ticket值为: %s\n", eventMsg.Event, eventMsg.EventKey, eventMsg.Ticket) |
|
|
log.Printf("[事件类型]-收到消息, 事件类型为: %s, 事件KEY值为: %s\n, 二维码的ticket值为: %s\n", eventMsg.Event, eventMsg.EventKey, eventMsg.Ticket) |
|
|
if eventMsg.Event == "subscribe" { |
|
|
if eventMsg.Event == "subscribe" { |
|
|
//用户未关注时,进行关注后的事件推送 |
|
|
|
|
|
|
|
|
// 用户未关注时,进行关注后的事件推送 |
|
|
err := DealCallBack(eventMsg.FromUserName, eventMsg.EventKey) |
|
|
err := DealCallBack(eventMsg.FromUserName, eventMsg.EventKey) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
WXMsgReply(c, eventMsg.ToUserName, eventMsg.FromUserName, err.Error()) |
|
|
WXMsgReply(c, eventMsg.ToUserName, eventMsg.FromUserName, err.Error()) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if eventMsg.Event == "SCAN" { |
|
|
if eventMsg.Event == "SCAN" { |
|
|
//用户已关注时的事件推送 |
|
|
|
|
|
|
|
|
// 用户已关注时的事件推送 |
|
|
err := DealCallBack(eventMsg.FromUserName, eventMsg.EventKey) |
|
|
err := DealCallBack(eventMsg.FromUserName, eventMsg.EventKey) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
WXMsgReply(c, eventMsg.ToUserName, eventMsg.FromUserName, err.Error()) |
|
|
WXMsgReply(c, eventMsg.ToUserName, eventMsg.FromUserName, err.Error()) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if eventMsg.Event == "CLICK" { //公众号点击 |
|
|
|
|
|
|
|
|
if eventMsg.Event == "CLICK" { // 公众号点击 |
|
|
if strings.Contains(strings.ToLower(eventMsg.EventKey), "official_account_custom_reply") { |
|
|
if strings.Contains(strings.ToLower(eventMsg.EventKey), "official_account_custom_reply") { |
|
|
id := strings.ReplaceAll(strings.ToLower(eventMsg.EventKey), "official_account_custom_reply_", "") |
|
|
id := strings.ReplaceAll(strings.ToLower(eventMsg.EventKey), "official_account_custom_reply_", "") |
|
|
var mod model.SysModule |
|
|
var mod model.SysModule |
|
@@ -145,7 +145,7 @@ func WXMsgReceive(c *gin.Context) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if msg.MsgType == "text" { |
|
|
if msg.MsgType == "text" { |
|
|
//文本类型消息 |
|
|
|
|
|
|
|
|
// 文本类型消息 |
|
|
textMsg := msg |
|
|
textMsg := msg |
|
|
log.Printf("[文本消息]-收到消息, 消息内容为: %s", textMsg.Content) |
|
|
log.Printf("[文本消息]-收到消息, 消息内容为: %s", textMsg.Content) |
|
|
WXMsgReply(c, textMsg.ToUserName, textMsg.FromUserName, textMsg.Content) |
|
|
WXMsgReply(c, textMsg.ToUserName, textMsg.FromUserName, textMsg.Content) |
|
@@ -182,7 +182,7 @@ func WXMsgReply(c *gin.Context, fromUser, toUser, content string) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func DealCallBack(openId, ticket string) error { |
|
|
func DealCallBack(openId, ticket string) error { |
|
|
//1、查找对应的二维码记录 |
|
|
|
|
|
|
|
|
// 1、查找对应的二维码记录 |
|
|
qrcodeDb := db.QrcodeDb{} |
|
|
qrcodeDb := db.QrcodeDb{} |
|
|
qrcodeDb.Set() |
|
|
qrcodeDb.Set() |
|
|
qrcode, err := qrcodeDb.GetQrcodeByIndex(ticket) |
|
|
qrcode, err := qrcodeDb.GetQrcodeByIndex(ticket) |
|
@@ -193,7 +193,7 @@ func DealCallBack(openId, ticket string) error { |
|
|
return errors.New("未查询到对应二维码记录") |
|
|
return errors.New("未查询到对应二维码记录") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//2、查找当前二维码是否可用 |
|
|
|
|
|
|
|
|
// 2、查找当前二维码是否可用 |
|
|
qrcodeWithBatchRecordsDb := db.QrcodeWithBatchRecordsDb{} |
|
|
qrcodeWithBatchRecordsDb := db.QrcodeWithBatchRecordsDb{} |
|
|
qrcodeWithBatchRecordsDb.Set() |
|
|
qrcodeWithBatchRecordsDb.Set() |
|
|
qrcodeWithBatchRecord, err := qrcodeWithBatchRecordsDb.GetQrcodeWithBatchRecordsByQrcodeId(qrcode.Id) |
|
|
qrcodeWithBatchRecord, err := qrcodeWithBatchRecordsDb.GetQrcodeWithBatchRecordsByQrcodeId(qrcode.Id) |
|
@@ -204,7 +204,7 @@ func DealCallBack(openId, ticket string) error { |
|
|
return errors.New("当前二维码不可使用!") |
|
|
return errors.New("当前二维码不可使用!") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//3、查找当前用户是否使用过当前二维码 |
|
|
|
|
|
|
|
|
// 3、查找当前用户是否使用过当前二维码 |
|
|
userUseQrcodeRecordsDb := db.UserUseQrcodeRecordsDb{} |
|
|
userUseQrcodeRecordsDb := db.UserUseQrcodeRecordsDb{} |
|
|
userUseQrcodeRecordsDb.Set() |
|
|
userUseQrcodeRecordsDb.Set() |
|
|
|
|
|
|
|
@@ -216,8 +216,8 @@ func DealCallBack(openId, ticket string) error { |
|
|
return errors.New("请勿重复使用二维码!") |
|
|
return errors.New("请勿重复使用二维码!") |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//4、发送微信红包 |
|
|
|
|
|
post, err := utils.CurlPost("http://pay.izhyin.com/wx/redPackage/index", utils.SerializeStr(map[string]string{ |
|
|
|
|
|
|
|
|
// 4、发送微信红包 |
|
|
|
|
|
post, err := utils.CurlPost("http://pay.zhios.cn/wx/redPackage/index", utils.SerializeStr(map[string]string{ |
|
|
"openid": openId, |
|
|
"openid": openId, |
|
|
"amount": utils.Float64ToStr(utils.StrToFloat64(qrcodeWithBatchRecord.Amount) * 100), |
|
|
"amount": utils.Float64ToStr(utils.StrToFloat64(qrcodeWithBatchRecord.Amount) * 100), |
|
|
}), nil) |
|
|
}), nil) |
|
@@ -256,21 +256,21 @@ func DealCallBack(openId, ticket string) error { |
|
|
return errors.New(data.ReturnMsg) |
|
|
return errors.New(data.ReturnMsg) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//5、将当前二维码状态修改为“可用” |
|
|
|
|
|
|
|
|
// 5、将当前二维码状态修改为“可用” |
|
|
qrcode.State = enum.QrcodeSateAllowUse |
|
|
qrcode.State = enum.QrcodeSateAllowUse |
|
|
_, err = qrcodeDb.BatchUpdateQrcode(qrcode, "state") |
|
|
_, err = qrcodeDb.BatchUpdateQrcode(qrcode, "state") |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//6、将当前二维码记录修改为“已使用” |
|
|
|
|
|
|
|
|
// 6、将当前二维码记录修改为“已使用” |
|
|
qrcodeWithBatchRecord.State = enum.QrcodeWithBatchRecordsStateForAlready |
|
|
qrcodeWithBatchRecord.State = enum.QrcodeWithBatchRecordsStateForAlready |
|
|
_, err = qrcodeWithBatchRecordsDb.UpdateQrcodeWithBatchRecord(qrcodeWithBatchRecord) |
|
|
_, err = qrcodeWithBatchRecordsDb.UpdateQrcodeWithBatchRecord(qrcodeWithBatchRecord) |
|
|
if err != nil { |
|
|
if err != nil { |
|
|
return err |
|
|
return err |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//7、新增用户使用记录 |
|
|
|
|
|
|
|
|
// 7、新增用户使用记录 |
|
|
_, err = userUseQrcodeRecordsDb.InsertUserUseQrcodeRecords(&model.UserUseQrcodeRecords{ |
|
|
_, err = userUseQrcodeRecordsDb.InsertUserUseQrcodeRecords(&model.UserUseQrcodeRecords{ |
|
|
UserWxOpenId: openId, |
|
|
UserWxOpenId: openId, |
|
|
RecordsId: qrcodeWithBatchRecord.Id, |
|
|
RecordsId: qrcodeWithBatchRecord.Id, |
|
|