You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动