最近在开发微信消息模板时,需要获取用户列表存储到数据库 ,在开发过程中遇到了这样一个坑
当在测试账号,获取用户列表时写下的方法是这样的

public function get_user_list($next_openid = NULL){
    $urls="https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$this->getaccesstoken()."&next_openid=".$next_openid;
    $res = $this->http_request($urls);
    $list =json_decode($res,true);
    if ($list["count"] == 10000){
        $new = $this->get_user_list($next_openid = $list["next_openid"]);
        $list["data"]["openid"] = array_merge_recursive($list["data"]["openid"], $list["data"]["openid"]); //合并OpenID列表
    }
    return(json_encode($list));          //输出json格式字符串
//        return(json($list));                   //返回json对象,无法处理接收
}

能够获取到全部用户的openid,没有报错,但是当放置到正式的服务号时,却报了如下一个错误:

百度一下解释说不合法的字符串便移,即数组里有空数组。空数组是从哪里来的呢?
我分别打印输出以下值:

var_dump($list);
echo "<hr>";
var_dump($res);
echo "<hr>";
var_dump($new["data"]["openid"]);
die;

发现 var_dump($new[“data”][“openid”]);的值是空的,他为什么是空的,是什么原因导致的呢,该怎么解决这个问题呢?我在网上查了很久资料,才终于想明白。错误原因在于我return了json_encode($list)。而在测试账号上没有发生错误是因为用户数量没有超过一万,所以就没有执行回调函数中if判断里面的代码,没有报错。
终极问题是我对回调函数理解的有问题,我以为在if判断中我启动了回调函数,那if判断{}后面的代码就不会在执行了,也就是说回调函数第一次执行的时候执行了一半到条件判断里,就开始执行第二遍回调不在执行第一次回调if方法体后面的方法,在这里也就是不在执行  return(json_encode($list));    而是在if中执行第二次回调后最终一起执行  return(json_encode($list)); 。
解决办法:修改了  return(json_encode($list)); 的返回数据,代码如下:

public function get_user_list($next_openid = NULL){
    $url = https://api.weixin.qq.com/cgi-bin/user/get?access_token=".$this->getaccesstoken()."&next_openid=".$next_openid;
    $res = $this->http_request($url);
    $list = json_decode($res, true);
    if ($list["count"] == 10000){
        $new = $this->get_user_list($next_openid = $list["next_openid"]);
        $list["data"]["openid"] = array_merge_recursive($list["data"]["openid"], $new["data"]["openid"]); //合并OpenID列表
    }
    return $list;
}

让后就不报错可以正常执行程序了。
如果你这个api接口仍不能正常使用的话,还需要在api模块下面配置config文件,设置模版默认输出:
return [‘default_return_type’    => ‘json’,];

总结:经过这个错误的分析排查,对于回调函数有了更深的认识,希望对看到的小伙伴有帮助,解决一个错误感觉收获蛮大的,愿自己能够越来越优秀!