|
@@ -0,0 +1,87 @@
|
|
|
|
|
+//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
|
|
|
|
|
+}
|