wechat.go 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package utils
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "net/http"
  8. "github.com/astaxie/beego"
  9. "github.com/zjxpcyc/request"
  10. )
  11. type WxResult struct {
  12. Code int
  13. Message string
  14. Result interface{}
  15. }
  16. var wechatInited = false
  17. // WechatInit 微信初始化
  18. func WechatInit() error {
  19. if wechatInited {
  20. return nil
  21. }
  22. wxconf, err := beego.AppConfig.GetSection("wechat")
  23. if err != nil {
  24. beego.Error("获取微信配置失败: ", err.Error())
  25. return err
  26. }
  27. config := request.NewConfig(wxconf["service"] + "wx/register")
  28. config.AddParam("appid", wxconf["appid"])
  29. config.AddParam("secret", wxconf["secret"])
  30. config.AddParam("token", wxconf["token"])
  31. config.AddParam("aeskey", wxconf["aeskey"])
  32. config.Method = http.MethodPost
  33. _, err = Request(config)
  34. if err == nil {
  35. wechatInited = true
  36. }
  37. return err
  38. }
  39. // GetUserInfo 获取个人信息
  40. func GetUserInfo(code string) (interface{}, error) {
  41. wxconf, err := beego.AppConfig.GetSection("wechat")
  42. if err != nil {
  43. beego.Error("获取微信配置失败: ", err.Error())
  44. return nil, err
  45. }
  46. config := request.NewConfig(wxconf["service"] + "wx/userinfo")
  47. config.AddParam("appid", wxconf["appid"])
  48. config.AddParam("code", code)
  49. config.Method = http.MethodGet
  50. return Request(config)
  51. }
  52. // GetJSTicket 获取分享 ticket
  53. func GetJSTicket(link string) (interface{}, error) {
  54. wxconf, err := beego.AppConfig.GetSection("wechat")
  55. if err != nil {
  56. beego.Error("获取微信配置失败: ", err.Error())
  57. return nil, err
  58. }
  59. config := request.NewConfig(wxconf["service"] + "wx/jssdk")
  60. config.AddParam("appid", wxconf["appid"])
  61. config.AddParam("url", link)
  62. config.Method = http.MethodGet
  63. return Request(config)
  64. }
  65. func Request(config *request.Config) (interface{}, error) {
  66. body, _, err := request.Do(config)
  67. if err != nil {
  68. beego.Error("请求微信服务失败: ", err.Error())
  69. return nil, err
  70. }
  71. res, err := getResult(body)
  72. if err != nil {
  73. return nil, err
  74. }
  75. if res.Code != http.StatusOK {
  76. return nil, fmt.Errorf("请求微信服务失败: %s", res.Message)
  77. }
  78. return res.Result.(interface{}), nil
  79. }
  80. func getResult(body io.ReadCloser) (*WxResult, error) {
  81. defer body.Close()
  82. bs, err := ioutil.ReadAll(body)
  83. if err != nil {
  84. beego.Error("读取微信服务结果失败: ", err.Error())
  85. return nil, err
  86. }
  87. res := WxResult{}
  88. if err := json.Unmarshal(bs, &res); err != nil {
  89. beego.Error("转换微信服务结果失败: ", err.Error())
  90. return nil, err
  91. }
  92. return &res, nil
  93. }