yaml文件中引入
dependencies:
fluwx: ^3.11.0+1
dart文件中引入
import 'package:fluwx/fluwx.dart';
初始化时候检查微信是否安装
@override
void initState() {
super.initState();
_initFluwx();
}
_initFluwx() async {
await registerWxApi(
appId: 'wxd930ea5d5a258f4f',
doOnAndroid: true,
doOnIOS: true,
universalLink: 'https://your.univerallink.com/link/',
);
var result = await isWeChatInstalled;
print('is installed $result');
}
请求后端接口需要设置参数,填入即可
fluwx
.payWithWeChat(
appId: result['appid'].toString(),
partnerId: result['partnerid'].toString(),
prepayId: result['prepayid'].toString(),
packageValue: result['package'].toString(),
nonceStr: result['noncestr'].toString(),
timeStamp: result['timestamp'],
sign: result['sign'].toString(),
)
监听微信端返回数据
fluwx.weChatResponseEventHandler.listen((event) {
if (event is fluwx.WeChatPaymentResponse) {
if (event.errCode == 0) {
print("展示页面成功");
} else {
print("微信支付失败");
}
}
});
注意
监听需要在整个页面结束之后注销,因为每次打开页面listen被多次赋值?导致之前的listen
也被调用,打开过多少次就有多少个listen被调用,Stream需要在dispose注销掉,本身第三方没有提供注销方式,需要自定义一个数据流接受控制,流中提供的ondata方法可以执行回调结果,但是会回调n次,还提供了一个ondone方法在数据流完成时候调用一次ondone方法,但是在微信监听过程是一个持续性的。
bool isPay = await Unity.payWechat(sealPrice);
怎么解决?
使用方式
定义数据流监听
StreamSubscription subscription ;
初始化执行
_payListen = fluwx.weChatResponseEventHandler.listen((event) {
if (event is fluwx.WeChatPaymentResponse) {
if (event.errCode == 0) {
print("展示页面成功");
} else {
print("微信支付失败");
}
}
});
页面销毁
_payListen?.cancel();
单例模式
import 'dart:async';
import 'package:fluwx/fluwx.dart' as fluwx;
class WePay{
//单例
static WePay _instance;
static StreamSubscription subscription ;
WePay._();
static WePay getInstance() {
if (_instance == null) {
_instance = WePay._();
}
return _instance;
}
StreamSubscription subscribe<T extends fluwx.BaseWeChatResponse>(onData(T event),
{Function onError, void onDone(), bool cancelOnError}) {
subscription = fluwx.weChatResponseEventHandler.listen(onData)
return subscription;
}
//关闭流
void unsubscribe(StreamSubscription subscription) {
subscription.cancel();
}
}
payListen = WePay.getInstance().subscribe((statusData) {
if (statusData is fluwx.WeChatPaymentResponse)
if (statusData.errCode == 0) {
print("展示页面成功");
}else{
print("微信支付失败");
}
}
});
也可以做成请求后端查看是否支付成功
优化:禁用按钮 如果前后端改成未支付的订单还能继续支付 不需要禁用按钮
参考资料
StreamSubscription
源文档fluwx
讨论