1. 云期刊首页
  2. 微擎教程

微擎重新绑定微信公众号后进行粉丝迁移,保证系统设置和客户资料,余额等信息不变的方法

微擎用户都会遇到重新绑定微信公众号后,原来粉丝的邀请关系,活动记录,余额信息都会清空,这让好多运维都会很尴尬,急忙找人在自己的云服务器上一通乱搞。今天object哥哥分享的解决方案价值1000元,有可能会用到的童鞋们可以点一波收藏了。

微擎重新绑定微信公众号后进行粉丝迁移,保证系统设置和客户资料,余额等信息不变的方法

微信公众平台粉丝迁移使用场景

有两个公众号A和B,微擎绑定公众号A运营一段时间,拥有粉丝和运营数据,因故不能继续使用公众号A运营,在微擎后台中把公众号A的绑定参数缓存公众号B的参数,然后在微信官方提交了粉丝迁移申请并且已经完成了粉丝迁移。这时原公众号A的粉丝自动迁移到了公众号B,但是用户进入系统后发现原来的数据信息都被清空。

粉丝数据清空的原因

微擎系统的数据实际并没有被清空,微信公众平台的官方虽然完成了粉丝迁移,但同一个粉丝关注的是不同的公众号,导致 open ID (被称为微信粉丝的身份证号)发生了变化,虽然是同一个粉丝但是生成了两个 open ID,所有的数据信息都在原open ID ,新生成的 open ID  没有数据。

恢复粉丝数据的方法

方法一、在进行官方粉丝迁移前,申请微信开放平台,同时接入公众号A和公众号B。这样可以在完成粉丝迁移后可以保证粉丝数据完整。此方法的优点是简单省事,缺点是微信开放平台每年需要300元的费用。

方法二、如果舍不得口袋里的银子,可以不用开放平台,通过技术处理。具体处理方案如下:

1、原粉丝数据表增加一个字段记:trans_status  用该字段标记粉丝状态:0表示未迁移,1表示已迁移,2表示新用户, 3表示需要手动处理。粉丝新关注后默认状态为新用户。

2、找到原粉丝数据表的最后一个id号,比如id为10086这个号。 旧粉丝标记为未迁移: update set trans_status=0 from ims_jueqi_knowme_user where id<=10086。

3、 对新关注的用户进行匹配,判断该用户是否是老粉丝迁移过来的,从10087开始向下一条一条的处理 Select id from ims _ jueqi _ knowme _ user where nickname = ( Select nickname from ims _ jueqi _ knowme _ user where id=10087 )。

说明:

  • 这条SQL语句中的 ims _ jueqi _ knowme _ user 是微擎应用的粉丝数据库表名称。
  • 上述举例中采用的匹配条件是微信昵称 nicename 。可以根据自己的情况选择采用手机号或者其他匹配条件。
  • 如果这条SQL语句执行结果为空就是没有同名的,那么认为是新用户,这条记录的 trans_status 标记为状态 2 并且不进行行操作。
  • 如果这条SQL语句执行结果大于 1 条记录,则认为有多人同名,这条记录的 trans_status 标记为状态 3并且打印这个需要手动来处理用户。
  • 如果这条SQL语句执行结果只有 1 条记录。则删除本条id(如10087)的数据,并把找到的那一条的 open ID 替换成新的open ID 。

4、由于粉丝关注新公众号(公众号B)的时间不统一,所以上述方案生成 php 文件,可以反复执行。

微擎重新绑定微信公众号后进行粉丝迁移,保证系统设置和客户资料,余额等信息不变的方法

恢复粉丝数据方案二代码

代码使用说明如下:

  • ‘host’=>’127.0.0.1’,      改为您数据库的host
  • ‘port’=>’3306’,            改为您数据库的端口
  • ‘dbname’=>’we7’,       改为您数据库的名称
  • ‘username’=>’root’,    改为您数据库的用户名
  • ‘password’=>’jingcheng’,  改为您数据库的密码
  • ‘charset’=>’utf8’,
  • ‘dsn’=>’mysql:host=127.0.0.1;dbname=we7;port=3306;charset=utf8’  这句根据上面的更改进行
  • $id = 10087;                改为您数据库的新用户开始的ID
  • $table = “ims_aide_user”;      改为您微擎应用粉丝信息的数据表名称
<?php
ini_set('max_execution_time', 300);
$db = array(
'host'=>'127.0.0.1',
'port'=>'3306',
'dbname'=>'we7',
'username'=>'root',
'password'=>'jingcheng',
'charset'=>'utf8',
'dsn'=>'mysql:host=127.0.0.1;dbname=we7;port=3306;charset=utf8'
);
$id = 10087;//新数据开始的编号
$table = "ims_aide_user";

//连接
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //默认是PDO::ERRMODE_SILENT, 0, (忽略错误模式)
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 默认是PDO::FETCH_BOTH, 4
);

try{
$pdo = new PDO($db['dsn'], $db['username'], $db['password'], $options);
}catch(PDOException $e){
die('数据库连接失败:' . $e->getMessage());

}

//修改表结构trans_status 1:已迁移,0:未迁移。2-新用户 3-需要手动处理。
$stmt = $pdo->prepare("select count(*) as count from information_schema.columns WHERE table_name = ? and column_name = ?");
$stmt->bindValue(1,$table);
$stmt->bindValue(2,'trans_status');
$stmt->execute(); //执行一条预处理语句 .成功时返回 TRUE, 失败时返回 FALSE
$columns = $stmt->fetch();
if($columns['count']<=0){
echo "我要开始加字段 trans_status !===>".PHP_EOL;
$stmt = $pdo->prepare("alter table ".$table." add `trans_status` int(11) DEFAULT 2");
$stmt->execute(); //执行一条预处理语句 .成功时返回 TRUE, 失败时返回 FALSE
echo "<====加字段完成".PHP_EOL;

//标记之前旧数据
$stmt = $pdo->prepare("update ".$table." set trans_status=0 where id < ? ");
$stmt->bindValue(1,$id);
$stmt->execute();
}
//1.没有需要迁移的
$stmt = $pdo->prepare("select * from ".$table." where id < ? and trans_status = ?");
$stmt->bindValue(1,$id);
$stmt->bindValue(2,0);
$stmt->execute(); //执行一条预处理语句 .成功时返回 TRUE, 失败时返回 FALSE
$rows = $stmt->rowCount();
echo "旧数据没有被替换的用户数为:".$rows."条".PHP_EOL;
if($rows <= 0){
echo "所有的都迁移完了".PHP_EOL;
exit();
}
$stmt = $pdo->prepare("select * from ".$table." where id >= ?");
$stmt->bindValue(1,$id);
$stmt->execute(); //执行一条预处理语句 .成功时返回 TRUE, 失败时返回 FALSE
$rows = $stmt->fetchAll(); //获取所有
$all_total = 0;//总替换数
$wait = 0;//需要手动来处理
foreach( $rows as $val_new){
if(empty($val_new['nickname'])){
echo "用户ID:" .$val_new['id']." 的nickname为空".PHP_EOL;
continue;
}
// echo "新用户 unionid:".$val_new['unionid']."昵称:".$val_new['nickname']. "ID:" .$val_new['id'];
$old_sql = $pdo->prepare("select * from ".$table." where nickname = ? and id< ?");
$old_sql->bindValue(1,$val_new['nickname']);
$old_sql->bindValue(2,$id);
$old_sql->execute(); //执行一条预处理语句 .成功时返回 TRUE, 失败时返回 FALSE
$count = $old_sql->rowCount();
if($count >=2){
echo " XXXXX 需要手动处理 昵称:".$val_new['nickname']. "ID:" .$val_new['id'].PHP_EOL;
$wait++;
unset($old_sql);
unset($count);
continue;
}else if($count ==1){
$old_data = $old_sql->fetch();
echo "新用户 unionid:".$val_new['unionid']."昵称:".$val_new['nickname']. "ID:" .$val_new['id'];
echo " 将要替换===> ID: ".$old_data['id'];
//删除新数据,
$delete_sql = $pdo->prepare("delete from ".$table." where id= ?");
$delete_sql->bindValue(1,$val_new['id']);
$delete_sql->execute();

//更新旧数据
$update_sql = $pdo->prepare("update ".$table." set openid= ? , trans_status =? where id= ?");
$update_sql->bindValue(1,$val_new['openid']);
$update_sql->bindValue(2,1);
$update_sql->bindValue(3,$old_data['id']);
$update_sql->execute();
unset($delete_sql);
unset($update_sql);
unset($old_sql);
unset($count);
echo "替换完成 OK"; echo PHP_EOL;
$all_total++;
}
}
echo "本轮共计替换旧数据".$all_total." 条".PHP_EOL;
echo "要手动来处理的数据:".$wait." 条".PHP_EOL;

本站所有内容,如有版权、侵权等问题,请及时联系本站做删除。发布者:云期刊,转载请注明出处:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

400-100-6858

在线咨询:点击这里给我发消息

邮件:drhxxkj@163.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code