美文网首页ThinkPHP
公众号迁移用户openid转换接口(php)

公众号迁移用户openid转换接口(php)

作者: 雨涵Yan | 来源:发表于2019-03-07 17:13 被阅读27次

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接口,当帐号迁移后,可以通过该接口:

  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个,不能多。
}

注意,这儿的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的问题

相关文章

网友评论

    本文标题:公众号迁移用户openid转换接口(php)

    本文链接:https://www.haomeiwen.com/subject/shlhpqtx.html