劲创营---任务项目
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

3 недель назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package weapp
  2. import "fmt"
  3. const (
  4. apiLogin = "/sns/jscode2session"
  5. apiGetAccessToken = "/cgi-bin/token"
  6. apiGetPaidUnionID = "/wxa/getpaidunionid"
  7. apiQetticket = "/cgi-bin/ticket/getticket"
  8. )
  9. // LoginResponse 返回给用户的数据
  10. type LoginResponse struct {
  11. CommonError
  12. OpenID string `json:"openid"`
  13. SessionKey string `json:"session_key"`
  14. // 用户在开放平台的唯一标识符
  15. // 只在满足一定条件的情况下返回
  16. UnionID string `json:"unionid"`
  17. }
  18. // Login 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
  19. //
  20. // appID 小程序 appID
  21. // secret 小程序的 app secret
  22. // code 小程序登录时获取的 code
  23. func Login(appID, secret, code string) (*LoginResponse, error) {
  24. api := baseURL + apiLogin
  25. return login(appID, secret, code, api)
  26. }
  27. func login(appID, secret, code, api string) (*LoginResponse, error) {
  28. queries := requestQueries{
  29. "appid": appID,
  30. "secret": secret,
  31. "js_code": code,
  32. "grant_type": "authorization_code",
  33. }
  34. url, err := encodeURL(api, queries)
  35. if err != nil {
  36. return nil, err
  37. }
  38. res := new(LoginResponse)
  39. if err := getJSON(url, res); err != nil {
  40. return nil, err
  41. }
  42. return res, nil
  43. }
  44. // TokenResponse 获取 access_token 成功返回数据
  45. type TokenResponse struct {
  46. CommonError
  47. AccessToken string `json:"access_token"` // 获取到的凭证
  48. ExpiresIn uint `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值。
  49. }
  50. // GetAccessToken 获取小程序全局唯一后台接口调用凭据(access_token)。
  51. // 调调用绝大多数后台接口时都需使用 access_token,开发者需要进行妥善保存,注意缓存。
  52. func GetAccessToken(appID, secret string) (*TokenResponse, error) {
  53. api := baseURL + apiGetAccessToken
  54. return getAccessToken(appID, secret, api)
  55. }
  56. func getAccessToken(appID, secret, api string) (*TokenResponse, error) {
  57. queries := requestQueries{
  58. "appid": appID,
  59. "secret": secret,
  60. "grant_type": "client_credential",
  61. }
  62. url, err := encodeURL(api, queries)
  63. if err != nil {
  64. return nil, err
  65. }
  66. res := new(TokenResponse)
  67. if err := getJSON(url, res); err != nil {
  68. return nil, err
  69. }
  70. return res, nil
  71. }
  72. // TicketResponse 获取 Ticket 成功返回数据
  73. type TicketResponse struct {
  74. CommonError
  75. ExpiresIn uint `json:"expires_in"` // 凭证有效时间,单位:秒。目前是7200秒之内的值。
  76. Errcode int `json:"errcode"`
  77. Ticket string `json:"ticket"`
  78. }
  79. func Getticket(appID, access_token string) (*TicketResponse, error) {
  80. api := baseURL + apiQetticket
  81. return getticket(appID, access_token, api)
  82. }
  83. func getticket(appID, access_token, api string) (*TicketResponse, error) {
  84. queries := requestQueries{
  85. "access_token": access_token,
  86. "type": "jsapi",
  87. }
  88. url, err := encodeURL(api, queries)
  89. if err != nil {
  90. return nil, err
  91. }
  92. res := new(TicketResponse)
  93. fmt.Println(res, "res")
  94. fmt.Println(access_token, "access_token")
  95. if err := getJSON(url, res); err != nil {
  96. return nil, err
  97. }
  98. return res, nil
  99. }
  100. // GetPaidUnionIDResponse response data
  101. type GetPaidUnionIDResponse struct {
  102. CommonError
  103. UnionID string `json:"unionid"`
  104. }
  105. // GetPaidUnionID 用户支付完成后,通过微信支付订单号(transaction_id)获取该用户的 UnionId,
  106. func GetPaidUnionID(accessToken, openID, transactionID string) (*GetPaidUnionIDResponse, error) {
  107. api := baseURL + apiGetPaidUnionID
  108. return getPaidUnionID(accessToken, openID, transactionID, api)
  109. }
  110. func getPaidUnionID(accessToken, openID, transactionID, api string) (*GetPaidUnionIDResponse, error) {
  111. queries := requestQueries{
  112. "openid": openID,
  113. "access_token": accessToken,
  114. "transaction_id": transactionID,
  115. }
  116. return getPaidUnionIDRequest(api, queries)
  117. }
  118. // GetPaidUnionIDWithMCH 用户支付完成后,通过微信支付商户订单号和微信支付商户号(out_trade_no 及 mch_id)获取该用户的 UnionId,
  119. func GetPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID string) (*GetPaidUnionIDResponse, error) {
  120. api := baseURL + apiGetPaidUnionID
  121. return getPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID, api)
  122. }
  123. func getPaidUnionIDWithMCH(accessToken, openID, outTradeNo, mchID, api string) (*GetPaidUnionIDResponse, error) {
  124. queries := requestQueries{
  125. "openid": openID,
  126. "mch_id": mchID,
  127. "out_trade_no": outTradeNo,
  128. "access_token": accessToken,
  129. }
  130. return getPaidUnionIDRequest(api, queries)
  131. }
  132. func getPaidUnionIDRequest(api string, queries requestQueries) (*GetPaidUnionIDResponse, error) {
  133. url, err := encodeURL(api, queries)
  134. if err != nil {
  135. return nil, err
  136. }
  137. res := new(GetPaidUnionIDResponse)
  138. if err := getJSON(url, res); err != nil {
  139. return nil, err
  140. }
  141. return res, nil
  142. }