Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
book-app
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
book-app
Commits
16a2c166
提交
16a2c166
authored
1月 30, 2024
作者:
yueweilu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
充值逻辑
上级
d8570616
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
303 行增加
和
10 行删除
+303
-10
Podfile.lock
ios/Podfile.lock
+9
-0
mine.dart
lib/apis/mine.dart
+18
-0
shop.dart
lib/apis/shop.dart
+5
-5
shop.dart
lib/models/shop.dart
+27
-0
controller.dart
lib/pages/book_pay/controller.dart
+3
-2
controller.dart
lib/pages/user_coin_recharge/controller.dart
+210
-1
index.dart
lib/pages/user_coin_recharge/index.dart
+7
-0
index.dart
lib/services/index.dart
+1
-0
storage.dart
lib/services/storage.dart
+10
-0
constants.dart
lib/utils/constants.dart
+3
-2
pubspec.lock
pubspec.lock
+8
-0
pubspec.yaml
pubspec.yaml
+2
-0
没有找到文件。
ios/Podfile.lock
浏览文件 @
16a2c166
...
...
@@ -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
...
...
lib/apis/mine.dart
浏览文件 @
16a2c166
...
...
@@ -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
);
}
}
lib/apis/shop.dart
浏览文件 @
16a2c166
...
...
@@ -134,19 +134,19 @@ abstract class ShopAPI {
}
/// 9、获取订单状态
static
Future
<
boo
l
>
orderStatus
({
static
Future
<
OrderStatusMode
l
>
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
);
}
...
...
lib/models/shop.dart
浏览文件 @
16a2c166
...
...
@@ -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
lib/pages/book_pay/controller.dart
浏览文件 @
16a2c166
...
...
@@ -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
(
'订单支付完成'
);
}
}
...
...
lib/pages/user_coin_recharge/controller.dart
浏览文件 @
16a2c166
...
...
@@ -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
lib/pages/user_coin_recharge/index.dart
浏览文件 @
16a2c166
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'
;
...
...
lib/services/index.dart
浏览文件 @
16a2c166
library
services
;
import
'dart:async'
;
import
'dart:convert'
;
import
'package:dio/dio.dart'
;
import
'package:flutter_book/store/index.dart'
;
...
...
lib/services/storage.dart
浏览文件 @
16a2c166
...
...
@@ -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
{
...
...
lib/utils/constants.dart
浏览文件 @
16a2c166
...
...
@@ -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'
;
...
...
pubspec.lock
浏览文件 @
16a2c166
...
...
@@ -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:
...
...
pubspec.yaml
浏览文件 @
16a2c166
...
...
@@ -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
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论