最近在开发微信消息模板时,需要获取用户列表存储到数据库 ,在开发过程中遇到了这样一个坑
当在测试账号,获取用户列表时写下的方法是这样的
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’,];
总结:经过这个错误的分析排查,对于回调函数有了更深的认识,希望对看到的小伙伴有帮助,解决一个错误感觉收获蛮大的,愿自己能够越来越优秀!