openid转换接口
下面是php具体调用的示例,返回结果就不展示了,一些相关错误提示在下面的文档有描述。
/**
* openid转换接口(公众号迁移使用)
* Name: changeOpenid
* Author yanjie <823986855@qq.com>
* Date: 2019/3/3
*/
public function changeOpenid($oldappid,$openid)
{
$access_token = $this->getAccessToken();
$url='http://api.weixin.qq.com/cgi-bin/changeopenid?access_token='.$access_token;
$data['from_appid']=$oldappid;
$data['openid_list']=$openid;
$data = json_encode($data);
$token_data = $this->http($url,"POST", $data);
if($token_data[0] == 200)
{
return json_decode($token_data[1], TRUE);
}
return FALSE;
}
/**
* 获取access_token并存储
* @return unknown
*/
public function getAccessToken()
{
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
//$filename = 'wechat_access_token.json';
//json_decode(file_get_contents($filename));
$data = S('wechat_access_token');
if ($data->expire_time < time()) {
//$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->app_id}&secret={$this->app_secret}";
//$res = $this->http($info_url);
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->app_id}&secret={$this->app_secret}";
$res = $this->http($url);
if ($res[0] == 200) {
$data = json_decode($res[1], TRUE);
$data->expire_time = time() + 7200;
$data->access_token = $access_token;
// $fp = fopen($filename, "w");
// fwrite($fp, json_encode($data));
// fclose($fp);
S('wechat_access_token', $data);//这个是存缓存,thinkphp的大S写法
}
} else {
$access_token = $data['access_token'];
}
return $data['access_token'];
}
/**
* [http description]
* @param [type] $url [description]
* @param [type] $method [description]
* @param [type] $postfields [description]
* @param array $headers [description]
* @param boolean $debug [description]
* @return [type] [description]
*/
public function http($url, $method, $postfields = null, $headers = array(), $debug = false)
{
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ci, CURLOPT_TIMEOUT, 30);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
switch ($method) {
case 'POST':
curl_setopt($ci, CURLOPT_POST, true);
if (!empty($postfields)) {
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
//$this->postdata = $postfields;
}
break;
}
curl_setopt($ci, CURLOPT_URL, $url);
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ci, CURLINFO_HEADER_OUT, true);
$response = curl_exec($ci);
$http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
if ($debug) {
echo "=====post data======\r\n";
var_dump($postfields);
echo '=====info=====' . "\r\n";
print_r(curl_getinfo($ci));
echo '=====$response=====' . "\r\n";
print_r($response);
}
curl_close($ci);
return array($http_code, $response);
}
完善后的官方文档
账号迁移后,粉丝的openid会变化,微信用户关注不同的公众号,对应的openid是不一样的,迁移成功后,粉丝的openid以目标帐号(即新公众号)对应的OpenID为准。但开发者可以通过开发接口转换openid,开发文档可以参考:
提供一个openid转换的API接口,当帐号迁移后,可以通过该接口:
- 将原帐号粉丝的openid转换为新帐号的openid。
- 将有授权关系用户的openid转换为新帐号的openid。
- 将卡券关联用户的openid转换为新帐号的openid。
◆ 原帐号:准备要迁移的帐号,当审核完成且管理员确认后即被回收。
◆ 新帐号:用来接纳粉丝的帐号。新帐号在整个流程中均能正常使用。
一定要按照下面的步骤来操作。
-
一定要在原帐号被冻结之前,最好是准备提交审核前,获取原帐号的用户列表。如果没有原帐号的用户列表,用不了转换工具。如果原账号被回收,这时候也没办法调用接口获取用户列表。
如何获取用户列表见这里:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140840 -
转换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个,不能多。
}
注意,这儿的openid_list是json,不是数组,注意转换
◆ 输出数据:
{
"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。
40001:access_token过期
NULL:可能就是openid_list的问题
网友评论