migrate.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. if err != nil {
  56. return
  57. }
  58. return
  59. }
  60. // ListAllChangeOpenIDs 返回所有用户OpenID列表
  61. // fromAppID 为老账号AppID
  62. // openIDs 为老账号的openID
  63. // AccessToken 为新账号的AccessToken
  64. func (user *User) ListAllChangeOpenIDs(fromAppID string, openIDs ...string) (list []ChangeOpenIDResult, err error) {
  65. list = make([]ChangeOpenIDResult, 0)
  66. chunks := util.SliceChunk(openIDs, 100)
  67. for _, chunk := range chunks {
  68. result, err := user.ListChangeOpenIDs(fromAppID, chunk...)
  69. if err != nil {
  70. return list, err
  71. }
  72. list = append(list, result.List...)
  73. }
  74. return
  75. }