未安装Twitter应用时Android端Twitter登录失败(无WebView弹窗)
Twitter登录报错“Failed to get request token”(无客户端时)解决方案
编辑说明:此问题此前有人提出但未得到解答,且未附带堆栈信息,故再次提问。
问题描述
当设备安装Twitter应用时,我方Android应用可正常完成Twitter登录;但卸载Twitter应用后,点击「使用Twitter登录」按钮无WebView弹窗出现,且提示“Failed to get request token”错误,具体堆栈信息如下:
E/Twitter: Invalid json: Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224) at com.twitter.sdk.android.core.models.SafeListAdapter$1.read(SafeListAdapter.java:45) at com.twitter.sdk.android.core.models.SafeMapAdapter$1.read(SafeMapAdapter.java:45) at com.google.gson.Gson.fromJson(Gson.java:887) at com.google.gson.Gson.fromJson(Gson.java:852) at com.google.gson.Gson.fromJson(Gson.java:801) at com.google.gson.Gson.fromJson(Gson.java:773) at com.twitter.sdk.android.core.TwitterApiException.parseApiError(TwitterApiException.java:110) at com.twitter.sdk.android.core.TwitterApiException.readApiError(TwitterApiException.java:95) at com.twitter.sdk.android.core.TwitterApiException.(TwitterApiException.java:43) at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:172) at android.app.ActivityThread.main(ActivityThread.java:6637) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213) at com.twitter.sdk.android.core.models.SafeListAdapter$1.read(SafeListAdapter.java:45) at com.twitter.sdk.android.core.models.SafeMapAdapter$1.read(SafeMapAdapter.java:45) at com.google.gson.Gson.fromJson(Gson.java:887) at com.google.gson.Gson.fromJson(Gson.java:852) at com.google.gson.Gson.fromJson(Gson.java:801) at com.google.gson.Gson.fromJson(Gson.java:773) at com.twitter.sdk.android.core.TwitterApiException.parseApiError(TwitterApiException.java:110) at com.twitter.sdk.android.core.TwitterApiException.readApiError(TwitterApiException.java:95) at com.twitter.sdk.android.core.TwitterApiException.(TwitterApiException.java:43) at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:172) at android.app.ActivityThread.main(ActivityThread.java:6637) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) E/Twitter: Failed to get request token com.twitter.sdk.android.core.TwitterApiException: HTTP request failed, Status: 403 at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:172) at android.app.ActivityThread.main(ActivityThread.java:6637) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) E/Twitter: Authorization completed with an error com.twitter.sdk.android.core.TwitterAuthException: Failed to get request token at com.twitter.sdk.android.core.identity.OAuthController$1.failure(OAuthController.java:94) at com.twitter.sdk.android.core.internal.oauth.OAuth1aService$1.failure(OAuth1aService.java:191) at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.L...
问题根因
从堆栈里的Callback URL not approved for this client application和403状态码可以明确:当设备没有Twitter客户端时,应用会触发Web OAuth登录流程,而这个流程要求你在Twitter开发者后台预先批准对应的回调URL,否则会被拒绝请求。而有Twitter客户端时用的是App Auth流程,不需要验证回调URL,所以能正常登录。
解决步骤
- 登录Twitter开发者平台,找到你的应用项目。
- 进入应用的Authentication Settings(认证设置)页面。
- 在
Callback URLs字段中,添加你的应用使用的回调URL:- 如果你用的是官方Twitter SDK默认配置,添加
twittersdk://即可; - 如果是自定义的回调URL,确保和你代码中配置的完全一致(比如
your-app-scheme://twitter-callback)。
- 如果你用的是官方Twitter SDK默认配置,添加
- 同时确认
Allow this app to be used to Sign in with Twitter选项处于开启状态。 - 保存所有设置后,重新卸载Twitter客户端测试登录流程。
额外注意事项
- 回调URL必须是合法的URI格式,不能有拼写错误;
- 如果你的应用有多个环境(测试/生产),记得把对应的回调URL都添加进去;
- 保存设置后可能需要等待几分钟才能生效,不要着急立刻测试。
内容的提问来源于stack exchange,提问作者nilesh
相关产品推荐
相关产品推荐

