| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- //Package user migrate 用于微信公众号账号迁移,获取openID变化
- //参考文档:https://kf.qq.com/faq/1901177NrqMr190117nqYJze.html
- package user
- import (
- "errors"
- "fmt"
- "github.com/silenceper/wechat/v2/util"
- )
- const (
- changeOpenIDURL = "https://api.weixin.qq.com/cgi-bin/changeopenid"
- )
- // ChangeOpenIDResult OpenID迁移变化
- type ChangeOpenIDResult struct {
- OriOpenID string `json:"ori_openid"`
- NewOpenID string `json:"new_openid"`
- ErrMsg string `json:"err_msg,omitempty"`
- }
- // ChangeOpenIDResultList OpenID迁移变化列表
- type ChangeOpenIDResultList struct {
- util.CommonError
- List []ChangeOpenIDResult `json:"result_list"`
- }
- // ListChangeOpenIDs 返回指定OpenID变化列表
- // fromAppID 为老账号AppID
- // openIDs 为老账号的openID,openIDs限100个以内
- // AccessToken 为新账号的AccessToken
- func (user *User) ListChangeOpenIDs(fromAppID string, openIDs ...string) (list *ChangeOpenIDResultList, err error) {
- list = &ChangeOpenIDResultList{}
- //list.List = make([]ChangeOpenIDResult, 0)
- if len(openIDs) > 100 {
- err = errors.New("openIDs length must be lt 100")
- return
- }
- if fromAppID == "" {
- err = errors.New("fromAppID is required")
- return
- }
- accessToken, err := user.GetAccessToken()
- if err != nil {
- return
- }
- uri := fmt.Sprintf("%s?access_token=%s", changeOpenIDURL, accessToken)
- var resp []byte
- var req struct {
- FromAppID string `json:"from_appid"`
- OpenidList []string `json:"openid_list"`
- }
- req.FromAppID = fromAppID
- req.OpenidList = append(req.OpenidList, openIDs...)
- resp, err = util.PostJSON(uri, req)
- if err != nil {
- return
- }
- err = util.DecodeWithError(resp, list, "ListChangeOpenIDs")
- if err != nil {
- return
- }
- return
- }
- // ListAllChangeOpenIDs 返回所有用户OpenID列表
- // fromAppID 为老账号AppID
- // openIDs 为老账号的openID
- // AccessToken 为新账号的AccessToken
- func (user *User) ListAllChangeOpenIDs(fromAppID string, openIDs ...string) (list []ChangeOpenIDResult, err error) {
- list = make([]ChangeOpenIDResult, 0)
- chunks := util.SliceChunk(openIDs, 100)
- for _, chunk := range chunks {
- result, err := user.ListChangeOpenIDs(fromAppID, chunk...)
- if err != nil {
- return list, err
- }
- list = append(list, result.List...)
- }
- return
- }
|