Flutter 微信登录

6,230 阅读1分钟

注册应用

在微信开放平台中为开发的应用注册权限,注册成功则会返回:应用唯一标识APPID、应用密钥 AppSecret.(目前仅公司用户可申请注册权限,个人用户无法申请)

点击进入微信官方开发平台

导入第三方包并引用

dependencies:
  fluwx: ^${latestVersion}

import 'package:fluwx/fluwx.dart';

引用

  1. 先初始注册的应用
_initFluwx() async {
      await Fluwx.registerWxApi(
        appId: "APPID",     //传入注册的应用id
        doOnAndroid: true,  //在android上运行
        doOnIOS: true,      // 在ios上运行
      );
    }
  1. 判断手机上是否安装了微信
var exist = await Fluwx.isWeChatInstalled;

if (!exist) {
        Fluttertoast.showToast(
            msg: "请先安装微信",
            toastLength: Toast.LENGTH_SHORT,
            gravity: ToastGravity.CENTER,
            timeInSecForIosWeb: 1,
            backgroundColor: Colors.red,
            textColor: Colors.white,
            fontSize: 16.0);
      }
  1. 请求 CODE
String _result = "" ,

Fluwx.weChatResponseEventHandler.listen((data) {
        if (data.errCode == 0) {
          Fluwx.WeChatAuthResponse wa = data;
          _result += '  Code:' + wa.code;
          _result += '  country:' + wa.country;
          var code;
          setState((){
          code = wa.code;
          })
          printLog('code:  $code');
          getWeChatAccessToken(code); //通过 code 获取 access_token
        }
      });
  1. 通过 code 获取 access_token
https://api.weixin.qq.com/sns/oauth2/access_tokenappid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
void getWeChatAccessToken(code) async {
      var url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=";
      url += " APPID & secret = AppSecret & code=" + code;
      url += "&grant_type=authorization_code";
      
      //当第一次登录成功后点击退出再登录时,会报40163的错误
      // 40163 指的是使用同一个code 多次请求获取token
      //解决方法:每次请求的code都不一样,所以我们只需在传code的地方让它刷新即可
      
      
      
      try {
        Response response = await Dio().get(url);
          
        _result = response.data.toString();

        var data = jsonDecode(_result);
        assert(data is Map);

        var access_token = data['access_token'];

        var openid = data['openid'];
        getWeChatUserInfo(access_token, openid); //获取微信用户信息
      } catch (e) {
        printLog("getWeChatAccessToken error: $e");
      }
    }
  1. 获取微信用户信息
String _userinfo = " ";

void getWeChatUserInfo(accessToken, openId) async {
      if (accessToken == null) return;

      var url = "https://api.weixin.qq.com/sns/userinfo?access_token=";
      url += accessToken + "&openid=" + openId.toString();

      try {
        Response response = await Dio().get(url);
        var dataStr = response.data.toString();

        _userinfo = dataStr;
        _saveUserInfo(_userinfo);
        var data = jsonDecode(dataStr);
        headImageUrl = data["headimgurl"];
        nickname = data["nickname"];

        if (nickname != null) {
          _startTimer(data);
        }
        setState(() {});

      } catch (e) {
        print("e>>>>>>>>$e");
      }
    }

apk 微信登录问题

微信登录提示:签名不对,请检查签名是否与开发平台上填写的一致

解决方法