HarmonyOS微博第三方登录实现

前期准备
在微博开放平台注册一个网站应用,微博开放平台地址如下:
https://open.weibo.com/connect
进入正题
①创建一个登录页面的 Ability
因为使用的是网站接入的方式,所以登录使用 WebView 来实现。
<?xml?version="1.0"?encoding="utf-8"?>
<DirectionalLayout
????xmlns:ohos="http://schemas.huawei.com/res/ohos"
????ohos:height="match_parent"
????ohos:width="match_parent"
????ohos:orientation="vertical">
????<ohos.agp.components.webengine.WebView
????????ohos:id="$+id:WebView_weibologin"
????????ohos:height="match_parent"
????????ohos:width="match_parent"/>
</DirectionalLayout>
②在登录页 AbilitySlice 中对 WebView 进行设置。
public?void?onStart(Intent?intent)?{
????????super.onStart(intent);
????????super.setUIContent(ResourceTable.Layout_ability_wei_bo_login);
????????WebView?myWebView?=?(WebView)?findComponentById(ResourceTable.Id_WebView_weibologin);
????????myWebView.getWebConfig().setJavaScriptPermit(true);
????//自定义WebAgent?用于登录的相关操作
????????myWebView.setWebAgent(new?WebAgent(){
????//?isNeedLoadUrl?当WebView即将打开一个链接时会调用此方法?
????????????@Override
????????????public?boolean?isNeedLoadUrl(WebView?webView,?ResourceRequest?request)?{
????????//?request.getRequestUrl().toString().startsWith("sinaweibo")?
????????//?当请求链接为sinaweibo开头(点击网页上一键登录会唤起微博客户端)时,使用下面的方法唤起微博客户端。
????????????????if?(request.getRequestUrl().toString().startsWith("sinaweibo")){
????????????????????Intent?intent?=?new?Intent();
????????????????????intent.setAction("android.intent.action.VIEW");
????????????????????intent.setUri(Uri.parse(request.getRequestUrl().toString()));
????????????????????intent.addFlags(Intent.FLAG_ABILITY_NEW_MISSION);
????????????????????startAbility(intent);
????????????????????return?false;
????????????????}
????????//?当在微博客户端授权后,会重定向至定义的网址,示例中重定向至https://api.dsttl3.cn/?code=【code的值】?,这时候就可以从链接中获取到code进行下一步了。这里把code传入下个页面
????????????????if?(request.getRequestUrl().toString().startsWith("https://api.dsttl3.cn)){
????????????????????String?code?=?request.getRequestUrl().toString().substring(28);
????????????????????Intent?intent?=?new?Intent();
????????//??在intent中带上code
????????????????????intent.setParam("code",code);
????????????????????Operation?operation?=?new?Intent.OperationBuilder()
????????????????????????????.withDeviceId("")
????????????????????????????.withBundleName("cn.dsttl3.dome.weibologin")
????????????????????????????.withAbilityName("cn.dsttl3.dome.weibologin.MyAbility")
????????????????????????????.build();
????????????????????intent.setOperation(operation);
????????????????????startAbility(intent);
????????//?结束当前Ability
????????????????????terminateAbility();
????????????????}
????????????????return?true;
????????????}
????????});
????????//授权连接,需要自己修改
????????myWebView.load("https://api.weibo.com/oauth2/authorize?client_id=2593566539&response_type=code&forcelogin=false&scope=all&redirect_uri=https%3A%2F%2Fapi.dsttl3.cn");
????}
③获取到 code 后,在 MyAbility 中获取微博 token。
public?void?onStart(Intent?intent)?{
????????super.onStart(intent);
????????super.setUIContent(ResourceTable.Layout_ability_my);
????????Text?text?=?(Text)?findComponentById(ResourceTable.Id_text_helloworld);
????????String?code?=?intent.getStringParam("code");
????????new?Thread(new?Runnable()?{
????????????@Override
????????????public?void?run()?{
????????????????try?{
????????????????????String?YOUR_CLIENT_ID?=?"2593566539";
????????????????????String?YOUR_CLIENT_SECRET?=?"383fc6262e954e18f5b7efe3c9899284";
????????????????????String?YOUR_REGISTERED_REDIRECT_URI?=?"https://api.dsttl3.cn";
????????????????????String?ACCESS_TOKEN_URL?=?"https://api.weibo.com/oauth2/access_token";
????????????????????OkHttpClient?client?=?new?OkHttpClient();
????????????????????FormBody?body?=?new?FormBody.Builder()
????????????????????????????.add("client_id",?YOUR_CLIENT_ID)
????????????????????????????.add("client_secret",?YOUR_CLIENT_SECRET)
????????????????????????????.add("grant_type",?"authorization_code")
????????????????????????????.add("redirect_uri",?YOUR_REGISTERED_REDIRECT_URI)
????????????????????????????.add("code",?code).build();
????????????????????Request?okRequest?=?new?Request.Builder().url(ACCESS_TOKEN_URL).header("referer",YOUR_REGISTERED_REDIRECT_URI).post(body).build();
????????????????????Call?call?=?client.newCall(okRequest);
????????????????????Response?re?=?call.execute();
????????????????????String?s?=?re.body().string();
????????????????????Gson?gson?=?new?Gson();
????????????????????WeiBoTokenJson?w?=?gson.fromJson(s,?WeiBoTokenJson.class);
????????????????????getUITaskDispatcher().asyncDispatch(new?Runnable()?{
????????????????????????@Override
????????????????????????public?void?run()?{
????????????????????????????text.setText("登录成功:token="?+?w.getAccess_token());
????????????????????????}
????????????????????});
????????????????}?catch?(IOException?e)?{
????????????????????e.printStackTrace();
????????????????}
????????????}
????????}).start();
效果演示如下:

了解更多请下载源代码:
https://gitee.com/dsttl3/WeiBoLogin
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 习近平将发表二〇二六年新年贺词 7904141
- 2 2026年国补政策来了 7808738
- 3 东部战区:开火!开火!全部命中! 7712893
- 4 2026年这些民生政策将惠及百姓 7616985
- 5 小学食堂米线过期2.5小时被罚5万 7519709
- 6 解放军喊话驱离台军 原声曝光 7428214
- 7 为博流量直播踩烈士陵墓?绝不姑息 7327605
- 8 每月最高800元!多地发放养老消费券 7238391
- 9 数字人民币升级 1月1日起将计付利息 7141831
- 10 2026年1月1日起 一批新规将施行 7040675





![苏滢滢Super滢终于飞完了 隔离日记正式上线[跪了] ](https://imgs.knowsafe.com:8087/img/aideep/2023/2/24/df606707e605eb689d19254c9a189f3a.jpg?w=250)


51CTO技术栈
