phone_number.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package business
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/util"
  5. )
  6. const (
  7. getPhoneNumberURL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s"
  8. )
  9. // GetPhoneNumberRequest 获取手机号请求
  10. type GetPhoneNumberRequest struct {
  11. Code string `json:"code"` // 手机号获取凭证
  12. }
  13. // PhoneInfo 手机号信息
  14. type PhoneInfo struct {
  15. PhoneNumber string `json:"phoneNumber"` // 用户绑定的手机号(国外手机号会有区号)
  16. PurePhoneNumber string `json:"purePhoneNumber"` // 没有区号的手机号
  17. CountryCode string `json:"countryCode"` // 区号
  18. Watermark struct {
  19. AppID string `json:"appid"` // 小程序appid
  20. Timestamp int64 `json:"timestamp"` // 用户获取手机号操作的时间戳
  21. } `json:"watermark"`
  22. }
  23. // GetPhoneNumber code换取用户手机号。 每个code只能使用一次,code的有效期为5min
  24. func (business *Business) GetPhoneNumber(in *GetPhoneNumberRequest) (info PhoneInfo, err error) {
  25. accessToken, err := business.GetAccessToken()
  26. if err != nil {
  27. return
  28. }
  29. uri := fmt.Sprintf(getPhoneNumberURL, accessToken)
  30. response, err := util.PostJSON(uri, in)
  31. if err != nil {
  32. return
  33. }
  34. // 使用通用方法返回错误
  35. var resp struct {
  36. util.CommonError
  37. PhoneInfo PhoneInfo `json:"phone_info"`
  38. }
  39. err = util.DecodeWithError(response, &resp, "business.GetPhoneNumber")
  40. if nil != err {
  41. return
  42. }
  43. info = resp.PhoneInfo
  44. return
  45. }