提交 16a2c166 authored 作者: yueweilu's avatar yueweilu

充值逻辑

上级 d8570616
......@@ -36,6 +36,11 @@ PODS:
- shared_preferences_foundation (0.0.1):
- Flutter
- FlutterMacOS
- tobias (0.0.1):
- Flutter
- tobias/normal (= 0.0.1)
- tobias/normal (0.0.1):
- Flutter
- WechatOpenSDK-XCFramework (2.0.2)
DEPENDENCIES:
......@@ -51,6 +56,7 @@ DEPENDENCIES:
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- tobias (from `.symlinks/plugins/tobias/ios`)
SPEC REPOS:
trunk:
......@@ -83,6 +89,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/permission_handler_apple/ios"
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
tobias:
:path: ".symlinks/plugins/tobias/ios"
SPEC CHECKSUMS:
audio_session: 4f3e461722055d21515cf3261b64c973c062f345
......@@ -99,6 +107,7 @@ SPEC CHECKSUMS:
path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
tobias: 22f69183b14af82a2ac8ff698af084c352744e5f
WechatOpenSDK-XCFramework: acdeeda129efbef9532bca8a10c24e1b4b8c7d69
PODFILE CHECKSUM: d88b567994d32cfdf2f8417e66666d472921c85e
......
......@@ -366,5 +366,23 @@ abstract class MineAPI {
}
return false;
}
/// 20、紫荆币充值创建订单
static Future<PayOrderModel> createRechargeOrder(
{
required String identifying,
required String type,
}) async {
final result = await HttpService.to.post(
'/v1/orders/Orders/createBeanorders',
params: {
'type': type,
'identifying': identifying,
},
);
if (result.data is! Map) return PayOrderModel();
return PayOrderModel.fromJson(result.data);
}
}
......@@ -134,19 +134,19 @@ abstract class ShopAPI {
}
/// 9、获取订单状态
static Future <bool> orderStatus({
static Future <OrderStatusModel> orderStatus({
required String orderNumber,
required String receipt
}) async {
final result = await HttpService.to.post(
'/v1/orders/Orders/getOrdersStatus',
params: {
'ordersnum':orderNumber,
'receipt':receipt
},
);
if (result.data is Map && result.data['pay_success'] == 1){
return true;
}
return false;
if (result.data is! Map ) return OrderStatusModel();
return OrderStatusModel.fromJson(result.data);
}
......
......@@ -236,4 +236,30 @@ class PayOrderModel {
return map;
}
}
/// 订单状态模型
class OrderStatusModel {
OrderStatusModel({
this.paySuccess,
this.ordersnum,});
OrderStatusModel.fromJson(dynamic json) {
paySuccess = json['pay_success'];
ordersnum = json['ordersnum'];
}
num? paySuccess;
String? ordersnum;
OrderStatusModel copyWith({ num? paySuccess,
String? ordersnum,
}) => OrderStatusModel( paySuccess: paySuccess ?? this.paySuccess,
ordersnum: ordersnum ?? this.ordersnum,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['pay_success'] = paySuccess;
map['ordersnum'] = ordersnum;
return map;
}
}
\ No newline at end of file
......@@ -29,6 +29,7 @@ class BookPayController extends GetxController {
// 支付宝
Tobias tobias = Tobias();
// 微信
Fluwx fluwx = Fluwx();
// 时候展示底部视图
......@@ -245,8 +246,8 @@ class BookPayController extends GetxController {
}
void requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'');
if (result){
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'',receipt: '');
if (result.paySuccess == 1){
Toast.show('订单支付完成');
}
}
......
......@@ -2,6 +2,26 @@ part of recharge;
class CoinRechargeController extends GetxController {
late dynamic _purchaseUpdatedSubscription;
late dynamic _purchaseErrorSubscription;
late dynamic _connectionSubscription;
late int _buyIndex;
late PurchasedItem _resultItem;
List<IAPItem> _items = [];
List<PurchasedItem> _purchases = [];
///未完成的订单
List<PurchasedItem> _pendingPurchases = [];
// 支付宝
Tobias tobias = Tobias();
// 微信
Fluwx fluwx = Fluwx();
// 创建订单模型
late PayOrderModel payOrderModel;
List<PayModel> pays = Platform.isIOS ?[
]:[
PayModel(type: 1, name: '微信', icon: 'assets/images/pay_wechat.png', selected: true),
......@@ -16,12 +36,28 @@ class CoinRechargeController extends GetxController {
late PayModel _payModel = pays.first;
PayModel get payModel => _payModel;
@override
void onInit() {
initPlatformState();
_getProduct();
_getPendingPurchase();
super.onInit();
}
@override
void onReady() {
_getlist();
super.onReady();
}
@override
void onClose() {
if (_connectionSubscription != null) {
_connectionSubscription.cancel();
_connectionSubscription = null;
}
super.onClose();
}
void setPayModel(PayModel payModel){
for (PayModel model in pays) {
......@@ -41,11 +77,12 @@ class CoinRechargeController extends GetxController {
model.selected = (model == coinModel);
}
rechargeModel = coinModel;
_buyIndex = data.indexOf(coinModel);
update();
}
/// 获取充值列表
void _getlist()async{
String type = '';
if(Platform.isIOS){
......@@ -56,8 +93,179 @@ class CoinRechargeController extends GetxController {
}
final result = await MineAPI.coinsRechargeList(type: type);
data = result;
_getProduct();
update();
}
Future<void> initPlatformState() async{
var result = await FlutterInappPurchase.instance.initialize();
try {
String msg = await FlutterInappPurchase.instance.consumeAll();
print('consumeAllItems: $msg');
} catch (err) {
print('consumeAllItems error: $err');
}
_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());
});
}
/// 获取商品列表
Future _getProduct() async {
List<String> productList = data
.where((coinModel) => coinModel.identifying != null)
.map((coinModel) => coinModel.identifying!)
.toList();
List<IAPItem> items = await FlutterInappPurchase.instance.getProducts(productList);
for (var item in items) {
_items.add(item);
}
_items = items;
_purchases = [];
update();
}
/// 创建订单
void _createRechargeOrder() async {
final result = await MineAPI.createRechargeOrder(identifying: rechargeModel.identifying??'', type: payModel.type.toString());
payOrderModel = result;
// 创建订单成功开启支付流程
if (payOrderModel.ordersnum !=null){
if(payOrderModel.ordersnum!.isNotEmpty){
// 苹果
if(Platform.isIOS){
// 发起苹果支付
_requestPurchase(_items[_buyIndex]);
}
// 安卓
else if(Platform.isAndroid){
}
}
}
}
/// 获取后台关于当前单号的结算结果
void _requestOrderStatus() async {
final result = await ShopAPI.orderStatus(orderNumber: payOrderModel.ordersnum??'',receipt:_resultItem.transactionReceipt.toString());
// 查询订单支付成功
if (result.paySuccess == 1){
Toast.show('购买紫荆币成功');
if (Platform.isIOS){
// 清除
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(Platform.isIOS){
// 保存未支付的订单
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);
}
else {
}
}
}
/// 苹果支付
void _requestPurchase(IAPItem item) {
CustomToast.loading();
FlutterInappPurchase.instance
.requestPurchase(item.productId!);
}
/// 支付宝支付
void requestAliPay(){
tobias.pay(payOrderModel.encryptionOrder!).then((payResult){
if (payResult['resultStatus'] == '9000') {
_requestOrderStatus();
} else {
Toast.show(payResult['memo'].toString());
}
});
}
/// 微信支付
void requestWechat(){
Payment payment = Payment(
appId: payOrderModel.appid??'',
partnerId: payOrderModel.partnerid??'',
prepayId: payOrderModel.prepayid??'',
packageValue: payOrderModel.package??'',
nonceStr: payOrderModel.noncestr??'',
timestamp: payOrderModel.timestamp!.toInt(),
sign: payOrderModel.sign??''
);
fluwx.pay(which: payment);
fluwx.addSubscriber((response) {
if (response.errCode == 0) {
_requestOrderStatus();
}
else{
Toast.show('${response.errStr}');
}
});
}
///获取未完成的购买
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();
}
}
}
}
}
}
\ No newline at end of file
library recharge;
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_book/apis/index.dart';
import 'package:flutter_book/models/index.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_inapp_purchase/flutter_inapp_purchase.dart';
import 'package:flutter_inapp_purchase/modules.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fluwx/fluwx.dart';
import 'package:get/get.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:go_router/go_router.dart';
import 'package:tobias/tobias.dart';
import '../../services/index.dart';
import '../../utils/index.dart';
import '../../widgets/index.dart';
import '../book_pay/index.dart';
......
library services;
import 'dart:async';
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter_book/store/index.dart';
......
......@@ -26,6 +26,11 @@ class StorageService extends GetxService {
return await _prefs.setStringList(key, value);
}
///存储Object
Future<bool>? setObject(String key, Object value) {
return _prefs.setString(key, json.encode(value));
}
///获取字符串
String getString(String key) {
return _prefs.getString(key) ?? '';
......@@ -40,6 +45,11 @@ class StorageService extends GetxService {
List<String> getList(String key) {
return _prefs.getStringList(key) ?? [];
}
/// 获取object
Map? getObject(String key) {
String? data = _prefs.getString(key);
return (data == null || data.isEmpty) ? null : json.decode(data);
}
///移除key
Future<bool> remove(String key) async {
......
......@@ -2,14 +2,15 @@ part of utils;
// 服务器地址
// const String kServerUrl = 'https://app.vning.com';
const String kServerUrl = 'http://192.168.11.88:81';
// const String kServerUrl = 'http://192.168.11.88:81';
const String kServerUrl = 'http://1507.superge.cn:81';
const String kLocalToken = 'local_token';
const String kLocalAccessToken = 'local_access_token';
const String kLocalAccount = 'local_account';
const String kLocalPassword = 'local_password';
const String kLocalUserInfo = 'local_user_info';
const String kSearchHistory = 'search_history';
const String kFailOrder = 'failOrder';
......
......@@ -190,6 +190,14 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.0.5"
flutter_inapp_purchase:
dependency: "direct main"
description:
name: flutter_inapp_purchase
sha256: d67544e703439feefe91cab9cb4920cffc0f1576f7ce51a78e3a0a3c5f7d3f1e
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.6.1"
flutter_inappwebview:
dependency: "direct main"
description:
......
......@@ -101,6 +101,8 @@ dependencies:
azlistview: ^2.0.0
# 支付宝
tobias: ^3.3.0
# 内购
flutter_inapp_purchase: ^5.6.1
dev_dependencies:
flutter_test:
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论