公众号迁移 原有数据库openid 更新主体openid
今天一个两年前做的公众号项目 要更改主体,随之而来的是公众号的迁移。 公众号迁移后关注的粉丝也会对应的进行迁移,还会给粉丝发送相关通知。
大体流程如下图

迁移的具体步骤我就不细说了。今天主要说的是 迁移主体后 对应的用户openid也会变化,也就是说你的程序如果公众号登录是以微信openid为唯一标识的话,
那你的用户系统经过一次公众号变更后就会出现问题。 老用户再次授权后 系统可能认为是新用户,而且通过原来的openid 也无法推送模板消息等功能。
微信方面当然也考虑到了相关问题 。给出了相关的接口去处理这个问题,这就是今天说的openid转换接口 。
相关内容如下
openid转换接口
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。
public function getOpenId(){
$rows='100';
$page=input('id');
$info=\db('users')->paginate($rows,'',['page'=>$page]);
$data= $info->items();
$open_id=array_column($data,'openid');
// dump($open_id);
$postData['from_appid']='******'; //老的APPID
$postData['openid_list']=$open_id;
$config=[
'app_id' => '*******', // 新的AppID
'secret' => '***********',
];
$Wechat=new Application($config);//这里用是Easywechat
$Token=$Wechat->access_token;
$token=$Token->getToken();
$url='https://api.weixin.qq.com/cgi-bin/changeopenid?access_token='.$token;
//$result= $this->curlPost($url,json_encode($postData,true),'','','json');
$result= $this->post_by_curl($url,json_encode($postData,true)); //自己找一个curl方法
$return=json_decode($result,true);
$result=$return['result_list'];
foreach ($result as $k=>$v){
if ($v['err_msg']=='ok'){
$update['openid']=$v['new_openid'];
$update['is_update']=1;
\db('users')->where('openid',$v['ori_openid'])->update($update);
}
}
}
需要注意的是 这个接口一次只能获取100条数据 , 话句话说 你只能一次一百条一百条的更新
当然 你可以选择用消息队列进行处理这个数据 但是我选择的是比较简单的方法 : 前台页面定时器请求
下面附上html代码
<!DOCTYPE html>
<html lang="en">
<script src="/static/js/jquery.js"></script>
<head>
<meta charset="UTF-8">
<title>Title</title>
<div id="test">1</div>
</head>
<body>
<script>
var i=1;
function test(){
var url='http://百度/portal/test/getOpenId/id/'+i
$.ajax({
url:url,
type:'GET',
success:function (res) {
$('#test').html(i)
}
})
i++;
}
window.setInterval(test,5000);
</script>
</body>
</html>
不过这个时间会比较长

我写完博客才更改了4万条 你可以看一下你服务器的响应执行速度 适当的调整这个参数
公众号迁移 原有数据库openid 更新主体openid的更多相关文章
- 用户关注微信公众号后,获取该用户的openID存数据库失败
关注微信公众号后将关注人的openID存入数据库失败,而openID换成字符串写死却可以存入数据库: $wxid=$postObj->FromUserName; $data['wx_openid ...
- Java 微信公众号迁移
背景:公众号换主体,要迁移,粉丝(openId)的业务数据要做处理. 第一步:参照我的另一篇文章,Java 导出微信公众号粉丝. 第二部:数据处理(master-worker模式) 程序主入口:Mai ...
- [特别公告]RDIFramework.NET微信公众号迁移通知
亲爱的伙伴们: 非常感谢您们一直以来对RDIFramework.NET开发框架的关注和支持! 为了进一步完善各项功能,能给大家提供更专业.更官方准确的框架资讯,提供更优质的框架合作服务,我们的微信公众 ...
- 微信公众号授权回调用户信息,获取openid
1.--------------------用户授权登录并获取code 授权登录方式有两个,一种为静默授权登录(scope=snsapi_base),一种为非静默授权登录(scope=snsapi_u ...
- JAVA微信公众号网页开发——通过接收人的openid发送模板消息
TemplateData.java 1 package com.weixin.weixin.template; 2 3 public class TemplateData { 4 private St ...
- 微信公众号开发之获取微信用户的openID
(注:openID同一用户同一应用唯一,UnionID同一用户不同应用唯一.不同应用指微信开放平台下的不同用户.) 1. 申请测试号(获得appID.appsecret) 2. 填写服务器配置并验 ...
- python - django 执行数据库迁移后数据库并未更新 和 InternalError: (1054, u"Unknown column 'xxx' in 'field list'")问题
一.发生情况:当你修改数据库结构后进行 python manage.py makemigrations 和 python manage.py migrate 后发现控制台会给你返回一个下面的结果,但是 ...
- 【微信公众号】将微信公众号消息里的FromUserName即OpenID转成UnionID
最近在调试微信公众号开发者模式,处理公众号消息,收到如下回调消息内容 <xml><ToUserName><![CDATA[gh_29********21]]>< ...
- 微信公众号开发之根据OpenID列表群发(十四)
上一篇我们讲述了<微信公众号开发之根据标签进行群发(十二)>,这次我们讲解一下[根据OpenID列表群发] 根据OpenID列表群发[订阅号不可用,服务号认证后可用] 接口调用请求说明 h ...
随机推荐
- kafka全部数据清空
kafka全部数据清空的步骤为: 停止每台机器上的kafka: 删除kafka存储目录(server.properties文件log.dirs配置,默认为“/tmp/kafka-logs”)全部top ...
- FFT快速傅里叶变换的python实现
FFT是DFT的高效算法,能够将时域信号转化到频域上,下面记录下一段用python实现的FFT代码. # encoding=utf-8 import numpy as np import pylab ...
- MySQL5.7.X 的下载和安装
1 MySQL的下载 这里是mysql5.7.30的版本下载地址 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 根据自己电脑选择合适 ...
- python-判断、循环、列表、字典
一.如何将两个列表合并成一个字典 运用dict(zip()) 例如: usernames = ['xiaohei', 'xiaobai', 'xiaoming'] passwords = ['1234 ...
- 【K8S学习笔记】初识K8S 及架构组件
K8S是什么?发展历史 Kubernetes (简称 k8s)是 Google 在2014年开源的,对容器生命周期管理的开源平台,致力于对容器集群提供易于管理.高可用.弹性负载与故障转移的能力,提高服 ...
- Redis - (Linux)安装与配置
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: 1:Redis支持数据的持久化,可以将内存 ...
- C++ vector迭代器访问二维数组
#include<iostream> #include<vector> int main(){ std::vector<int> arr(); // 创建一维数组 ...
- 二分查找法demo
正文 中午闲着有点时间,做个demo睡觉去,这个例子网上应该都有,自己只是敲一下给自己做个记录. public static void main(String[] args) { int[] whit ...
- List<List<Object>> list = new ArrayList<List<Object>>(); 求回答补充问题 list.get(position).add(Object);为什么会报错啊我想在对应的list里面添加对象
public static void main(String[] args){ List<List<Object>> list = new ArrayList<List& ...
- Python之浅谈面向对象
目录 面向对象和面向过程 面向过程 面向对象 类与对象 定义类 在现实世界中:先有对象,再有类 在程序中,务必保证:先定义(类),后使用(产生对象) 产生对象 类 对象 产生对象 属性查找顺序 对象赋 ...