1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package mp
  2. import (
  3. "crypto/sha1"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "net/url"
  8. "strconv"
  9. "time"
  10. wxerr "gitee.com/yansen_zh/wxcomponent/errors"
  11. "gitee.com/yansen_zh/wxcomponent/utils"
  12. "gitee.com/yansen_zh/wxcomponent/utils/request"
  13. )
  14. // JsapiTicketResult 通过 access_token 获取 jsapi_ticket 结果
  15. type JsapiTicketResult struct {
  16. wxerr.Error
  17. Ticket string `json:"ticket"`
  18. ExpiresIn int `json:"expires_in"`
  19. }
  20. // JsapiSignature 可以用来初始化 JS SDK
  21. type JsapiSignature struct {
  22. Timestamp int64 `json:"timestamp"`
  23. NonceStr string `json:"nonceStr"`
  24. Signature string `json:"signature"`
  25. }
  26. const (
  27. apiGetJSTicket = "https://api.weixin.qq.com/cgi-bin/ticket/getticket"
  28. )
  29. // GetJSTicket 通过 access_token 获取 jsapi_ticket
  30. func GetJSTicket(authorizerToken string) (*JsapiTicketResult, error) {
  31. if authorizerToken == "" {
  32. return nil, errors.New("获取 jsapi_ticket authorizerToken 不能为空")
  33. }
  34. param := url.Values{}
  35. param.Set("access_token", authorizerToken)
  36. param.Set("type", "jsapi")
  37. resp, e2 := request.GetJSON(apiGetJSTicket, &param)
  38. if e2 != nil {
  39. return nil, e2
  40. }
  41. result := JsapiTicketResult{}
  42. if err := json.Unmarshal(resp, &result); err != nil {
  43. return nil, err
  44. }
  45. return &result, nil
  46. }
  47. // GetJSAPISignature 获取 JsapiSignature
  48. func GetJSAPISignature(ticket, url string) *JsapiSignature {
  49. timestamp := time.Now().Unix()
  50. timestampStr := strconv.FormatInt(timestamp, 10)
  51. nonceStr := utils.RandStr(16)
  52. s1 := "jsapi_ticket=" + ticket
  53. s2 := "&noncestr=" + nonceStr
  54. s3 := "&timestamp=" + timestampStr
  55. s4 := "&url=" + url
  56. plain := s1 + s2 + s3 + s4
  57. signature := fmt.Sprintf("%x", sha1.Sum([]byte(plain)))
  58. return &JsapiSignature{
  59. Timestamp: timestamp,
  60. NonceStr: nonceStr,
  61. Signature: signature,
  62. }
  63. }