提交 b998c664 authored 作者: yueweilu's avatar yueweilu

二次支付

上级 ed1ad4ac
......@@ -162,7 +162,7 @@ class CoinRechargeController extends GetxController {
}
final result = await MineAPI.createRechargeOrder(identifying: rechargeModel.identifying??'', type: type);
print('-----------------------------------${result.ordersnum}--------------------------------${result.msg}');
Console.log('-----------------------------------${result.ordersnum}--------------------------------${result.msg}');
payOrderModel = result;
// 创建订单成功开启支付流程
if (payOrderModel.ordersnum !=null){
......
......@@ -136,7 +136,9 @@ class UserOrderAwaitingController extends GetxController {
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'',receipt: '');
if (result.paySuccess == 1){
Toast.show('订单支付完成');
context.pop();
if(context.mounted){
context.pop(true);
}
}
}
......
......@@ -18,6 +18,7 @@ import 'package:tobias/tobias.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../routes/index.dart';
import '../user_order/index.dart';
part 'view.dart';
part 'controller.dart';
\ No newline at end of file
......@@ -3,9 +3,9 @@ part of user_order_coin_awaiting;
/// 紫荆币等待付款订单
class UserOrderCoinAwaitingController extends GetxController {
late String _orderNum;
final BuildContext context;
String get orderNum => _orderNum; // 获取订单编号的方法
UserOrderCoinAwaitingController();
UserOrderCoinAwaitingController(this.context);
// 更新订单编号的方法
void updateOrderNum(String newOrderNum) {
_orderNum = newOrderNum;
......@@ -22,12 +22,77 @@ class UserOrderCoinAwaitingController extends GetxController {
late PayOrderModel payOrderModel;
dynamic _purchaseUpdatedSubscription;
dynamic _purchaseErrorSubscription;
dynamic _connectionSubscription;
PurchasedItem? _resultItem;
List<IAPItem> _items = [];
List<PurchasedItem> _purchases = [];
///未完成的订单
List<PurchasedItem> _pendingPurchases = [];
List<CoinModel> data = [];
@override
void onInit() {
if(Platform.isIOS){
_getProduct();
initPlatformState();
_getPendingPurchase();
}
super.onInit();
}
@override
void onReady() {
getOrderInfo();
super.onReady();
}
@override
void onClose() {
if (_connectionSubscription != null) {
_connectionSubscription.cancel();
_connectionSubscription = null;
}
if (_purchaseUpdatedSubscription != null) {
_purchaseUpdatedSubscription.cancel();
_purchaseUpdatedSubscription = null;
}
if (_purchaseErrorSubscription != null) {
_purchaseErrorSubscription.cancel();
_purchaseErrorSubscription = null;
}
super.onClose();
}
Future<void> initPlatformState() async{
var result = await FlutterInappPurchase.instance.initialize();
print('--------------initPlatformState-------------------------$result');
_connectionSubscription = FlutterInappPurchase.connectionUpdated.listen((connected) {
print('connected: $connected');
});
_purchaseUpdatedSubscription = FlutterInappPurchase.purchaseUpdated.listen((productItem) {
CustomToast.dismiss();
if(productItem != null){
_resultItem = productItem;
requestOrderStatus();
}
});
_purchaseErrorSubscription = FlutterInappPurchase.purchaseError.listen((purchaseError) {
CustomToast.dismiss();
Toast.show(purchaseError!.message.toString());
});
}
/// 取消订单
void cancelPay() async {
final result = await MineAPI.cancelPay(ordersnum: orderNum);
......@@ -39,6 +104,8 @@ class UserOrderCoinAwaitingController extends GetxController {
/// 获取订单信息
Future<void> getOrderInfo() async {
data.clear();
model = await MineAPI.getOrderInfo(orderNum: orderNum);
String payWay ='';
if(model.payType==1){
......@@ -54,16 +121,41 @@ class UserOrderCoinAwaitingController extends GetxController {
OrderCompletedModel(name: '支付时间',value: model.payTime.toString()),
];
data.add(CoinModel(identifying:model.goodsId));
update();
}
/// 获取商品列表
Future _getProduct() async {
List<String> productList = data
.where((coinModel) => coinModel.identifying != null)
.map((coinModel) => coinModel.identifying!)
.toList();
print('-------------productList-------------------$productList');
List<IAPItem> items = await FlutterInappPurchase.instance.getProducts(productList);
for (var item in items) {
_items.add(item);
}
print('-------------_items-------------------$items');
_items = items;
_purchases = [];
// update();
}
Future<void> payOrder() async {
if (model.payType == 3){
final result = await MineAPI.coinPay(ordersNum: orderNum);
if (result){
Toast.show('订单支付完成');
getOrderInfo();
}
// 苹果支付
if (model.payType ==3){
// 发起苹果支付
IAPItem targetItem = _items.firstWhere(
(item) => item.productId == model.goodsId,
);
_requestPurchase(targetItem);
}
else{
payOrderModel = await MineAPI.getPayInfo(ordersNum: orderNum);
......@@ -78,7 +170,7 @@ class UserOrderCoinAwaitingController extends GetxController {
}
}
// 微信
if (model.payType ==1){
else if (model.payType ==1){
final result = await fluwx.isWeChatInstalled;
if(!result){
Toast.show('请先安装微信');
......@@ -88,11 +180,20 @@ class UserOrderCoinAwaitingController extends GetxController {
}
}
}
}
// 苹果支付
void _requestPurchase(IAPItem item) {
CustomToast.loading();
FlutterInappPurchase.instance
.requestPurchase(item.productId!);
}
// 支付宝支付
void requestAliPay(){
print('================================================================${payOrderModel.encryptionOrder!}');
Console.log('================================================================${payOrderModel.encryptionOrder!}');
tobias.pay(payOrderModel.encryptionOrder!).then((payResult){
if (payResult['resultStatus'] == '9000') {
requestOrderStatus();
......@@ -125,14 +226,63 @@ class UserOrderCoinAwaitingController extends GetxController {
}
void requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'',receipt: '');
final result = await ShopAPI.orderStatus(orderNumber: model.ordersnum??'',receipt:_resultItem != null?_resultItem!.transactionReceipt.toString():'');
if (result.paySuccess == 1){
Toast.show('订单支付完成');
getOrderInfo();
if(context.mounted){
context.pop(true);
}
if (model.payType == 3){
// 清除
if (StorageService.to.getObject(kFailOrder) != null){
List<Map<String,String>> failOrderList = StorageService.to.getObject(kFailOrder) as List<Map<String, String>>;
List<Map<String,String>> temp = [];
temp.addAll(failOrderList);
for (var element in failOrderList) {
if(element['orderNum'] == result.ordersnum){
temp.remove(element);
}
}
StorageService.to.setObject(kFailOrder, temp);
}
FlutterInappPurchase.instance.finishTransactionIOS(_resultItem!.transactionId!);
}
}
else{
Toast.show('支付失败');
if (model.payType == 3){
// 保存未支付的订单
Map<String,String> failOrder = {
'orderNum':payOrderModel.ordersnum??'',
'transactionReceipt':_resultItem!.transactionReceipt.toString(),
'transactionId':_resultItem!.transactionId.toString()
};
List<Map> failOrderList = [];
failOrderList.add(failOrder);
StorageService.to.setObject(kFailOrder, failOrderList);
}
}
}
///获取未完成的购买
Future _getPendingPurchase() async {
List<PurchasedItem>? items = await FlutterInappPurchase.instance.getPurchaseHistory();
for (var item in items!) {
_pendingPurchases.add(item);
}
if(StorageService.to.getObject(kFailOrder) !=null){
List<Map<String,String>> failOrderList = StorageService.to.getObject(kFailOrder) as List<Map<String, String>>;
for (var item in _pendingPurchases) {
for (var element in failOrderList) {
if(element['transactionId'] == item.transactionId){
requestOrderStatus();
}
}
}
}
}
......
library user_order_coin_awaiting;
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'package:flutter_inapp_purchase/modules.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
......@@ -14,6 +18,8 @@ import 'package:tobias/tobias.dart';
import '../../apis/index.dart';
import '../../models/index.dart';
import '../../services/index.dart';
import '../user_order/index.dart';
part 'view.dart';
part 'controller.dart';
\ No newline at end of file
......@@ -16,7 +16,7 @@ class _UserOrderCoinAwaitingState extends State<UserOrderCoinAwaitingPage> {
@override
void initState() {
myController = Get.put(UserOrderCoinAwaitingController());
myController = Get.put(UserOrderCoinAwaitingController(context));
myController.updateOrderNum(widget.orderNum);
super.initState();
}
......@@ -176,27 +176,27 @@ class _UserOrderCoinAwaitingState extends State<UserOrderCoinAwaitingPage> {
SizedBox(
height: 11.5.w,
),
Container(
margin: EdgeInsets.symmetric(horizontal: 15.w),
height: 40.w,
decoration: BoxDecoration(
color: AppTheme.primary,
borderRadius: BorderRadius.circular(180.w),
border: Border.all(
color: Colours.cC31F4C, width: 0.5.w)),
child: Center(
child: GestureDetector(
onTap: () {
// print("保存昵称");
// context.pushNamed(Routes.orderEvaluate);
},
child: Text(
'立即支付 ¥${myController.model.finalTotalPrice}',
style: TextStyle(
fontWeight: Fonts.medium,
fontSize: 14.w,
color: Colours.cFF),
)),
GestureDetector(
onTap: (){
myController.payOrder();
},
child: Container(
margin: EdgeInsets.symmetric(horizontal: 15.w),
height: 40.w,
decoration: BoxDecoration(
color: AppTheme.primary,
borderRadius: BorderRadius.circular(180.w),
border: Border.all(
color: Colours.cC31F4C, width: 0.5.w)),
child: Center(
child: Text(
'立即支付 ¥${myController.model.finalTotalPrice}',
style: TextStyle(
fontWeight: Fonts.medium,
fontSize: 14.w,
color: Colours.cFF),
),
),
),
),
SizedBox(
......
......@@ -91,9 +91,9 @@ class ValidatorTool {
// 密码
static bool isValidPassword(String value) {
// RegExp passwordPattern = RegExp(r'^[A-Za-z0-9!@#\$%^&*()_+{}\[\]:;<>,.?~\\/-]{8,12}$');
RegExp passwordPattern = RegExp(r'^[A-Za-z0-9!@#\$%^&*()_+{}\[\]:;<>,.?~\\/-]{8,12}$');
// RegExp passwordPattern = RegExp(r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[~@#%$*()_+{}\[\]:;<>,.?\\/-])[A-Za-z0-9~@#%$*()_+{}\[\]:;<>,.?\\/-]{8,12}$');
RegExp passwordPattern = RegExp(r'^\d{6}$');
// RegExp passwordPattern = RegExp(r'^\d{6}$');
return passwordPattern.hasMatch(value);
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论