scrm-go

open_wechat_job.go 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package jobcron
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "time"
  6. "github.com/silenceper/wechat/util"
  7. "SCRM/service"
  8. "SCRM/service/wechat_service"
  9. "SCRM/utils"
  10. "github.com/astaxie/beego"
  11. "github.com/robfig/cron"
  12. )
  13. var openWechatCron *cron.Cron
  14. func init() {
  15. openWechatCron = cron.New()
  16. openWechatCron.AddFunc("@every 1h30m", func() {
  17. go func() {
  18. RequestComponentAccessToken()
  19. }()
  20. })
  21. openWechatCron.AddFunc("@every 1h30m", func() {
  22. go func() {
  23. RequestMpWechatAccessToken()
  24. }()
  25. })
  26. }
  27. func StartOpenWechatCron() {
  28. openWechatCron.Start()
  29. }
  30. var (
  31. token = beego.AppConfig.String("openwechattoken")
  32. appID = beego.AppConfig.String("openwechatappid")
  33. encodingAESKey = beego.AppConfig.String("openwechatencodingaeskey")
  34. appSecret = beego.AppConfig.String("openwechatsecret")
  35. )
  36. type ReqComponentAccessStruct struct {
  37. ComponentAppid string `json:"component_appid"`
  38. ComponentAppSecret string `json:"component_appsecret"`
  39. ComponentVerifyTicket string `json:"component_verify_ticket"`
  40. }
  41. //请求第三方平台的accessToken
  42. func RequestComponentAccessToken() {
  43. utils.InfoLog("Request ComponentAccessToken Start...")
  44. redisClient := service.RedisClient()
  45. defer redisClient.Close()
  46. componentVerifyTicket, err := redisClient.Get("sgj_patient:ComponentVerifyTicket").Result()
  47. if err != nil {
  48. utils.ErrorLog("读取ComponentVerifyTicket失败:%s", err)
  49. return
  50. }
  51. //假设 拿到了 component_verify_ticket ,开始通过接口 拿 component_access_token
  52. //获取第三方平台component_access_token,POST数据
  53. var ReqComponentAccess ReqComponentAccessStruct
  54. ReqComponentAccess.ComponentAppid = appID
  55. ReqComponentAccess.ComponentAppSecret = appSecret
  56. ReqComponentAccess.ComponentVerifyTicket = componentVerifyTicket
  57. fmt.Println(ReqComponentAccess)
  58. //创建请求
  59. uri := fmt.Sprintf("%s", "https://api.weixin.qq.com/cgi-bin/component/api_component_token")
  60. var responseBytes []byte
  61. responseBytes, err = util.PostJSON(uri, ReqComponentAccess)
  62. if err != nil {
  63. utils.ErrorLog("创建请求失败:%s", err)
  64. return
  65. }
  66. var res wechat_service.MPResult
  67. err = json.Unmarshal(responseBytes, &res)
  68. if err != nil {
  69. utils.ErrorLog("MPResult error:%s", err)
  70. return
  71. }
  72. if res.ErrCode > 0 {
  73. fmt.Println(res.ErrMsg)
  74. return
  75. }
  76. //body 是上面请求返回的json数据
  77. //{"component_access_token":"61W3mEpU66027wgNZ_MhGHNQDHnFATkDa9-2llqrMBjUwxRSNPbVsMmyD-yq8wZETSoE5NQgecigDrSHkPtIYA", "expires_in":7200}
  78. var access_token wechat_service.ComponentAccessToken
  79. // 将body的json解析成 access_token ComponentAccessToken
  80. err = json.Unmarshal(responseBytes, &access_token)
  81. if err != nil {
  82. utils.ErrorLog("Unmarshal json error:%s", err)
  83. return
  84. }
  85. err = redisClient.Set("sgj_patient:component_access_token", access_token.ComponentAccessToken, time.Second*7000).Err()
  86. if err != nil {
  87. utils.ErrorLog("redis set failed:%s", err)
  88. return
  89. }
  90. componentID, err := beego.AppConfig.Int64("openwechatcomponentid")
  91. if err != nil {
  92. utils.ErrorLog("get component id failed: %s", err)
  93. return
  94. }
  95. info := make(map[string]interface{}, 0)
  96. info["ComponentAccessToken"] = access_token.ComponentAccessToken
  97. info["UpdatedTime"] = time.Now().Unix()
  98. info["ComponentStatus"] = 1
  99. err = wechat_service.SaveWechatComponentInfoByMap(componentID, info)
  100. utils.InfoLog("Request ComponentAccessToken Finish.")
  101. }
  102. type ReqRefreshTokenStruct struct {
  103. ComponentAppid string `json:"component_appid"`
  104. AuthorizerAppid string `json:"authorizer_appid"`
  105. AuthorizerRefreshToken string `json:"authorizer_refresh_token"`
  106. }
  107. func RequestMpWechatAccessToken() {
  108. utils.InfoLog("Request MpWechatAccessToken start...")
  109. mps, err := wechat_service.GetAuthorizations()
  110. if err != nil {
  111. utils.ErrorLog("get mps error: %s", err)
  112. return
  113. }
  114. redisClient := service.RedisClient()
  115. defer redisClient.Close()
  116. componentAccessToken, err := redisClient.Get("sgj_patient:component_access_token").Result()
  117. if err != nil {
  118. utils.ErrorLog("get component_access_token error: %s", err)
  119. return
  120. }
  121. for _, item := range mps {
  122. var ReqRefreshToken ReqRefreshTokenStruct
  123. ReqRefreshToken.ComponentAppid = appID
  124. ReqRefreshToken.AuthorizerAppid = item.AuthorizerAppid
  125. ReqRefreshToken.AuthorizerRefreshToken = item.AuthorizerRefreshToken
  126. uri := fmt.Sprintf("%s?component_access_token=%s", "https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token", componentAccessToken)
  127. var responseBytes []byte
  128. responseBytes, err = util.PostJSON(uri, ReqRefreshToken)
  129. if err != nil {
  130. utils.ErrorLog("error: %s", err)
  131. continue
  132. }
  133. var res wechat_service.MPResult
  134. err = json.Unmarshal(responseBytes, &res)
  135. if err != nil {
  136. utils.ErrorLog("%s, error: %s", item.AuthorizerAppid, err)
  137. continue
  138. }
  139. if res.ErrCode > 0 {
  140. utils.ErrorLog("%s, error: %s", item.AuthorizerAppid, res.ErrMsg)
  141. continue
  142. }
  143. var accessToken wechat_service.RefreshToken
  144. err = json.Unmarshal(responseBytes, &accessToken)
  145. if err != nil {
  146. utils.ErrorLog("%s, Unmarshal error: %s", item.AuthorizerAppid, err)
  147. continue
  148. }
  149. info := *item
  150. info.AuthorizerAccessToken = accessToken.AuthorizerAccessToken
  151. info.AuthorizerRefreshToken = accessToken.AuthorizerRefreshToken
  152. info.UpdatedTime = time.Now().Unix()
  153. err = wechat_service.SaveAuthorizationInfo(&info)
  154. if err != nil {
  155. utils.ErrorLog("%s,Save error: %s", item.AuthorizerAppid, err)
  156. continue
  157. }
  158. atKey := fmt.Sprintf("Patient:AccessToken[%s]", item.AuthorizerAppid)
  159. _, err = redisClient.Set(atKey, accessToken.AuthorizerAccessToken, 0).Result()
  160. if err != nil {
  161. utils.ErrorLog("%s,Save redis error: %s", item.AuthorizerAppid, err)
  162. continue
  163. }
  164. }
  165. utils.InfoLog("Request MpWechatAccessToken END")
  166. }