wanghuidong %!s(int64=5) %!d(string=hai) anos
pai
achega
b9ea1820ce
Modificáronse 8 ficheiros con 67 adicións e 68 borrados
  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
 
-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

+ 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-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
 
 import (
+	cu "app.yhyue.com/BP/common_utils"
 	"app.yhyue.com/BP/weixin_util/rpc"
 	"app.yhyue.com/BP/weixin_util/weixin"
 	"log"
@@ -8,7 +9,7 @@ import (
 )
 
 func init() {
-	weixin.ReadConfig("./wxCfg.json", &weixin.WxConfig)
+	cu.ReadConfig("./wxCfg.json", &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"
 }
@@ -19,6 +20,7 @@ func main() {
 	// 如果仅使用接收/回复消息,则可以不填写,使用下面语句
 	// mux := New("my-token", "", "")
 	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(MsgTypeImage, ImageMsgHandler)
 	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) {
-	/*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))}
 	if len(menu.Buttons) > 0 {
 		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 {
 		*ret = "菜单创建失败"
 		log.Println("菜单创建失败")

+ 8 - 51
weixin/config.go

@@ -1,19 +1,14 @@
 package weixin
 
-import (
-	"encoding/json"
-	"io/ioutil"
-	"os"
-)
-
 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 (
@@ -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 WxConfig wxCfg
 var Mux *Weixin

+ 27 - 0
weixin/muxEventHandle.go

@@ -1 +1,28 @@
 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
 type ResponseWriter interface {
 	// Get weixin
-	GetWeixin() *Weixin
+	GetWeiXin() *Weixin
 	GetUserData() interface{}
 	// Reply message
 	replyMsg(msg string)
@@ -300,6 +300,7 @@ type ResponseWriter interface {
 	DownloadMediaToFile(mediaId string, filepath string) error
 	UploadMedia(mediaType string, filename string, reader io.Reader) (string, error)
 	DownloadMedia(mediaId string, writer io.Writer) error
+	GetUserBaseInfo(openid string) (map[string]interface{}, error)
 }
 
 type responseWriter struct {
@@ -1187,7 +1188,7 @@ func (w responseWriter) replyHeader() string {
 }
 
 // Return weixin instance.
-func (w responseWriter) GetWeixin() *Weixin {
+func (w responseWriter) GetWeiXin() *Weixin {
 	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 {
 	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",
   "message_tpl": {
     "entService": "euAy8tu2RhgFm-xdA3MTKge5gxQsr0aVQgkYt48ny9E"
-  }
+  },
+  "business_rpc": "127.0.0.1:8084"
 }