migrate.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Package user migrate 用于微信公众号账号迁移,获取openID变化
  2. // 参考文档:https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html
  3. package user
  4. import (
  5. "errors"
  6. "fmt"
  7. "github.com/silenceper/wechat/v2/util"
  8. )
  9. const (
  10. changeOpenIDURL = "https://api.weixin.qq.com/cgi-bin/changeopenid"
  11. )
  12. // ChangeOpenIDResult OpenID迁移变化
  13. type ChangeOpenIDResult struct {
  14. OriOpenID string `json:"ori_openid"`
  15. NewOpenID string `json:"new_openid"`
  16. ErrMsg string `json:"err_msg,omitempty"`
  17. }
  18. // ChangeOpenIDResultList OpenID迁移变化列表
  19. type ChangeOpenIDResultList struct {
  20. util.CommonError
  21. List []ChangeOpenIDResult `json:"result_list"`
  22. }
  23. // ListChangeOpenIDs 返回指定OpenID变化列表
  24. // fromAppID 为老账号AppID
  25. // openIDs 为老账号的openID,openIDs限100个以内
  26. // AccessToken 为新账号的AccessToken
  27. func (user *User) ListChangeOpenIDs(fromAppID string, openIDs ...string) (list *ChangeOpenIDResultList, err error) {
  28. list = &ChangeOpenIDResultList{}
  29. // list.List = make([]ChangeOpenIDResult, 0)
  30. if len(openIDs) > 100 {
  31. err = errors.New("openIDs length must be lt 100")
  32. return
  33. }
  34. if fromAppID == "" {
  35. err = errors.New("fromAppID is required")
  36. return
  37. }
  38. accessToken, err := user.GetAccessToken()
  39. if err != nil {
  40. return
  41. }
  42. uri := fmt.Sprintf("%s?access_token=%s", changeOpenIDURL, accessToken)
  43. var resp []byte
  44. var req struct {
  45. FromAppID string `json:"from_appid"`
  46. OpenidList []string `json:"openid_list"`
  47. }
  48. req.FromAppID = fromAppID
  49. req.OpenidList = append(req.OpenidList, openIDs...)
  50. resp, err = util.PostJSON(uri, req)
  51. if err != nil {
  52. return
  53. }
  54. err = util.DecodeWithError(resp, list, "ListChangeOpenIDs")
  55. return
  56. }
  57. // ListAllChangeOpenIDs 返回所有用户OpenID列表
  58. // fromAppID 为老账号AppID
  59. // openIDs 为老账号的openID
  60. // AccessToken 为新账号的AccessToken
  61. func (user *User) ListAllChangeOpenIDs(fromAppID string, openIDs ...string) (list []ChangeOpenIDResult, err error) {
  62. list = make([]ChangeOpenIDResult, 0)
  63. chunks := util.SliceChunk(openIDs, 100)
  64. for _, chunk := range chunks {
  65. result, err := user.ListChangeOpenIDs(fromAppID, chunk...)
  66. if err != nil {
  67. return list, err
  68. }
  69. list = append(list, result.List...)
  70. }
  71. return
  72. }