flutter/lib/utils/wxsdk.dart

145 lines
4.4 KiB
Dart
Raw Normal View History

2025-08-21 10:50:38 +08:00
import 'package:flutter/services.dart';
import 'package:flutter_image_compress/flutter_image_compress.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:loopin/IM/controller/im_user_info_controller.dart';
import 'package:loopin/IM/im_service.dart';
import 'package:loopin/api/common_api.dart';
import 'package:loopin/service/http.dart';
class Wxsdk {
static bool _inited = false;
static final Fluwx fluwx = Fluwx();
static Future<bool> init() async {
if (_inited) {
return true;
}
_inited = true;
final initRes = await fluwx.registerApi(
appId: 'wxebcdaea31881caab',
doOnAndroid: true,
doOnIOS: true,
universalLink: 'https://wuzhongjie.com.cn/',
);
if (initRes) {
logger.i('微信sdk初始化成功');
// 全局监听授权回调
fluwx.addSubscriber(
(res) async {
//授权
if (res is WeChatAuthResponse) {
if (res.isSuccessful) {
final code = res.code;
logger.i('微信回调code: $code,类型:${res.state}');
if (res.state == 'getOpenId') {
// TODO: 使用 code 向后台换取 access_token、unionid
final serverRes = await Http.post(CommonApi.wxLogin, data: {
"source": "wechat_open",
"socialCode": "${res.code}",
"socialState": "1",
"clientId": "428a8310cd442757ae699df5d894f051",
"grantType": "social"
});
final info = Get.find<ImUserInfoController>();
info.customInfo['openId'] = serverRes['data']['openId'];
info.updateOpenId();
info.customInfo.refresh();
logger.w(serverRes['data']['openId']);
}
} else {
logger.w('微信授权失败: ${res.errStr}-类型:${res.state}');
}
}
// 分享
if (res is WeChatShareResponse) {
logger.w(res.isSuccessful);
// 这里只能确保打开了微信,是取消了还是确认了没办法知道
if (res.isSuccessful) {}
}
},
);
} else {
logger.i('微信SDK初始化失败$initRes');
}
return initRes;
}
/// 调用微信登录
static Future<void> login() async {
final result = await fluwx.authBy(
which: NormalAuth(
scope: 'snsapi_userinfo',
state: 'getOpenId',
),
);
if (!result) {
logger.e('微信授权请求发送失败');
}
}
///分享好友
static Future<bool> shareToFriend({
required String title,
required String description,
required String webpageUrl,
String thumbnailAssetPath = 'assets/images/logo/logo.png',
}) async {
Uint8List? thumbData;
thumbData = await _loadLocalThumbnail(thumbnailAssetPath);
final model = WeChatShareWebPageModel(
webpageUrl,
title: title,
description: description,
thumbData: thumbData,
scene: WeChatScene.session,
);
return Fluwx().share(model);
}
///分享到朋友圈
static Future<bool> shareToTimeline({
required String title,
required String webpageUrl,
String thumbnailAssetPath = 'assets/images/logo/logo.png',
}) async {
Uint8List? thumbData;
thumbData = await _loadLocalThumbnail(thumbnailAssetPath);
final model = WeChatShareWebPageModel(
webpageUrl,
title: title,
thumbData: thumbData,
scene: WeChatScene.timeline,
);
return Fluwx().share(model);
}
static Future<Uint8List> _loadLocalThumbnail(String assetPath) async {
final byteData = await rootBundle.load(assetPath);
final originBytes = byteData.buffer.asUint8List();
final compressedBytes = await FlutterImageCompress.compressWithList(
originBytes,
minWidth: 120, // 微信要求120X120且小于32kb
minHeight: 120,
quality: 80, // 控制质量
format: CompressFormat.jpeg, // 转为 JPEG
);
logger.i("thumbData size: ${compressedBytes.length} bytes");
return compressedBytes;
}
/// 跳转小程序
static Future<void> openMiniApp({required orderId}) async {
var miniProgram = MiniProgram(
username: "gh_2ffaecc5508e", // 小程序原始ID
path: "/pages/index/index?id=$orderId", // 打开时带的路径参数
2025-09-03 10:39:38 +08:00
miniProgramType: WXMiniProgramType.preview,
2025-08-21 10:50:38 +08:00
);
Fluwx().open(target: miniProgram);
}
}