Explorar el Código

Merge branch 'develop' of 192.168.3.17:zhanghongbo/qfw into develop

renzheng hace 9 años
padre
commit
ae6dc61e49

+ 5 - 0
core/src/web/staticres/css/qfw.css

@@ -484,6 +484,11 @@ a.new_red:hover, a.new_red:active {
 	color: #FF5A5F;
 	box-shadow: none;
 }
+.btn.disabled, .btn.disabled.active, .btn.disabled.focus, .btn.disabled:active, .btn.disabled:focus, .btn.disabled:hover, .btn[disabled], .btn[disabled].active, .btn[disabled].focus, .btn[disabled]:active, .btn[disabled]:focus, .btn[disabled]:hover, fieldset[disabled] .btn, fieldset[disabled] .btn.active, fieldset[disabled] .btn.focus, fieldset[disabled] .btn:active, fieldset[disabled] .btn:focus, fieldset[disabled] .btn:hover{
+	color: #FFFFFF;
+	background-color: #aea79f;
+	border-color: #aea79f;
+}
 .btn-sm, .btn-group-sm > .btn{
 	padding-top: 3px;
 	padding-bottom: 3px;

+ 1 - 1
core/src/web/templates/swordfish/wxshare.html

@@ -1,6 +1,6 @@
 <html>
 <head>
-<title>企明星-剑鱼-演示</title>
+<title>企明星-剑鱼</title>
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 <link href="/wxswordfish/style.css" rel="stylesheet">
 <link href="/swiper/swiper.min.css" rel="stylesheet">

+ 1 - 1
core/src/web/templates/swordfish/wxshareguide.html

@@ -1,6 +1,6 @@
 <html>
 <head>
-<title>企明星-剑鱼-演示</title>
+<title>企明星-剑鱼-分享</title>
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 <link href="/wxswordfish/style.css" rel="stylesheet">
 <link href="/swiper/swiper.min.css" rel="stylesheet">

+ 3 - 1
weixin/src/config.json

@@ -34,6 +34,8 @@
 		"title":"企明星新年抽奖活动进行中",
 		"picurl":"http://www.qimingxing.info/images/choujiang2.png"
 	},"weixinautorpl":"小主的吩咐我们已经收到了,请留下您的联系方式(手机号或qq号),企明星客服会在下一个工作日9:00-17:00给小主回复哦!",
-	"creditRpc":"127.0.0.1:8765"
+	"creditRpc":"127.0.0.1:8765",
+	"subscribemonitorcyc":3,
+	"subscribemonitortimes":12
 
 }

+ 3 - 3
weixin/src/qfw/weixin/clickhandler.go

@@ -36,7 +36,7 @@ func ClickHandler(w ResponseWriter, r *Request) {
 					w.ReplyText("您已经提交认证信息,正在审核中,请耐心等待")
 				} else if state == 1 {
 					//w.ReplyText("恭喜您,身份认证已通过,请点击<a href='http://" + wf.SysConfig.Domain + "/ent/wsite/edit/" + r.FromUserName + "'>进入微官网</a>")
-					urlstr := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + wf.SysConfig.Appid + "&redirect_uri=http://" + wf.SysConfig.Domain + "/weixinoauth?action=msiteaction&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
+					urlstr := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + wf.SysConfig.Appid + "&redirect_uri=http://" + wf.SysConfig.Domain + "/weixinoauth/action/msiteaction&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
 					w.ReplyText("恭喜您,身份认证已通过,请点击<a href='" + urlstr + "'>进入微官网</a>")
 				} else {
 					str := "欢迎您进行企业认证"
@@ -56,7 +56,7 @@ func ClickHandler(w ResponseWriter, r *Request) {
 					w.ReplyText("您已经提交认证信息,正在审核中,请耐心等待")
 				} else if state == 1 {
 					//w.ReplyText("恭喜您,身份认证已通过,请点击<a href='http://" + wf.SysConfig.Domain + "/ent/wsite/edit/" + r.FromUserName + "'>进入微官网</a>")
-					urlstr := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + wf.SysConfig.Appid + "&redirect_uri=http://" + wf.SysConfig.Domain + "/weixinoauth?action=msiteaction&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
+					urlstr := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + wf.SysConfig.Appid + "&redirect_uri=http://" + wf.SysConfig.Domain + "/weixinoauth/action/msiteaction&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
 					w.ReplyText("恭喜您,身份认证已通过,请点击<a href='" + urlstr + "'>进入微官网</a>")
 				} else {
 					str := "欢迎您进行个人认证"
@@ -76,7 +76,7 @@ func ClickHandler(w ResponseWriter, r *Request) {
 					w.ReplyText("您已经提交认证信息,正在审核中,请耐心等待")
 				} else if state == 1 {
 					//w.ReplyText("恭喜您,身份认证已通过,请点击<a href='http://" + wf.SysConfig.Domain + "/ent/wsite/edit/" + r.FromUserName + "'>进入微官网</a>")
-					urlstr := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + wf.SysConfig.Appid + "&redirect_uri=http://" + wf.SysConfig.Domain + "/weixinoauth?action=msiteaction&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
+					urlstr := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + wf.SysConfig.Appid + "&redirect_uri=http://" + wf.SysConfig.Domain + "/weixinoauth/action/msiteaction&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
 					w.ReplyText("恭喜您,身份认证已通过,请点击<a href='" + urlstr + "'>进入微官网</a>")
 				} else {
 					str := "欢迎您进行机构认证"

+ 13 - 4
weixin/src/qfw/weixin/dao/sharedao.go

@@ -14,11 +14,20 @@ import (
 //锁
 var sharelock *sync.Mutex = &sync.Mutex{}
 
-//保存用户邀请关系,走线程池
-func SaveInviteLink(shareid string, myopenid string) {
+//保存用户邀请关系
+func SaveInviteLink(shareid string, myopenid string,isolduser bool) {
 	log.Println("save user invitelink ", myopenid, shareid)
-	//先找邀请人信息
-	sharelock.Lock()
+		sharelock.Lock()
+	//对于老用户的处理
+	if isolduser{//找我自己是不是别人邀请的
+		invite:=FindOne("person_invitelink",`{"s_target_openid":"`+myopenid+`"}`)
+		if *invite!=nil{
+			sharelock.Unlock()
+			return
+		}
+	}
+	//找邀请人信息
+
 	ret := FindOne("person_share", M{"i_shareid": shareid})
 	if *ret == nil {
 		log.Println("wu share info!!!!")

+ 1 - 0
weixin/src/qfw/weixin/msgtxtchandler.go

@@ -65,6 +65,7 @@ func MsgTxtHandler(w ResponseWriter, r *Request) {
 		w.ReplyText("嗨,小星来陪你解闷。有什么开心的,不开心的说说来,大伙乐呵乐呵。\n输入q或Q离开。")
 		return
 	} else if r.Content == "抽奖" { //进入抽奖环节
+		//w.ReplyText("非常抱歉!系统维护中,请稍后再试。")
 		targeturl := fmt.Sprintf("http://%s/activity/%s/%s", wf.SysConfig.Domain, wf.SysConfig.Activity["activitycode"], se.EncodeString(r.FromUserName))
 		w.ReplyNews([]Article{Article{PicUrl: wf.SysConfig.Activity["picurl"], Title: wf.SysConfig.Activity["title"], Url: targeturl}})
 	} else if strings.HasPrefix(r.Content, "内部报名") { //绑定拓普员工姓名

+ 2 - 2
weixin/src/qfw/weixin/paybonusact.go

@@ -85,13 +85,13 @@ type GroupBonusMsg struct {
 var se util.SimpleEncrypt = util.SimpleEncrypt{Key: "topnet2015topnet2015"}
 
 //发红包(传统红包)
-func PayBonusAct1(w http.ResponseWriter, r *http.Request) {
+func PayNormalBonusAct(w http.ResponseWriter, r *http.Request) {
 	if r.Method == "GET" {
 		w.Write([]byte(html))
 	} else {
 		//动作
 		cert := r.FormValue("cert")
-		s_cert := se.EncodeString(time.Now().Format("2006010215"))
+		s_cert := se.EncodeString(time.Now().Format("200601021504"))
 		if s_cert != cert {
 			w.Write([]byte("error cert"))
 			return

+ 6 - 9
weixin/src/qfw/weixin/subscribehandler.go

@@ -8,25 +8,19 @@ import (
 	"net/http"
 	"os"
 	"qfw/util"
+	wxutil "qfw/weixin/util"
 	"qfw/util/redis"
 	"qfw/weixin/dao"
 	"qfw/weixinconfig"
-	"regexp"
 	"strings"
 	"time"
 )
 
-var WELCOME_MSG string
-var OWELCOME_MSG string
 
-var digitreg *regexp.Regexp = regexp.MustCompile("^\\d+$")
 
 //关注事件处理
 func SubscribeHandler(w ResponseWriter, r *Request) {
-	if WELCOME_MSG == "" || OWELCOME_MSG == "" {
-		WELCOME_MSG = weixinconfig.SysConfig.WelcomeTip
-		OWELCOME_MSG = weixinconfig.SysConfig.OWelcomeTip
-	}
+	wxutil.SubscribeInc()
 	openid := r.FromUserName
 	ret, err := w.GetUserBaseInfo(openid)
 	var unionid, bindweixin, userphoto string
@@ -57,11 +51,14 @@ func SubscribeHandler(w ResponseWriter, r *Request) {
 			redis.Put("sso", "new_"+source, openid, 900)
 			//TODO 处理分享(邀请)类的二维码,记录邀请关系
 			if strings.HasPrefix(source, "32") {
-				go dao.SaveInviteLink(source, r.FromUserName)
+				go dao.SaveInviteLink(source, r.FromUserName, false)
 				//go dao.UpdateInviteUserCoupon(source)
 			}
 		} else {
 			w.ReplyText(OWELCOME_MSG) // 有旧人关注,返回欢迎消息
+			if strings.HasPrefix(source, "32") {
+				go dao.SaveInviteLink(source, r.FromUserName, true)
+			}
 		}
 		DoLogin(source, openid)
 	} else {

+ 42 - 0
weixin/src/qfw/weixin/util/subscribefilter.go

@@ -0,0 +1,42 @@
+package util
+
+//实时统计状态
+import (
+	"log"
+	"fmt"
+	"qfw/util/mongodb"
+	"sync/atomic"
+	"time"
+)
+
+var tmp int32 = 0
+var starttime, endtime int64
+var dutrat time.Duration //时间间隔
+var times int32
+
+//累加
+func SubscribeInc() {
+	atomic.AddInt32(&tmp, 1)
+}
+
+func subscribeStats() {
+	endtime = time.Now().Unix()
+	total := atomic.SwapInt32(&tmp, 0)
+	//
+	if total > times {
+		log.Printf("flash black user [%d - %d] \n ",starttime,endtime)
+		//刷数据
+		mongodb.Update("user", fmt.Sprintf(`{"l_registedate":{"$gte":%d,"$lte":%d}}`, starttime, endtime), `{"$set":{"black":1}}`, false, true)
+	}
+	starttime = time.Now().Unix()
+	endtime = starttime
+	time.AfterFunc(dutrat, subscribeStats)
+}
+
+//启动过滤,3分钟,超过20次,认为是非法操作
+func StartSubscribeFilter(cyc, ts int) {
+	times = int32(ts)
+	dutrat = time.Duration(cyc) * time.Minute
+	starttime = time.Now().Unix()
+	go time.AfterFunc(dutrat, subscribeStats)
+}

+ 1 - 0
weixin/src/qfw/weixin/util/util.go

@@ -0,0 +1 @@
+package util

+ 9 - 1
weixin/src/qfw/weixin/weixin.go

@@ -2,6 +2,7 @@ package weixin
 
 import (
 	"net/http"
+	"qfw/weixin/util"
 	wf "qfw/weixinconfig"
 	"regexp"
 )
@@ -10,12 +11,17 @@ var Mux *Weixin
 
 //语音用到的正则
 var clear_voice_reg, keyword_voice_reg, notify_xiaoxing, chat_bye *regexp.Regexp
+var WELCOME_MSG string
+var OWELCOME_MSG string
+var digitreg *regexp.Regexp = regexp.MustCompile("^\\d+$")
 
 func InitWeixinSdk() {
 	keyword_voice_reg, _ = regexp.Compile("查询|搜索|检索|看|找|查|搜")
 	clear_voice_reg, _ = regexp.Compile("!|!|\\s+")
 	notify_xiaoxing, _ = regexp.Compile("小星|阿星|助手|助理")
 	chat_bye, _ = regexp.Compile("再见|拜拜|不说了|不聊了")
+	WELCOME_MSG = wf.SysConfig.WelcomeTip
+	OWELCOME_MSG = wf.SysConfig.OWelcomeTip
 
 	// my-token 验证微信公众平台的Token
 	// app-id, app-secret用于高级API调用。
@@ -42,9 +48,10 @@ func InitWeixinSdk() {
 	//单点登录请求
 	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/sso/", SsoHandle)
 	//支付
-	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/paybonus", PayBonusAct)
+	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/paybonus", PayNormalBonusAct)
 	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/recharge", RechargeAct)
 	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/paycallback", PayCallback)
+	//监控
 
 	//生成推广二维码
 	http.HandleFunc("/"+wf.SysConfig.Appcontext+"/adv/", AdvHandle)
@@ -52,4 +59,5 @@ func InitWeixinSdk() {
 	//执行其他一些初始化的动作
 	InitRobotHttpClient()
 	InitSSLClient()
+	util.StartSubscribeFilter(wf.SysConfig.SubscribeMonitorCyc, wf.SysConfig.SubscribeMonitorTimes)
 }

+ 12 - 0
weixin/src/qfw/weixin/weixinsdkssl.go

@@ -1,6 +1,7 @@
 package weixin
 
 import (
+	"encoding/json"
 	"bytes"
 	"crypto/tls"
 	"crypto/x509"
@@ -76,6 +77,17 @@ func (wx *Weixin) PostXmlCustom(url string, obj interface{}) ([]byte, error) {
 	return bs, err
 }
 
+//Post Json Data
+func (wx *Weixin) PostJsonCustom(url string, obj interface{}) ([]byte,error){
+	var bs []byte
+	data, err := json.Marshal(obj)
+	if err != nil {
+		return bs, err
+	}
+	bs, err = postSSLRequest(url, wx.tokenChan, data)
+	return bs,err
+}
+
 //发送安全请求
 func postSSLRequest(reqURL string, c chan accessToken, data []byte) ([]byte, error) {
 	for i := 0; i < retryMaxN; i++ {

+ 2 - 0
weixin/src/qfw/weixinconfig/weixinconfig.go

@@ -30,6 +30,8 @@ type wxconfig struct {
 	FreezeTip       string            `json:"freezeTip"`
 	Activity        map[string]string `json:"activity"` //活动配置
 	WeixinAutoRpl   string            `json:"weixinautorpl"`
+	SubscribeMonitorCyc int `json:"subscribemonitorcyc"`
+	SubscribeMonitorTimes int `json:"subscribemonitortimes"`
 }
 
 //系统配置

BIN
weixin/src/weixin