Commit 24c81ee0 by ethanlamzs

处理微信支付问题

1 parent dfb1fcfe
...@@ -48,9 +48,9 @@ if [ ! -z "$_rebuild_" ]; then ...@@ -48,9 +48,9 @@ if [ ! -z "$_rebuild_" ]; then
fi fi
#16 #16
#flutter run --dart-define=env=$env --dart-define=version=$_main_ver$_ver -d 00008140-001068C93AB8801C flutter run --dart-define=env=$env --dart-define=version=$_main_ver$_ver -d 00008140-001068C93AB8801C
#11 #11
flutter run --dart-define=env=$env --dart-define=version=$_main_ver$_ver -d 00008030-001C75810E42402E #flutter run --dart-define=env=$env --dart-define=version=$_main_ver$_ver -d 00008030-001C75810E42402E
...@@ -161,7 +161,8 @@ class AccountCubit extends Cubit<AccountState> { ...@@ -161,7 +161,8 @@ class AccountCubit extends Cubit<AccountState> {
Future<void> goLogoff() async { Future<void> goLogoff() async {
await router.push( await router.push(
'/account/logoff', //'/account/logoff',
'/iosbuytest',
extra: { extra: {
'phone': state.phone, 'phone': state.phone,
}, },
......
...@@ -13,6 +13,10 @@ class SubscriptionService { ...@@ -13,6 +13,10 @@ class SubscriptionService {
static const String monthlySubId_2 = 'cn.banxe.appframe.membership.2m'; static const String monthlySubId_2 = 'cn.banxe.appframe.membership.2m';
static const String monthlySubId_3 = 'cn.banxe.appframe.membership.3m'; static const String monthlySubId_3 = 'cn.banxe.appframe.membership.3m';
// 纯粹的数据容器,不继承任何类
final Map<String, Map<String, dynamic>> _pendingContexts = {};
final Map<String, String> _orderIdMap = {}; // key: productID, value: orderId
final InAppPurchase _iap = InAppPurchase.instance; final InAppPurchase _iap = InAppPurchase.instance;
late StreamSubscription<List<PurchaseDetails>> _purchaseUpdatedSubscription; late StreamSubscription<List<PurchaseDetails>> _purchaseUpdatedSubscription;
...@@ -64,7 +68,14 @@ class SubscriptionService { ...@@ -64,7 +68,14 @@ class SubscriptionService {
} }
// ---------- 购买订阅 ---------- // ---------- 购买订阅 ----------
Future<bool> buySubscription(ProductDetails product) async { Future<bool> buySubscription(ProductDetails product, String userId , String tbxStuId) async {
//final orderId = await api.createPendingOrder(...);
final orderId = "";
_pendingContexts[product.id] = {'userId': userId,'tbxStuId': tbxStuId,"orderId":orderId};
_orderIdMap[product.id] = orderId; // 按产品 ID 存储
// 订阅必须使用 PurchaseParam 并设置购买类型为订阅 // 订阅必须使用 PurchaseParam 并设置购买类型为订阅
final PurchaseParam purchaseParam = PurchaseParam( final PurchaseParam purchaseParam = PurchaseParam(
productDetails: product, productDetails: product,
...@@ -88,6 +99,7 @@ class SubscriptionService { ...@@ -88,6 +99,7 @@ class SubscriptionService {
if (!_isSubscription(purchaseDetails.productID)) continue; if (!_isSubscription(purchaseDetails.productID)) continue;
// 根据交易状态处理 // 根据交易状态处理
debugPrint("[info] _onPurchaseUpdate status is "+ purchaseDetails.status.toString());
switch (purchaseDetails.status) { switch (purchaseDetails.status) {
case PurchaseStatus.pending: case PurchaseStatus.pending:
// 等待支付确认(例如需要家长批准),不做处理 // 等待支付确认(例如需要家长批准),不做处理
...@@ -95,8 +107,10 @@ class SubscriptionService { ...@@ -95,8 +107,10 @@ class SubscriptionService {
case PurchaseStatus.purchased: case PurchaseStatus.purchased:
// 购买成功或续期成功 // 购买成功或续期成功
final orderId = _orderIdMap.remove(purchaseDetails.productID); // 取出并删除
// 1. 验证收据(必须!) // 1. 验证收据(必须!)
_verifyReceipt(purchaseDetails); _verifyReceipt(purchaseDetails,orderId??'');
// 2. 通知 App Store 交易完成 // 2. 通知 App Store 交易完成
_iap.completePurchase(purchaseDetails); _iap.completePurchase(purchaseDetails);
break; break;
...@@ -109,7 +123,7 @@ class SubscriptionService { ...@@ -109,7 +123,7 @@ class SubscriptionService {
case PurchaseStatus.restored: case PurchaseStatus.restored:
// 恢复购买成功 // 恢复购买成功
_verifyReceipt(purchaseDetails); _verifyReceipt(purchaseDetails,"");
_iap.completePurchase(purchaseDetails); _iap.completePurchase(purchaseDetails);
break; break;
...@@ -122,25 +136,28 @@ class SubscriptionService { ...@@ -122,25 +136,28 @@ class SubscriptionService {
} }
// ---------- 服务端验证收据 ---------- // ---------- 服务端验证收据 ----------
Future<void> _verifyReceipt(PurchaseDetails purchaseDetails) async { Future<void> _verifyReceipt(PurchaseDetails purchaseDetails,String orderid) async {
if (purchaseDetails.verificationData.serverVerificationData.isEmpty) { if (purchaseDetails.verificationData.serverVerificationData.isEmpty) {
debugPrint('无收据数据'); debugPrint('无收据数据');
return; return;
} }
debugPrint("[info] _verifyReceipt is start "+purchaseDetails.productID +" : "+purchaseDetails.toString());
// 将收据发送到你的后端进行验证 // 将收据发送到你的后端进行验证
final String receipt = purchaseDetails.verificationData.serverVerificationData; final String receipt = purchaseDetails.verificationData.serverVerificationData;
final bool isValid = await _sendReceiptToBackend(receipt); final bool isValid = await _sendReceiptToBackend(receipt);
debugPrint("[info] _verifyReceipt is step 1 ");
if (isValid) { if (isValid) {
// 更新本地订阅状态 // 更新本地订阅状态
_hasActiveSubscription = true; _hasActiveSubscription = true;
// 保存到期时间等信息 // 保存到期时间等信息
} }
debugPrint("[info] _verifyReceipt is done ");
} }
// 示例:发送收据到自己的服务器进行二次验证 // 示例:发送收据到自己的服务器进行二次验证
Future<bool> _sendReceiptToBackend(String receipt) async { Future<bool> _sendReceiptToBackend(String receipt) async {
/*
try { try {
final response = await http.post( final response = await http.post(
Uri.parse('https://your-server.com/api/verify_receipt'), Uri.parse('https://your-server.com/api/verify_receipt'),
...@@ -159,6 +176,9 @@ class SubscriptionService { ...@@ -159,6 +176,9 @@ class SubscriptionService {
debugPrint('验证收据失败: $e'); debugPrint('验证收据失败: $e');
return false; return false;
} }
*/
debugPrint("[info] _sendReceiptToBackend is done receipt is "+receipt);
return true;
} }
// ---------- 恢复购买 ---------- // ---------- 恢复购买 ----------
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!