|
|
|
import 'dart:async';
|
|
|
|
import 'dart:convert';
|
|
|
|
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
|
|
|
|
import 'package:bot_toast/bot_toast.dart';
|
|
|
|
import 'package:fluwx/fluwx.dart';
|
|
|
|
import 'package:power_logger/power_logger.dart';
|
|
|
|
import 'package:tobias/tobias.dart';
|
|
|
|
|
|
|
|
import 'package:aku_new_community/models/pay/pay_model.dart';
|
|
|
|
import 'package:aku_new_community/models/pay/wx_pay_model.dart';
|
|
|
|
import 'package:aku_new_community/utils/network/base_model.dart';
|
|
|
|
import 'package:aku_new_community/utils/network/net_util.dart';
|
|
|
|
|
|
|
|
enum PAYTYPE {
|
|
|
|
///支付宝
|
|
|
|
ALI,
|
|
|
|
|
|
|
|
///微信
|
|
|
|
WX,
|
|
|
|
|
|
|
|
///现金
|
|
|
|
CASH,
|
|
|
|
|
|
|
|
///pos
|
|
|
|
POS
|
|
|
|
}
|
|
|
|
|
|
|
|
class PayUtil {
|
|
|
|
static final PayUtil _instance = PayUtil._();
|
|
|
|
|
|
|
|
factory PayUtil() => _instance;
|
|
|
|
|
|
|
|
PayUtil._();
|
|
|
|
///支付宝支付状态
|
|
|
|
void resultSatus(String status) {
|
|
|
|
switch (status) {
|
|
|
|
case '8000':
|
|
|
|
BotToast.showText(text: '正在处理中');
|
|
|
|
break;
|
|
|
|
case '4000':
|
|
|
|
BotToast.showText(text: '订单支付失败');
|
|
|
|
break;
|
|
|
|
case '5000':
|
|
|
|
BotToast.showText(text: '重复请求');
|
|
|
|
break;
|
|
|
|
case '6001':
|
|
|
|
BotToast.showText(text: ' 用户中途取消');
|
|
|
|
break;
|
|
|
|
case '6002':
|
|
|
|
BotToast.showText(text: '网络连接出错');
|
|
|
|
break;
|
|
|
|
case '6004':
|
|
|
|
BotToast.showText(text: '支付结果未知,请查询商户订单列表中订单的支付状态');
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
BotToast.showText(text: '其他支付错误');
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
String _resultStatus = '';
|
|
|
|
///支付宝支付
|
|
|
|
///传入订单信息和确认订单请求地址
|
|
|
|
Future<bool> callAliPay(String order, String apiPath) async {
|
|
|
|
var install = await isAliPayInstalled();
|
|
|
|
if (!install) {
|
|
|
|
BotToast.showText(text: '未安装支付宝!');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
Map<dynamic, dynamic> result = {};
|
|
|
|
try {
|
|
|
|
result = await aliPay(order);
|
|
|
|
} catch (e) {
|
|
|
|
print(e.toString());
|
|
|
|
}
|
|
|
|
_resultStatus = result['resultStatus'];
|
|
|
|
if (_resultStatus == '9000') {
|
|
|
|
String _res = result['result'];
|
|
|
|
PayModel _model = PayModel.fromJson(jsonDecode(_res));
|
|
|
|
bool _confirmResult = await _confirmPayResult(
|
|
|
|
apiPath, _model.aliPayTradeAppPayResponse.outTradeNo);
|
|
|
|
return _confirmResult;
|
|
|
|
} else {
|
|
|
|
resultSatus(_resultStatus);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//支付宝支付确认查询方法
|
|
|
|
Future<bool> _confirmPayResult(String path, String code) async {
|
|
|
|
try {
|
|
|
|
late BaseModel base;
|
|
|
|
for (var i = 0; i < 3; i++) {
|
|
|
|
await Future.delayed(Duration(milliseconds: 1000), () async {
|
|
|
|
base = await NetUtil().get(path, params: {
|
|
|
|
"code": code,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if (base.success) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (base.success) {
|
|
|
|
BotToast.showText(text: '交易成功');
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
BotToast.showText(text: '交易失败');
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
BotToast.showText(text: '网络请求错误');
|
|
|
|
LoggerData.addData(e);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
///微信支付
|
|
|
|
|
|
|
|
StreamSubscription? _wxPayStream;
|
|
|
|
///添加微信支付结果监听
|
|
|
|
void wxPayAddListener(
|
|
|
|
{required VoidCallback paySuccess,
|
|
|
|
Function(BaseWeChatResponse)? payError}) {
|
|
|
|
_wxPayStream = weChatResponseEventHandler.listen((event) {
|
|
|
|
if (kDebugMode) {
|
|
|
|
print('errorCode:${event.errCode} errorStr:${event.errStr}');
|
|
|
|
}
|
|
|
|
if (event.errCode == 0) {
|
|
|
|
paySuccess();
|
|
|
|
} else {
|
|
|
|
LoggerData.addData(
|
|
|
|
'errorCode:${event.errCode} errorStr:${event.errStr ?? '支付失败'}');
|
|
|
|
BotToast.showText(text: event.errStr ?? '支付失败');
|
|
|
|
payError == null ? null : payError(event);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
///移除微信支付监听
|
|
|
|
void removeWxPayListener() {
|
|
|
|
_wxPayStream?.cancel();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future callWxPay({
|
|
|
|
required WxPayModel payModel,
|
|
|
|
}) async {
|
|
|
|
await payWithWeChat(
|
|
|
|
appId: 'wx9bc3ffb23a749254',
|
|
|
|
partnerId: payModel.partnerId,
|
|
|
|
prepayId: payModel.prepayId,
|
|
|
|
packageValue: payModel.package,
|
|
|
|
nonceStr: payModel.nonceStr,
|
|
|
|
timeStamp: int.parse(payModel.timeStamp),
|
|
|
|
sign: payModel.sign);
|
|
|
|
}
|
|
|
|
}
|