|
@@ -33,6 +33,33 @@ var regKey *regexp.Regexp
|
|
//锁
|
|
//锁
|
|
var sharelock *sync.Mutex = &sync.Mutex{}
|
|
var sharelock *sync.Mutex = &sync.Mutex{}
|
|
|
|
|
|
|
|
+/*扫码锁,目前发现android手机,扫码的时候有时会请求两个,不是微信回调两次,
|
|
|
|
+是在手机上扫完码之后,看扫码的框里面请求了两次,如果是回调超时,重复回调的话,createtime是一样的,
|
|
|
|
+目前解决方法是判断回调参数createtime,3秒之内的扫码事件,不再做回复*/
|
|
|
|
+var scanMap = map[string]int{}
|
|
|
|
+var scanLock *sync.Mutex = &sync.Mutex{}
|
|
|
|
+
|
|
|
|
+type MapScan struct {
|
|
|
|
+ Map map[string]int
|
|
|
|
+ Lock sync.Mutex
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (m *MapScan) GC() {
|
|
|
|
+ defer util.Catch()
|
|
|
|
+ m.Lock.Lock()
|
|
|
|
+ now := time.Now().Unix()
|
|
|
|
+ for k, v := range m.Map {
|
|
|
|
+ if now-int64(v) >= 30 {
|
|
|
|
+ delete(m.Map, k)
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ m.Lock.Unlock()
|
|
|
|
+ time.AfterFunc(15*time.Minute, m.GC)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+var MSPOOL = 20
|
|
|
|
+var MapScans = make([]*MapScan, MSPOOL)
|
|
|
|
+
|
|
func init() {
|
|
func init() {
|
|
util.InitInfluxdb(util.ObjToString(config.Sysconfig["influxdb"]))
|
|
util.InitInfluxdb(util.ObjToString(config.Sysconfig["influxdb"]))
|
|
InitSSLClient("./apiclient_cert.pem", "./apiclient_key.pem", "./rootca.pem")
|
|
InitSSLClient("./apiclient_cert.pem", "./apiclient_key.pem", "./rootca.pem")
|
|
@@ -49,6 +76,11 @@ func init() {
|
|
//关键词只能包含汉字、字母、数子
|
|
//关键词只能包含汉字、字母、数子
|
|
regKey, _ = regexp.Compile("^([0-9]|[A-Za-z]|[\u4E00-\u9FFF])+$")
|
|
regKey, _ = regexp.Compile("^([0-9]|[A-Za-z]|[\u4E00-\u9FFF])+$")
|
|
CountRun(8)
|
|
CountRun(8)
|
|
|
|
+ for i := 0; i < MSPOOL; i++ {
|
|
|
|
+ ms := &MapScan{Map: map[string]int{}}
|
|
|
|
+ go ms.GC()
|
|
|
|
+ MapScans[i] = ms
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
//客服消息处理
|
|
//客服消息处理
|
|
@@ -150,7 +182,7 @@ func MsgTxtHandler(w ResponseWriter, r *Request) {
|
|
searchWord = string([]rune(searchWord)[:8]) + "..."
|
|
searchWord = string([]rune(searchWord)[:8]) + "..."
|
|
}
|
|
}
|
|
searchWordUrl := fmt.Sprintf(config.Sysconfig["proxysess"].(string), se.EncodeString(openid+","+user.UnionId+","+strconv.Itoa(int(time.Now().Unix()))+",searchKeyword")) + "__" + searchWord
|
|
searchWordUrl := fmt.Sprintf(config.Sysconfig["proxysess"].(string), se.EncodeString(openid+","+user.UnionId+","+strconv.Itoa(int(time.Now().Unix()))+",searchKeyword")) + "__" + searchWord
|
|
- w.ReplyText(fmt.Sprintf(config.Sysconfig["weixinAutoRpl"].(string), searchUrl, rsssetUrl, searchWordUrl, searchWord))
|
|
|
|
|
|
+ w.ReplyText(fmt.Sprintf(config.Sysconfig["weixinAutoRpl"].(string), rsssetUrl, searchUrl, searchWordUrl, searchWord))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -408,6 +440,9 @@ func CheckQmxUser(newUser *map[string]interface{}, UnionId string) (b bool, qmxi
|
|
func Subscribe(w ResponseWriter, r *Request) {
|
|
func Subscribe(w ResponseWriter, r *Request) {
|
|
defer util.Catch()
|
|
defer util.Catch()
|
|
openid := r.FromUserName
|
|
openid := r.FromUserName
|
|
|
|
+ if isRepeatCall(openid, r.CreateTime) {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
user, err := Mux.GetUserInfo(openid)
|
|
user, err := Mux.GetUserInfo(openid)
|
|
var source = ""
|
|
var source = ""
|
|
var pccodepre = ""
|
|
var pccodepre = ""
|
|
@@ -686,6 +721,9 @@ var qrSimpleEncrypt = &util.SimpleEncrypt{"qrcode_jywx2017"}
|
|
func ScanHandler(w ResponseWriter, r *Request) {
|
|
func ScanHandler(w ResponseWriter, r *Request) {
|
|
defer util.Catch()
|
|
defer util.Catch()
|
|
openid := r.FromUserName
|
|
openid := r.FromUserName
|
|
|
|
+ if isRepeatCall(openid, r.CreateTime) {
|
|
|
|
+ return
|
|
|
|
+ }
|
|
m, b := tools.MQFW.FindOneByField("user", `{"s_m_openid":"`+openid+`"}`, `{"_id":1,"s_headimage":1,"o_jy":1}`)
|
|
m, b := tools.MQFW.FindOneByField("user", `{"s_m_openid":"`+openid+`"}`, `{"_id":1,"s_headimage":1,"o_jy":1}`)
|
|
shareData := redis.Get("sso", "p_shareData_"+r.EventKey)
|
|
shareData := redis.Get("sso", "p_shareData_"+r.EventKey)
|
|
infoData := map[string]interface{}{}
|
|
infoData := map[string]interface{}{}
|
|
@@ -1380,3 +1418,27 @@ func downloadUserFace(url string) string {
|
|
}()
|
|
}()
|
|
return filename
|
|
return filename
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+//过滤重复调用
|
|
|
|
+func isRepeatCall(openId string, createTime int) bool {
|
|
|
|
+ defer util.Catch()
|
|
|
|
+ flag := false
|
|
|
|
+ myMap := MapScans[HashVal(openId)%MSPOOL]
|
|
|
|
+ myMap.Lock.Lock()
|
|
|
|
+ if myMap.Map[openId] > 0 && createTime-myMap.Map[openId] <= 2 {
|
|
|
|
+ log.Println("监测到重复调用。。。", openId, myMap.Map[openId], createTime)
|
|
|
|
+ flag = true
|
|
|
|
+ }
|
|
|
|
+ myMap.Map[openId] = createTime
|
|
|
|
+ myMap.Lock.Unlock()
|
|
|
|
+ return flag
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+//计算代码的hash值
|
|
|
|
+func HashVal(src string) int {
|
|
|
|
+ check := 0
|
|
|
|
+ for i := len(src) / 2; i < len(src); i++ {
|
|
|
|
+ check += int(src[i])
|
|
|
|
+ }
|
|
|
|
+ return check
|
|
|
|
+}
|