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.

103 lines
3.4 KiB

  1. package utils
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "github.com/songzhibin97/gkit/tools/gjson"
  7. )
  8. const ()
  9. /*
  10. 发送微信消息结构体定义
  11. */
  12. type Val struct {
  13. Value interface{} `json:"value"`
  14. }
  15. type ValColor struct {
  16. Value interface{} `json:"value"`
  17. Color string `json:"color,omitempty"` //字体颜色
  18. }
  19. type TPL struct {
  20. Touser string `json:"touser"` //微信用户ID
  21. TemplateId string `json:"template_id"` //微信公众号模板消息ID
  22. Url string `json:"url,omitempty"` //会从微信跳转到该URL页面
  23. Data gin.H `json:"data"` //微信消息模板中参数内容
  24. }
  25. var (
  26. /** 微信接口URL **/
  27. //获取Access token
  28. WechatAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%v&secret=%v"
  29. //发送模板消息
  30. WechatTplSendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=%v"
  31. //获取微信用户基本信息
  32. WeChatUserInfoUrl = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%v&openid=%v&lang=zh_CN"
  33. //微信二维码请求
  34. WechatQrcodeCreateUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=%v"
  35. //创建二维码参数设置
  36. WechatQrcodeCreatePostParameter = `{"expire_seconds": %v, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": %v}}}`
  37. //二维码图片地址
  38. WechatQrcodeImg = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%v"
  39. /** 微信公众号模版ID **/
  40. //账号登陆成功通知
  41. WechatTplID_100 = "5qm_kPSs7JyYSgjd3kIBH2tLpVm3R8zbu0fFrOPDyrw"
  42. //用户登录提醒
  43. WechatTplID_200 = "9rKojfQ8P8-BKAqiO4wa6k9KkI20TC94A3Sx1jzKAi4"
  44. //登陆提醒
  45. WechatTplID_300 = "3x9HB1IowrdgOFS4vJcvb2p11MZB0QZTSRoferYWsO0"
  46. )
  47. ////本地计算签名 signature
  48. //func MakeSignature(timestamp, nonce string) string {
  49. // si := []string{token, timestamp, nonce}
  50. // sort.Strings(si) //字典序排序
  51. // str := strings.Join(si, "") //组合字符串
  52. // s := sha1.New() //返回一个新的使用SHA1校验的hash.Hash接口
  53. // io.WriteString(s, str) //WriteString函数将字符串数组str中的内容写入到s中
  54. // return fmt.Sprintf("%x", s.Sum(nil))
  55. //}
  56. var (
  57. AppID = "wx53b33076923e4e7f"
  58. AppSecret = "768efa1f3f8d9d42061d8af1cd3ea936"
  59. )
  60. //获取微信公众号的access_token
  61. func GetAccessToken() (access_token string, error error) {
  62. accessTokenUrl := fmt.Sprintf(WechatAccessTokenUrl, AppID, AppSecret)
  63. returnAccessTokenData, err := Get(accessTokenUrl)
  64. if err != nil {
  65. //请求微信相关接口网络连接出错
  66. return "", errors.New("请求微信相关接口网络连接出错" + fmt.Sprintf("%v", err))
  67. }
  68. access_token = gjson.GetBytes(returnAccessTokenData, "access_token").String()
  69. if len(access_token) == 0 {
  70. //微信接口返回的错误json信息 string(returnData)
  71. return "", errors.New(string(returnAccessTokenData))
  72. }
  73. return access_token, nil
  74. }
  75. func GetKenAndOpenid(code string) (session_key, openid string, err error) {
  76. url := fmt.Sprintf(`https://api.weixin.qq.com/sns/jscode2session?appid=%v&secret=%v&js_code=%v&grant_type=authorization_code`, AppID, AppSecret, code)
  77. res, err := Get(url)
  78. if err != nil {
  79. //请求微信相关接口网络连接出错
  80. return
  81. }
  82. fmt.Println("获取用户openid,和解密私钥session_key", string((res)))
  83. session_key = gjson.GetBytes(res, "session_key").String()
  84. openid = gjson.GetBytes(res, "openid").String()
  85. return
  86. }