You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.7KB

  1. package main
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "io/ioutil"
  7. "log"
  8. "net/http"
  9. "time"
  10. )
  11. func onSubscribe(in InWechatMsg) {
  12. openID := in.header.FromUserName
  13. //check whether we have his own record in the CRM system
  14. info, found, err := crmFindOpenID(openID)
  15. if err != nil {
  16. log.Println(err)
  17. return
  18. }
  19. //existing user
  20. if found {
  21. sendGreeting4ExistingUser(in, info)
  22. } else { //new user
  23. //get user info from wechat
  24. info := WechatUserInfo{}
  25. info.getUserInfo(openID, "zh_CN")
  26. info.registerNewLeadWithInfo(in)
  27. in.askUserFillupBasicInfo()
  28. }
  29. //some error happened
  30. }
  31. //WechatUserInfo response for wechat user info.
  32. type WechatUserInfo struct {
  33. Subscribe int32 `json:"subscribe"`
  34. OpenID string `json:"openid"`
  35. NickName string `json:"nickname"`
  36. Sex int32 `json:"sex"` //0 未知 1 男 2 女
  37. Language string `json:"language"`
  38. City string `json:"city"`
  39. Province string `json:"province"`
  40. Country string `json:"country"`
  41. Avatar string `json:"headimgurl"`
  42. SubscribeTime int32 `json:"subscribe_time"`
  43. UnionID string `json:"unionid"`
  44. Remark string `json:"remark"`
  45. GroupID int32 `json:"groupid"`
  46. TagIDList []int32 `json:"tagid_list"`
  47. }
  48. func (m *WechatUserInfo) getUserInfo(openID string, lang string) (err error) {
  49. url := m.getURL(openID, lang)
  50. resp, err := http.Get(url)
  51. if err != nil {
  52. *m = WechatUserInfo{}
  53. return err
  54. }
  55. b, err := ioutil.ReadAll(resp.Body)
  56. err = json.Unmarshal(b, m)
  57. return nil
  58. }
  59. //lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
  60. func (m *WechatUserInfo) getURL(openID, lang string) string {
  61. if lang != "zh_CN" && lang != "zh_TW" && lang != "en" {
  62. log.Printf("WechatUserInfo/getURL: Unknow Lang %s, change to zh_CN", lang)
  63. lang = "zh_CN"
  64. }
  65. atk, _ := GetAccessToken()
  66. u := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=%s", atk, openID, lang)
  67. return u
  68. }
  69. func (m *WechatUserInfo) save2CRM() {
  70. }
  71. func (in *InWechatMsg) askUserFillupBasicInfo() {
  72. first := "欢迎加入海外学子之家,这里凝聚着哈工大人在澳洲的,勤奋,努力和奋斗"
  73. url := "http://wechat.hitxy.org.au/profile_newly_register"
  74. remark := "您是首次加入本社区,请点击详情完善您的个人资料"
  75. communityName := "哈工大澳洲校友会"
  76. joinDate := time.Now().Format("2006-Jan-02")
  77. templateSendJoinCommunity(in.header.FromUserName, url, first, remark, communityName, joinDate)
  78. }
  79. func sendGreeting4ExistingUser(in InWechatMsg, info crmdLead) {
  80. first := "欢迎" + info.Name + "返回澳洲校友会"
  81. //url := "http://wechat.hitxy.org.au/profile_newly_register"
  82. url := "http://192.168.1.39:4200/profile_newly_register"
  83. remark := ""
  84. communityName := "哈工大澳洲校友会"
  85. joinDate := info.getCreatedAt().Format("2006-Jan-02")
  86. templateSendJoinCommunity(in.header.FromUserName, url, first, remark, communityName, joinDate)
  87. }
  88. func (m *WechatUserInfo) registerNewLeadWithInfo(in InWechatMsg) (newuser crmdLead, err error) {
  89. if in.header.FromUserName == "" {
  90. log.Println("Error: trying to register user without OpenID")
  91. err = errors.New("registerNewLeadWithInfo: no user OpenID")
  92. return
  93. }
  94. u := crmdLead{}
  95. u.FirstName = "\u0020" //a visible space
  96. if m.NickName == "" {
  97. u.LastName = time.Now().Format(getCrmTimeLayout())
  98. } else {
  99. u.LastName = m.NickName
  100. }
  101. u.Password = "password"
  102. u.WechatHitxyID = in.header.FromUserName
  103. u.Status = "New"
  104. data, _ := json.Marshal(u)
  105. entity, err := crmCreateEntity("Lead", data)
  106. if err == nil {
  107. newuser = entity.(crmdLead)
  108. }
  109. return
  110. }
  111. //when user left
  112. func onUnSubscribe(in InWechatMsg) {
  113. //TODO: record unSubscribe
  114. }