Files
wechat_kit/example/lib/main.dart
2023-02-24 14:30:19 +08:00

352 lines
11 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_cache_manager/file.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:image/image.dart' as image;
import 'package:path/path.dart' as path;
import 'package:uuid/uuid.dart';
import 'package:wechat_kit/wechat_kit.dart';
import 'package:wechat_kit_extension/wechat_kit_extension.dart';
const String kWechatAppID = 'your wechat appId';
const String kWechatUniversalLink = 'your wechat universal link'; // iOS 请配置
const String kWechatAppSecret = 'your wechat appSecret';
const String kWechatMiniAppID = 'your wechat miniAppId';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({
super.key,
});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Home(),
);
}
}
class Home extends StatefulWidget {
const Home({
super.key,
});
@override
State<StatefulWidget> createState() {
return _HomeState();
}
}
class _HomeState extends State<Home> {
late final StreamSubscription<WechatResp> _respSubs;
WechatAuthResp? _authResp;
@override
void initState() {
super.initState();
_respSubs = WechatKitPlatform.instance.respStream().listen(_listenResp);
}
void _listenResp(WechatResp resp) {
if (resp is WechatAuthResp) {
_authResp = resp;
final String content = 'auth: ${resp.errorCode} ${resp.errorMsg}';
_showTips('登录', content);
} else if (resp is WechatShareMsgResp) {
final String content = 'share: ${resp.errorCode} ${resp.errorMsg}';
_showTips('分享', content);
} else if (resp is WechatPayResp) {
final String content = 'pay: ${resp.errorCode} ${resp.errorMsg}';
_showTips('支付', content);
} else if (resp is WechatLaunchMiniProgramResp) {
final String content = 'mini program: ${resp.errorCode} ${resp.errorMsg}';
_showTips('拉起小程序', content);
}
}
@override
void dispose() {
_respSubs.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Wechat Kit Demo'),
),
body: ListView(
children: <Widget>[
ListTile(
title: Text('注册APP'),
onTap: () async {
await WechatKitPlatform.instance.registerApp(
appId: kWechatAppID,
universalLink: kWechatUniversalLink,
);
_showTips('注册APP', '注册成功');
},
),
ListTile(
title: Text('微信回调 - 冷启'),
onTap: () async {
await WechatKitPlatform.instance.handleInitialWXReq();
},
),
ListTile(
title: Text('环境检查'),
onTap: () async {
final String content =
'wechat: ${await WechatKitPlatform.instance.isInstalled()} - ${await WechatKitPlatform.instance.isSupportApi()}';
_showTips('环境检查', content);
},
),
ListTile(
title: Text('登录'),
onTap: () {
WechatKitPlatform.instance.auth(
scope: <String>[WechatScope.kSNSApiUserInfo],
state: 'auth',
);
},
),
ListTile(
title: Text('扫码登录'),
onTap: () {
Navigator.of(context).push<void>(MaterialPageRoute<dynamic>(
builder: (BuildContext context) => Qrauth(),
));
},
),
ListTile(
title: Text('获取用户信息'),
onTap: () async {
if (_authResp != null && _authResp!.isSuccessful) {
final WechatAccessTokenResp accessTokenResp =
await WechatExtension.getAccessTokenUnionID(
appId: kWechatAppID,
appSecret: kWechatAppSecret,
code: _authResp!.code!,
);
if (accessTokenResp.isSuccessful) {
final WechatUserInfoResp userInfoResp =
await WechatExtension.getUserInfoUnionID(
openId: accessTokenResp.openid!,
accessToken: accessTokenResp.accessToken!,
);
if (userInfoResp.isSuccessful) {
_showTips('用户信息',
'${userInfoResp.nickname} - ${userInfoResp.sex}');
}
}
}
},
),
ListTile(
title: Text('文字分享'),
onTap: () {
WechatKitPlatform.instance.shareText(
scene: WechatScene.kTimeline,
text: 'Share Text',
);
},
),
ListTile(
title: Text('图片分享'),
onTap: () async {
final File file = await DefaultCacheManager().getSingleFile(
'https://www.baidu.com/img/bd_logo1.png?where=super');
await WechatKitPlatform.instance.shareImage(
scene: WechatScene.kSession,
imageUri: Uri.file(file.path),
);
},
),
ListTile(
title: Text('文件分享'),
onTap: () async {
final File file = await DefaultCacheManager().getSingleFile(
'https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf');
await WechatKitPlatform.instance.shareFile(
scene: WechatScene.kSession,
title: '测试文件',
fileUri: Uri.file(file.path),
fileExtension: path.extension(file.path),
);
},
),
ListTile(
title: Text('Emoji分享'),
onTap: () async {
final File file = await DefaultCacheManager().getSingleFile(
'https://n.sinaimg.cn/tech/transform/695/w467h228/20191119/bf27-iipztfe9404360.gif');
final image.Image thumbnail =
image.decodeImage(file.readAsBytesSync())!;
Uint8List thumbData = thumbnail.getBytes();
if (thumbData.length > 32 * 1024) {
thumbData = Uint8List.fromList(image.encodeJpg(thumbnail,
quality: 100 * 32 * 1024 ~/ thumbData.length));
}
await WechatKitPlatform.instance.shareEmoji(
scene: WechatScene.kSession,
thumbData: thumbData,
emojiUri: Uri.file(file.path),
);
},
),
ListTile(
title: Text('网页分享'),
onTap: () {
WechatKitPlatform.instance.shareWebpage(
scene: WechatScene.kTimeline,
webpageUrl: 'https://www.baidu.com',
);
},
),
ListTile(
title: Text('支付'),
onTap: () {
// 微信 Demo 例子https://wxpay.wxutil.com/pub_v2/app/app_pay.php
WechatKitPlatform.instance.pay(
appId: kWechatAppID,
partnerId: '商户号',
prepayId: '预支付交易会话ID',
package: '扩展字段,暂填写固定值Sign=WXPay',
nonceStr: '随机字符串, 随机字符串不长于32位',
timeStamp: '时间戳:东八区,单位秒',
sign: '签名',
);
},
),
ListTile(
title: Text('拉起小程序'),
onTap: () {
WechatKitPlatform.instance.launchMiniProgram(
userName: kWechatMiniAppID,
path: 'page/page/index?uid=123',
type: WechatMiniProgram.kPreview,
);
},
),
],
),
);
}
void _showTips(String title, String content) {
showDialog<void>(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(title),
content: Text(content),
);
},
);
}
}
class Qrauth extends StatefulWidget {
const Qrauth({
super.key,
});
@override
State<StatefulWidget> createState() {
return _QrauthState();
}
}
class _QrauthState extends State<Qrauth> {
late final StreamSubscription<WechatQrauthResp> _qrauthRespSubs;
Uint8List? _qrcode;
@override
void initState() {
super.initState();
_qrauthRespSubs =
WechatKitPlatform.instance.qrauthRespStream().listen(_listenQrauthResp);
}
void _listenQrauthResp(WechatQrauthResp resp) {
if (resp is WechatGotQrcodeResp) {
setState(() {
_qrcode = resp.imageData;
});
} else if (resp is WechatQrcodeScannedResp) {
if (kDebugMode) {
print('QrcodeScanned');
}
} else if (resp is WechatFinishResp) {
if (kDebugMode) {
print('resp: ${resp.errorCode} - ${resp.authCode}');
}
}
}
@override
void dispose() {
_qrauthRespSubs.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Qrauth'),
actions: <Widget>[
TextButton(
onPressed: () async {
final WechatAccessTokenResp accessToken =
await WechatExtension.getAccessToken(
appId: kWechatAppID,
appSecret: kWechatAppSecret,
);
if (kDebugMode) {
print(
'accessToken: ${accessToken.errorCode} - '
'${accessToken.errorMsg} - '
'${accessToken.accessToken}',
);
}
final WechatTicketResp ticket = await WechatExtension.getTicket(
accessToken: accessToken.accessToken!,
);
if (kDebugMode) {
print(
'accessToken: ${ticket.errorCode} - '
'${ticket.errorMsg} - '
'${ticket.ticket}',
);
}
await WechatKitPlatform.instance.startQrauth(
appId: kWechatAppID,
scope: <String>[WechatScope.kSNSApiUserInfo],
noncestr: Uuid().v1().replaceAll('-', ''),
ticket: ticket.ticket!,
);
},
child: Text('got qr code'),
),
],
),
body: GestureDetector(
child: Center(
child: _qrcode != null ? Image.memory(_qrcode!) : Text('got qr code'),
),
),
);
}
}