wanghuidong 5 năm trước cách đây
mục cha
commit
b9ea1820ce
8 tập tin đã thay đổi với 67 bổ sung68 xóa
  1. 1 1
      go.mod
  2. 5 1
      go.sum
  3. 3 1
      main.go
  4. 1 11
      rpc/rpc.go
  5. 8 51
      weixin/config.go
  6. 27 0
      weixin/muxEventHandle.go
  7. 20 2
      weixin/weixin.go
  8. 2 1
      wxCfg.json

+ 1 - 1
go.mod

@@ -1,5 +1,5 @@
 module app.yhyue.com/BP/weixin_util
 module app.yhyue.com/BP/weixin_util
 
 
-require app.yhyue.com/BP/common_utils v0.0.0-20200528093434-335d3b55fd71
+require app.yhyue.com/BP/common_utils v0.0.0-20200616090321-01430df94dc1
 
 
 go 1.13
 go 1.13

+ 5 - 1
go.sum

@@ -1,2 +1,6 @@
-app.yhyue.com/BP/common_utils v0.0.0-20200528093434-335d3b55fd71 h1:G5HkQDkgZi06pnxU9av87QmtXIcbhCNlBjgLVHMjW/A=
 app.yhyue.com/BP/common_utils v0.0.0-20200528093434-335d3b55fd71/go.mod h1:+/bZVhDe9fYucfSMOIUgPMymR9M/M8+4t0GIHnaftho=
 app.yhyue.com/BP/common_utils v0.0.0-20200528093434-335d3b55fd71/go.mod h1:+/bZVhDe9fYucfSMOIUgPMymR9M/M8+4t0GIHnaftho=
+app.yhyue.com/BP/common_utils v0.0.0-20200616090321-01430df94dc1 h1:EZzOm+otE/UUP1nEyRAYd4DEvEBc6yglMyyLDb6tn1k=
+app.yhyue.com/BP/common_utils v0.0.0-20200616090321-01430df94dc1/go.mod h1:+/bZVhDe9fYucfSMOIUgPMymR9M/M8+4t0GIHnaftho=
+app.yhyue.com/BP/weixin_util v0.0.0-20200612063718-a014f32b6586/go.mod h1:XZj7ZfSFEqaR5J555x+bi9qrj3DPDRnqspmzm9r8BUk=
+app.yhyue.com/BP/wx_server_demo v0.0.0-20200617083757-0c06cd8f250e h1:jaJ08BfkL2GugxXulLB3pI3a3hnhUBi11xvKMlVdUsc=
+app.yhyue.com/BP/wx_server_demo v0.0.0-20200617083757-0c06cd8f250e/go.mod h1:bgLxPAmetPzY9XmJG5E8bgHz9eY9OloNhTOesMynAlQ=

+ 3 - 1
main.go

@@ -1,6 +1,7 @@
 package main
 package main
 
 
 import (
 import (
+	cu "app.yhyue.com/BP/common_utils"
 	"app.yhyue.com/BP/weixin_util/rpc"
 	"app.yhyue.com/BP/weixin_util/rpc"
 	"app.yhyue.com/BP/weixin_util/weixin"
 	"app.yhyue.com/BP/weixin_util/weixin"
 	"log"
 	"log"
@@ -8,7 +9,7 @@ import (
 )
 )
 
 
 func init() {
 func init() {
-	weixin.ReadConfig("./wxCfg.json", &weixin.WxConfig)
+	cu.ReadConfig("./wxCfg.json", &weixin.WxConfig)
 	log.Println("WxConfig:", weixin.WxConfig)
 	log.Println("WxConfig:", weixin.WxConfig)
 	weixin.WxMenuRedirectUrl = "http%3A%2F%2F" + weixin.WxConfig.Domain + "%2Fwx%2Fsso%3Fcallback%3Dhttp%3A%2F%2F" + weixin.WxConfig.Domain + "%2F"
 	weixin.WxMenuRedirectUrl = "http%3A%2F%2F" + weixin.WxConfig.Domain + "%2Fwx%2Fsso%3Fcallback%3Dhttp%3A%2F%2F" + weixin.WxConfig.Domain + "%2F"
 }
 }
@@ -19,6 +20,7 @@ func main() {
 	// 如果仅使用接收/回复消息,则可以不填写,使用下面语句
 	// 如果仅使用接收/回复消息,则可以不填写,使用下面语句
 	// mux := New("my-token", "", "")
 	// mux := New("my-token", "", "")
 	weixin.Mux = weixin.New(weixin.WxConfig.Token, weixin.WxConfig.AppId, weixin.WxConfig.Secret)
 	weixin.Mux = weixin.New(weixin.WxConfig.Token, weixin.WxConfig.AppId, weixin.WxConfig.Secret)
+	weixin.Mux.HandleFunc(weixin.MsgTypeEventSubscribe, weixin.SubscribeHandler)
 	/*mux.HandleFunc(weixin.MsgTypeText,MsgTextHandler)
 	/*mux.HandleFunc(weixin.MsgTypeText,MsgTextHandler)
 	mux.HandleFunc(MsgTypeImage, ImageMsgHandler)
 	mux.HandleFunc(MsgTypeImage, ImageMsgHandler)
 	mux.HandleFunc(MsgTypeEventSubscribe, SubscribeHandler)
 	mux.HandleFunc(MsgTypeEventSubscribe, SubscribeHandler)

+ 1 - 11
rpc/rpc.go

@@ -82,16 +82,6 @@ func (wxRPC *WeiXinRpc) SendTplMsg(msgTmpIdKey string, param *NotifyMsg, ret *Re
 }
 }
 
 
 func (wxRPC *WeiXinRpc) CreateMenu(menu *weixin.Menu, ret *Result) (err error) {
 func (wxRPC *WeiXinRpc) CreateMenu(menu *weixin.Menu, ret *Result) (err error) {
-	/*url1 := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + weixin.WxConfig.AppId + "&redirect_uri=http%3A%2F%2F" + weixin.WxConfig.Domain + "%2Fwx%2Fsso%3Fcallback%3Dhttp%3A%2F%2F" + weixin.WxConfig.Domain + "%2Fkjj%2Fbusiness1&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
-	menu := &Menu{make([]MenuButton, 2)}
-	menu.Buttons[0].Name = "业务1"
-	menu.Buttons[0].Type = MenuButtonTypeUrl
-	menu.Buttons[0].Url = url1
-
-	url2 := "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + weixin.WxConfig.AppId + "&redirect_uri=http%3A%2F%2F" + weixin.WxConfig.Domain + "%2Fwx%2Fsso%3Fcallback%3Dhttp%3A%2F%2F" + weixin.WxConfig.Domain + "%2Fkjj%2Fbusiness2&response_type=code&scope=snsapi_base&state=1#wechat_redirect"
-	menu.Buttons[1].Name = "业务2"
-	menu.Buttons[1].Type = MenuButtonTypeUrl
-	menu.Buttons[1].Url = url2*/
 	menu2 := &weixin.Menu{make([]weixin.MenuButton, len(menu.Buttons))}
 	menu2 := &weixin.Menu{make([]weixin.MenuButton, len(menu.Buttons))}
 	if len(menu.Buttons) > 0 {
 	if len(menu.Buttons) > 0 {
 		for index, _menuBtn := range menu.Buttons {
 		for index, _menuBtn := range menu.Buttons {
@@ -104,7 +94,7 @@ func (wxRPC *WeiXinRpc) CreateMenu(menu *weixin.Menu, ret *Result) (err error) {
 			}
 			}
 		}
 		}
 	}
 	}
-	err = weixin.Mux.CreateMenu(menu2)
+	err = wxRPC.wx.CreateMenu(menu2)
 	if err != nil {
 	if err != nil {
 		*ret = "菜单创建失败"
 		*ret = "菜单创建失败"
 		log.Println("菜单创建失败")
 		log.Println("菜单创建失败")

+ 8 - 51
weixin/config.go

@@ -1,19 +1,14 @@
 package weixin
 package weixin
 
 
-import (
-	"encoding/json"
-	"io/ioutil"
-	"os"
-)
-
 type wxCfg struct {
 type wxCfg struct {
-	AppId      string            `json:"app_id"` //微信公众号app_id
-	Secret     string            `json:"secret"` //秘钥
-	Prefix     string            `json:"prefix"` //微信消息通讯前缀
-	Token      string            `json:"token"`
-	Domain     string            `json:"domain"`      //微信应用域名
-	MessageTpl map[string]string `json:"message_tpl"` //消息模板配置
-	RpcPort    string            `json:"rpc_port"`    //RPC端口
+	AppId       string            `json:"app_id"` //微信公众号app_id
+	Secret      string            `json:"secret"` //秘钥
+	Prefix      string            `json:"prefix"` //微信消息通讯前缀
+	Token       string            `json:"token"`
+	Domain      string            `json:"domain"`       //微信应用域名
+	MessageTpl  map[string]string `json:"message_tpl"`  //消息模板配置
+	RpcPort     string            `json:"rpc_port"`     //RPC端口
+	BusinessRpc string            `json:"business_rpc"` //业务端rpc地址
 }
 }
 
 
 const (
 const (
@@ -37,44 +32,6 @@ const (
 	`
 	`
 )
 )
 
 
-func ReadConfig(config ...interface{}) {
-	var r *os.File
-	if len(config) > 1 {
-		filepath, _ := config[0].(string)
-		r, _ = os.Open(filepath)
-		defer r.Close()
-		bs, _ := ioutil.ReadAll(r)
-		json.Unmarshal(bs, config[1])
-	} else {
-		r, _ = os.Open("./config.json")
-		defer r.Close()
-		bs, _ := ioutil.ReadAll(r)
-		json.Unmarshal(bs, config[0])
-	}
-}
-
-//程序修改配置表后,调用写入配置文件
-func WriteSysConfig(config ...interface{}) {
-	var r *os.File
-	var configObj interface{}
-	if len(config) > 1 {
-		filepath, _ := config[0].(string)
-		r, _ = os.OpenFile(filepath, os.O_WRONLY|os.O_TRUNC, 0x644)
-		configObj = config[1]
-	} else {
-		r, _ = os.OpenFile("./config.json", os.O_WRONLY|os.O_TRUNC, 0x644)
-		configObj = config[0]
-	}
-	defer r.Close()
-	if s, ok := configObj.(string); ok {
-		r.Write([]byte(s))
-
-	} else {
-		bs, _ := json.Marshal(configObj)
-		r.Write(bs)
-	}
-}
-
 var WxMenuRedirectUrl string
 var WxMenuRedirectUrl string
 var WxConfig wxCfg
 var WxConfig wxCfg
 var Mux *Weixin
 var Mux *Weixin

+ 27 - 0
weixin/muxEventHandle.go

@@ -1 +1,28 @@
 package weixin
 package weixin
+
+import (
+	"log"
+	"net/rpc"
+)
+
+type WxRpcCallbackEntity struct {
+	w ResponseWriter
+	r *Request
+}
+
+func SubscribeHandler(w ResponseWriter, r *Request) {
+	client, err := rpc.DialHTTP("tcp", WxConfig.BusinessRpc)
+	defer client.Close()
+	if err != nil {
+		log.Println(err.Error())
+		return
+	}
+	var repl string
+	var callBackEntity = &WxRpcCallbackEntity{
+		w: w,
+		r: r,
+	}
+	err = client.Call("BusinessRpc.SubscribeCallback", callBackEntity, &repl)
+	log.Println("业务rpc调用错误信息:", err)
+	log.Println("业务rpc调用返回值:", repl)
+}

+ 20 - 2
weixin/weixin.go

@@ -275,7 +275,7 @@ type TmplMsg struct {
 // nolint
 // nolint
 type ResponseWriter interface {
 type ResponseWriter interface {
 	// Get weixin
 	// Get weixin
-	GetWeixin() *Weixin
+	GetWeiXin() *Weixin
 	GetUserData() interface{}
 	GetUserData() interface{}
 	// Reply message
 	// Reply message
 	replyMsg(msg string)
 	replyMsg(msg string)
@@ -300,6 +300,7 @@ type ResponseWriter interface {
 	DownloadMediaToFile(mediaId string, filepath string) error
 	DownloadMediaToFile(mediaId string, filepath string) error
 	UploadMedia(mediaType string, filename string, reader io.Reader) (string, error)
 	UploadMedia(mediaType string, filename string, reader io.Reader) (string, error)
 	DownloadMedia(mediaId string, writer io.Writer) error
 	DownloadMedia(mediaId string, writer io.Writer) error
+	GetUserBaseInfo(openid string) (map[string]interface{}, error)
 }
 }
 
 
 type responseWriter struct {
 type responseWriter struct {
@@ -1187,7 +1188,7 @@ func (w responseWriter) replyHeader() string {
 }
 }
 
 
 // Return weixin instance.
 // Return weixin instance.
-func (w responseWriter) GetWeixin() *Weixin {
+func (w responseWriter) GetWeiXin() *Weixin {
 	return w.wx
 	return w.wx
 }
 }
 
 
@@ -1301,6 +1302,23 @@ func (w responseWriter) UploadMedia(mediaType string, filename string, reader io
 func (w responseWriter) DownloadMedia(mediaID string, writer io.Writer) error {
 func (w responseWriter) DownloadMedia(mediaID string, writer io.Writer) error {
 	return w.wx.DownloadMedia(mediaID, writer)
 	return w.wx.DownloadMedia(mediaID, writer)
 }
 }
+func (rw responseWriter) GetUserBaseInfo(openid string) (map[string]interface{}, error) {
+	return rw.wx.GetUserBaseInfo(openid)
+}
+
+//取得用户(关注人)基本信息
+func (w *Weixin) GetUserBaseInfo(openid string) (map[string]interface{}, error) {
+	bs, err := sendGetRequest(weixinUserInfo+"?openid="+openid+"&lang=zh_CN&access_token=", w.tokenChan)
+	if err == nil {
+		//log.Println("get userinfo ", string(bs))
+		ret := map[string]interface{}{}
+		err = json.Unmarshal(bs, &ret)
+		return ret, err
+	} else {
+		log.Println("get userinfo err ", err.Error())
+		return nil, err
+	}
+}
 
 
 /*************************************
 /*************************************
 			以下为自定义扩展
 			以下为自定义扩展

+ 2 - 1
wxCfg.json

@@ -7,5 +7,6 @@
   "rpc_port": "8083",
   "rpc_port": "8083",
   "message_tpl": {
   "message_tpl": {
     "entService": "euAy8tu2RhgFm-xdA3MTKge5gxQsr0aVQgkYt48ny9E"
     "entService": "euAy8tu2RhgFm-xdA3MTKge5gxQsr0aVQgkYt48ny9E"
-  }
+  },
+  "business_rpc": "127.0.0.1:8084"
 }
 }