zoukankan      html  css  js  c++  java
  • 公众号迁移 原有数据库openid 更新主体openid

      今天一个两年前做的公众号项目 要更改主体,随之而来的是公众号的迁移。 公众号迁移后关注的粉丝也会对应的进行迁移,还会给粉丝发送相关通知。

      大体流程如下图

      迁移的具体步骤我就不细说了。今天主要说的是 迁移主体后 对应的用户openid也会变化,也就是说你的程序如果公众号登录是以微信openid为唯一标识的话,

    那你的用户系统经过一次公众号变更后就会出现问题。 老用户再次授权后 系统可能认为是新用户,而且通过原来的openid 也无法推送模板消息等功能。

      微信方面当然也考虑到了相关问题 。给出了相关的接口去处理这个问题,这就是今天说的openid转换接口  。

      相关内容如下


      

    openid转换接口

    账号迁移后,粉丝的openid会变化,微信用户关注不同的公众号,对应的openid是不一样的,迁移成功后,粉丝的openid以目标帐号(即新公众号)对应的OpenID为准。但开发者可以通过开发接口转换openid,开发文档可以参考:
    提供一个openid转换的API接口,当帐号迁移后,可以通过该接口:
    1. 将原帐号粉丝的openid转换为新帐号的openid。
    2. 将有授权关系用户的openid转换为新帐号的openid。
    3. 将卡券关联用户的openid转换为新帐号的openid。

    ◆ 原帐号:准备要迁移的帐号,当审核完成且管理员确认后即被回收。
    ◆ 新帐号:用来接纳粉丝的帐号。新帐号在整个流程中均能正常使用。

    一定要按照下面的步骤来操作。
    1. 一定要在原帐号被冻结之前,最好是准备提交审核前,获取原帐号的用户列表。如果没有原帐号的用户列表,用不了转换工具。如果原账号被回收,这时候也没办法调用接口获取用户列表。
    如何获取用户列表见这里:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840

    2. 转换openid的API接口如下,可在帐号迁移审核完成后开始调用,并最多保留15天。若帐号迁移没完成,调用时无返回结果或报错。帐号迁移15天后,该转换接口将会失效、无法拉取到数据。
    ◆ URL:http://api.weixin.qq.com/cgi-bin/changeopenid?access_token=xxxxx
    此处token为新帐号的token
    ◆ 请求方式:post
    ◆ 请求数据:
    {
    "from_appid":"xxxxxxxx",//此处为原帐号的appid
    "openid_list":["oEmYbwN-n24jxvk4Sox81qedINkQ","oEmYbwH9uVd4RKJk7ZZg6S
    zL6tTo"]//需要转换的openid,即第1步中拉取的原帐号用户列表,这些必须是旧账号目前关注的才行,否则会出错;一次最多100个,不能多。
    }
    ◆ 输出数据:
    {
    "errcode": 0,
    "errmsg": "ok",
    "result_list": [
    {
    "ori_openid": "oEmYbwN-n24jxvk4Sox81qedINkQ",
    "new_openid": "o2FwqwI9xCsVadFah_HtpPfaR-X4",
    "err_msg": "ok"
    },
    {
    "ori_openid": "oEmYbwH9uVd4RKJk7ZZg6SzL6tTo",
    "err_msg": "ori_openid error"//这个openid目前没有关注旧公众号
    }
    ]
    }
    ◆ 错误码:
    63178:from_appid参数错误,和调用的账号并没有迁移关系
    Ori_openid error:openid目前没有关注旧公众号。或者是将from_appid搞错了,用成了新帐号的appid。
     

     
    其中我认为比较重要的内容标注了颜色 ,希望你要迁移的账号满足他的条件 
    下面是我写到相关实现代码 
     1  public function getOpenId(){
     2         $rows='100';
     3         $page=input('id');
     4         $info=db('users')->paginate($rows,'',['page'=>$page]);
     5         $data= $info->items();
     6         $open_id=array_column($data,'openid');
     7        // dump($open_id);
     8 
     9         $postData['from_appid']='******'; //老的APPID
    10         $postData['openid_list']=$open_id;
    11         $config=[
    12             'app_id'  => '*******',         // 新的AppID
    13             'secret'  => '***********',
    14         ];
    15         $Wechat=new Application($config);//这里用是Easywechat
    16         $Token=$Wechat->access_token;
    17         $token=$Token->getToken();
    18         19         $url='https://api.weixin.qq.com/cgi-bin/changeopenid?access_token='.$token;
    20         //$result=    $this->curlPost($url,json_encode($postData,true),'','','json');
    21         $result=    $this->post_by_curl($url,json_encode($postData,true)); //自己找一个curl方法
    22         $return=json_decode($result,true);
    23         $result=$return['result_list'];
    24 
    25         foreach ($result as $k=>$v){
    26            27             if ($v['err_msg']=='ok'){
    28                 $update['openid']=$v['new_openid'];
    29                 $update['is_update']=1;
    30                 db('users')->where('openid',$v['ori_openid'])->update($update);
    31             }
    32         }
    33     }

         需要注意的是 这个接口一次只能获取100条数据 , 话句话说 你只能一次一百条一百条的更新

                当然 你可以选择用消息队列进行处理这个数据   但是我选择的是比较简单的方法 : 前台页面定时器请求

        下面附上html代码 

        

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <script src="/static/js/jquery.js"></script>
     4 <head>
     5     <meta charset="UTF-8">
     6     <title>Title</title>
     7     <div id="test">1</div>
     8 </head>
     9 <body>
    10         <script>
    11             var i=1;
    12             function  test(){
    13                 var url='http://百度/portal/test/getOpenId/id/'+i
    14                 $.ajax({
    15                     url:url,
    16                     type:'GET',
    17                     success:function (res) {
    18                         $('#test').html(i)
    19                     }
    20                 })
    21                 i++;
    22             }
    23             window.setInterval(test,5000);
    24         </script>
    25 </body>
    26 </html>

      不过这个时间会比较长

      

        我写完博客才更改了4万条 你可以看一下你服务器的响应执行速度  适当的调整这个参数 

  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/sgj123/p/13307665.html
Copyright © 2011-2022 走看看