微信公众号迁移置换粉丝openid
1、一、储存旧的
<?php
require_once './MySQLiDb.class.php';
$res = $db->getAll("SELECT openid FROM `user` WHERE openid<>''");
$newArr = [];
foreach ($res as $k=>$v) {
$newArr[] = $v['openid'];
}
$path = "./save_old_openid.php";
$save_text = '<?php'."\n".'return $old_openids = '.var_export($newArr,true).';';
if(fopen($path,'w')){
file_put_contents($path,$save_text);
echo 'success';
}else{
echo 'error';
}
2、二、储存置换出来的
<?php
define("APPID", "*********");
define("APPSECRET", "*********");
//原来的APPID
define("OLDAPPID", "**********");
require_once './save_old_openid.php';
$accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;
$res = json_decode(file_get_contents($accessTokenUrl),true);
$accessToken = $res["access_token"];
//用来储存转换后的数据
$newArr = array();
$arr100 = array_chunk($old_openids,100);
$count = count($arr100);
for ($i=0;$i<$count;$i++){
$requestData = array(
//此处为原帐号的appid
"from_appid" => OLDAPPID,
//需要转换的openid,即第1步中拉取的原帐号用户列表,这些必须是旧账号目前关注的才行,否则会出错;一次最多100个,不能多。
"openid_list"=>$arr100[$i]
);
$jsonOldOpenids = json_encode($requestData);
$requestUrl = "http://api.weixin.qq.com/cgi-bin/changeopenid?access_token=".$accessToken;
$result = json_decode(https_post($requestUrl,$jsonOldOpenids),true);
$arr = isset($result["result_list"]) ? $result["result_list"] : array();
foreach ($arr as $k=>$v){
if (isset($v['err_msg']) && ($v['err_msg'] == 'ok')){
$newArr[] = array(
0 => $v['ori_openid'],
1 => $v['new_openid']
);
}
}
}
$path = "./save_new_openid.php";
$save_text = '<?php'."\n".'return $new_openids = '.var_export($newArr,true).';';
if(fopen($path,'w')){
file_put_contents($path,$save_text);
echo 'success';
}else{
echo 'error';
}
function https_post($url, $data){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
if (curl_errno($curl)) {
return 'Errno' . curl_error($curl);
}
curl_close($curl);
return $result;
}
1、三、更新
<?php
require_once './MySQLiDb.class.php';
require_once './save_new_openid.php';
foreach ($new_openids as $k=>$v){
$db->query("UPDATE `user` SET openid='{$v[1]}' WHERE openid='{$v[0]}'");
}