今天一个两年前做的公众号项目 要更改主体,随之而来的是公众号的迁移。 公众号迁移后关注的粉丝也会对应的进行迁移,还会给粉丝发送相关通知。
大体流程如下图
迁移的具体步骤我就不细说了。今天主要说的是 迁移主体后 对应的用户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. 将原帐号粉丝的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万条 你可以看一下你服务器的响应执行速度 适当的调整这个参数