1、首先我使用了Getx来管理路由和获得用户同意登录后的code

void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({Key? key}) : super(key: key);@overrideWidget build(BuildContext context){HttpUtil.getInstance();return GetMaterialApp(initialRoute: RouteConfig.home,getPages: RouteConfig.getPages,);}
}class RouteConfig {///主页面static const String home = "/";static const String login = "/login";static const String one = "/one";static const String two = "/two";static const String three = "/three";///别名映射页面static final List<GetPage> getPages = [GetPage(name: home, page: () => HomePage()),GetPage(name: login, page: () => LoginPage()),GetPage(name: one, page: () => OnePage()),GetPage(name: two, page: () => TwoPage()),GetPage(name: three, page: () => ThreePage()),];
}

2、根据token判断是否登录,没登陆就申请微信授权

void isLogin() async {var token = await SPUtil.getToken();if (token == "") {var appId = UrlKeys.APP_ID;//这个是授权同意后的回调地址,自己可以建一个空白页面,将链接放上去,在空白页面中获得codevar redirectUrl = urlEncode(text: UrlKeys.REDIRECT_URL);String requestUrl ="https://open.weixin.qq.com/connect/oauth2/authorize?appid=" +appId +"&redirect_uri=" +redirectUrl +"&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";if (await canLaunch(requestUrl) != null) {await launch(requestUrl);} else {throw "Could not open link (" + requestUrl + ").";}}}

3、在空白页面中获得code,得到后请求后端接口

 if(Get.parameters.isNotEmpty){state.code = Get.parameters['code'];state.stateCopy = Get.parameters['state'];logic.getUserInfo();}void getUserInfo(){HttpUtil.get(UrlKeys.WEB_INFO, {"code":state.code,"state":state.stateCopy}, (data){state.data=data;SPUtil.setToken(data["data"]["accessToken"]);SPUtil.setValue(SPUtil.OPEN_ID,data["data"]["openId"]);update();}, (error){});}

4、接口,用code换access_token和openid

 @CrossOrigin    //支持跨域@RequestMapping(value = "/web/info", method = {RequestMethod.GET})public Result webInfo(HttpServletRequest request) {String appId = "你公众号的appId";String secret = "你公众号的secret";String code = request.getParameter("code");// 拼接请求地址String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + secret + "&code=" + code + "&grant_type=authorization_code";// 获取网页授权凭证String data = HttpUtil.sendGet(requestUrl);JSONObject jsonObject = JSON.parseObject(data);if (null != jsonObject) {try {WeChatOauth2Token wat = new WeChatOauth2Token();wat.setAccessToken(jsonObject.getString("access_token"));wat.setExpiresIn(jsonObject.getIntValue("expires_in"));wat.setRefreshToken(jsonObject.getString("refresh_token"));wat.setOpenId(jsonObject.getString("openid"));wat.setScope(jsonObject.getString("scope"));return Result.success(wat);} catch (Exception e) {int errorCode = jsonObject.getIntValue("errcode");String errorMsg = jsonObject.getString("errmsg");System.out.println("第三方:【微信】获取网页授权凭证失败 :errcode:{" + errorCode + "} errmsg:{" + errorMsg + "}");return Result.fail(errorCode, errorMsg);}}return Result.fail(444, "获得token错误");}

5、用access_token和openid拉取用户信息

get请求:https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN返回参数
{   "openid": "OPENID","nickname": NICKNAME,"sex": 1,"province":"PROVINCE","city":"CITY","country":"COUNTRY","headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46","privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

其他的信息可以去微信开放文档里看
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

我遇到的问题

flutter-web会自动添在链接上添加#,路由导航也必须加着#,这就导致了微信授权回调时,会自动把#放在最后,回调不到正确的页面,也就没有办法得到code

来个例子

https://mho.xjz.world/#/login  //回调地址
正常情况下:https://mho.xjz.world/#/login?code=1&state=2
微信回调后却是:https://mho.xjz.world/?code=1&state=2#/login

本想着在路由中直接去掉#,但flutter这方面的文章很少,以至于想试试vue与nginx去掉#的办法,无果(太菜),只能曲线救国了

最后用宝塔路径重定向了一下,让回调地址变成了

https://mho.xjz.world/login
//下面这个是nginx重定向配置
rewrite ^/login(.*) https://mho.xjz.world/#/login permanent;

在这里希望有知道如何直接去掉#的大佬,提点一下,不胜感激

flutter web实现微信网页授权登录相关推荐

  1. 微信网页授权登录java后台实现

    建议先阅读微信开发-网页授权登录官方文档: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_au ...

  2. 微信公众号开发(一) 微信网页授权登录

    微信网页授权登录 前期准备 授权登录 获取微信数据 处理授权拒绝 前期准备 1.微信公众号开发,首先要搞一个公众号,开发阶段可以申请一个公众平台测试账号. (进入到微信公众公众平台,找到开发者工具,点 ...

  3. php微信授权ajax,ajax 实现微信网页授权登录

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个PHPer ,所以,微信开发采用的是 EasyWeCha ...

  4. java ajax 微信网页授权_ajax 实现微信网页授权登录的方法

    AJAX 的 ajax 实现微信网页授权登录的方法 项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个ph ...

  5. 微信网页授权登录的方法

    微信网页授权登录官方文档 微信网页授权登录的方法–推荐文章一 微信网页授权登录的方法–推荐文章二 总结: 微信授权方式(scope的属性值控制): 应用授权作用域,snsapi_base (不弹出授权 ...

  6. Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  7. php微信登录代理转发,PHP微信网页授权登录

    PHP微信网页授权登录 2018年04月10日 15:44:03阅读数:601 namespace Org\WeChat; /** * 微信授权相关接口 */ class Wechat { //高级功 ...

  8. SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  9. Spring Boot Security 多种登录方式集成配置思路及方法 账号用户名登录+微信网页授权登录

    概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路 前情提要 本思路完全抛弃Spring Security的配置式账号密码登录模式,采用完全独立的Filter.Provi ...

  10. 微信网页授权登录且实现access_token分布式管理

    建议:一定要先看官方文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 注意事项和说明官方文档都有说明,我 ...

最新文章

  1. 解决复制虚拟机时候网络不从eth0开始问题
  2. Git之深入解析如何运行自己的Git仓库托管服务器
  3. 优雅且高效的使用Chrome Developer Tools
  4. 二分搜索(折半搜索),lower_bound,upper_bound
  5. python继承属性_python继承,属性查找顺序
  6. Windows开机 桌面一片空白 无法操作
  7. 参考文献起止页码怎么写_【求助】有全文参考文献但没有起止页码如何办
  8. Unity 2D教程 | 骨骼动画:创建动画
  9. 计算机毕业设计系列基于SSM的养老保险管理系统
  10. Directshow完整介绍
  11. BT面板创建站点显示已存在问题解决
  12. 消息队列8:RabbitMq的QOS实验
  13. 2020年应届毕业生自学两个月JAVA的历程
  14. [供应链·案例篇]石油和天然气行业的数字化转型用例
  15. 身体不适蹲在家的随笔
  16. 深化校企合作|云畅科技与湖南女子学院签订校企合作协议
  17. mysql批量替换图地址_数据库批量替换附件地址方法
  18. 计算机里分数线怎么办,word里分数线怎么打?
  19. XMind之乱世三国
  20. MSNP8 原文翻译 (Zz)

热门文章

  1. 2022-2028年中国安防行业全景调研及竞争格局预测报告
  2. 电感 电容耦合的判断
  3. 三星固态Dell版的960g的sm863a硬盘
  4. 视频播放设计测试用例
  5. 华为路由器配置OSPF实现不同网段通信
  6. 分享几个下载kindle电子书的资源网站
  7. Java 生成条形码和二维码
  8. 卸载Office 16 Click-to-Run Extensibility Component详细步骤
  9. 电容或电感的电压_电压和电流的超前与滞后,你能说清楚吗?
  10. 最简单易懂的SpringCloudSleuth教程(spring cloud体系的链路追踪系统)