Android Web App从PHP获取登录状态JSON值失败求助
解决Android Web App无法获取PHP登录状态JSON的问题
看起来你卡在了Android端获取WordPress登录状态的问题上,我来帮你一步步排查解决:
第一步:先修复PHP脚本的明显错误
你的代码里else分支的header拼写不完整,而且还有几个可以优化的点,比如统一响应头、避免WordPress后续输出干扰:
<?php include 'wp-load.php'; global $current_user; wp_get_current_user(); // 这个函数会自动填充全局$current_user,不用重新赋值 $id = $current_user->ID; // 统一设置JSON响应头,放在最前面防止输出缓存 header('Content-Type: application/json; charset=utf-8'); // 禁用缓存,避免旧响应影响判断 header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); if ($id != 0) { echo json_encode(array('user' => '1')); } else { echo json_encode(array('user' => '0')); } exit; // 终止脚本,防止WordPress后续输出额外内容破坏JSON格式 ?>
第二步:Android端请求的关键注意点
WordPress的登录状态是基于Session Cookie的,所以Android端必须携带登录后的Cookie,PHP才能识别出已登录用户,这里分两种场景处理:
场景1:WebView加载网页时获取状态
如果你的App是用WebView承载网页,需要开启Cookie同步,再通过JS请求接口:
WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); // 配置Cookie允许策略 CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setAcceptCookie(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { cookieManager.setAcceptThirdPartyCookies(webView, true); }
然后在网页的JS里发起请求,并把结果传给Android原生:
fetch('你的PHP脚本地址.php') .then(response => response.json()) .then(data => { console.log('登录状态:', data.user); // 调用Android原生方法传递状态 window.android.onLoginStatusReceived(data.user); }) .catch(error => console.error('请求失败:', error));
场景2:原生OkHttp请求获取状态
如果用原生OkHttp发起请求,需要先保存登录后的Cookie,再在请求时携带:
// 初始化CookieJar保存登录后的Cookie CookieJar cookieJar = new CookieJar() { private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>(); @Override public void saveFromResponse(HttpUrl url, List<Cookie> cookies) { cookieStore.put(url.host(), cookies); } @Override public List<Cookie> loadForRequest(HttpUrl url) { List<Cookie> cookies = cookieStore.get(url.host()); return cookies != null ? cookies : new ArrayList<>(); } }; OkHttpClient client = new OkHttpClient.Builder() .cookieJar(cookieJar) .build(); // 发起请求 Request request = new Request.Builder() .url("你的PHP脚本地址.php") .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { e.printStackTrace(); } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { String json = response.body().string(); // 解析JSON获取状态 JSONObject jsonObject = new JSONObject(json); String userStatus = jsonObject.getString("user"); // 回到主线程处理状态 runOnUiThread(() -> { if ("1".equals(userStatus)) { // 处理用户已登录逻辑 } else { // 处理用户未登录逻辑 } }); } } });
第三步:排查常见坑点
- 跨域问题:如果Web页面和PHP脚本不在同一域名,要在PHP脚本开头加跨域头:
header("Access-Control-Allow-Origin: 你的Web页面域名"); // 生产环境别用* header("Access-Control-Allow-Credentials: true"); // 允许携带Cookie - 额外输出干扰:检查
wp-load.php引入前后有没有空格、换行,这些会破坏JSON格式,可在脚本开头加ob_start();,结尾加ob_end_clean();清理缓存。 - JSON有效性:先在浏览器里直接访问PHP脚本,看返回的是不是标准JSON(比如
{"user":"1"}),如果有多余字符要排查脚本输出。
内容的提问来源于stack exchange,提问作者Shweta Dhingana




