Commit c281ea4f by ethanlamzs

更换验证方法

1 parent e876571d
import UIKit
import Flutter
import StoreKit
// Add these two import lines
import TIMPush
......@@ -22,22 +21,6 @@ import tencent_cloud_chat_push
fatalError("rootViewController is not a FlutterViewController")
}
let channel = FlutterMethodChannel(
name: "cn.banxe.appframe/receipt",
binaryMessenger: controller.binaryMessenger
)
channel.setMethodCallHandler { (call, result) in
switch call.method {
case "getReceipt":
self.getReceiptBase64(result: result)
case "refreshReceipt":
self.refreshReceipt(result: result)
default:
result(FlutterMethodNotImplemented)
}
}
// 注册插件
GeneratedPluginRegistrant.register(with: self)
......@@ -101,25 +84,6 @@ import tencent_cloud_chat_push
return true
}
private func getReceiptBase64(result: @escaping FlutterResult) {
guard let receiptURL = Bundle.main.appStoreReceiptURL,
FileManager.default.fileExists(atPath: receiptURL.path),
let receiptData = try? Data(contentsOf: receiptURL) else {
result(FlutterError(code: "NO_RECEIPT",
message: "收据不存在,请先刷新",
details: nil))
return
}
result(receiptData.base64EncodedString())
}
private func refreshReceipt(result: @escaping FlutterResult) {
let request = SKReceiptRefreshRequest()
request.delegate = RefreshDelegate(result: result)
request.start()
}
}
// 可选:防止冲突的手势识别设置
......@@ -130,17 +94,3 @@ extension AppDelegate: UIGestureRecognizerDelegate {
}
}
class RefreshDelegate: NSObject, SKRequestDelegate {
let result: FlutterResult
init(result: @escaping FlutterResult) { self.result = result }
func requestDidFinish(_ request: SKRequest) {
result(true)
}
func request(_ request: SKRequest, didFailWithError error: Error) {
result(FlutterError(code: "REFRESH_FAILED",
message: error.localizedDescription,
details: nil))
}
}
\ No newline at end of file
......@@ -4,7 +4,6 @@ import 'package:in_app_purchase/in_app_purchase.dart';
import 'package:flutter/widgets.dart';
import 'package:appframe/data/repositories/user_auth_repository.dart';
import 'package:appframe/config/locator.dart';
import 'package:appframe/utils/ios_receiptHelper.dart';
class SubscriptionService {
......@@ -27,7 +26,7 @@ class SubscriptionService {
// 可用产品列表
List<ProductDetails> _products = [];
List<ProductDetails> get products => _products;
// 当前有效订阅状态(简化版)
bool _hasActiveSubscription = false;
bool get hasActiveSubscription => _hasActiveSubscription;
......@@ -109,7 +108,7 @@ class SubscriptionService {
final orderId = _orderIdMap.remove(purchaseDetails.productID); // 取出并删除
final ctx = _pendingContexts[purchaseDetails.productID];
print(ctx);
// 根据交易状态处理
switch (purchaseDetails.status) {
......@@ -150,19 +149,14 @@ class SubscriptionService {
debugPrint("[info] _verifyReceipt is start scence ["+scence+"] "+purchaseDetails.productID+" orderid:"+orderid);
// 将收据发送到你的后端进行验证
//final String receipt = purchaseDetails.verificationData.serverVerificationData;
// 可选:沙盒环境经常需要先刷新一下
await ReceiptHelper.refreshReceipt();
final base64Receipt = await ReceiptHelper.getBase64Receipt();
final String receipt = purchaseDetails.verificationData.serverVerificationData;
// 把 base64Receipt 作为 receipt-data 发给你的服务端验证
debugPrint("[info] _verifyReceipt base64Receipt "+base64Receipt);
final bool isValid = await _sendReceiptToBackend(base64Receipt,orderid);
final bool isValid = await _sendReceiptToBackend(receipt,orderid);
debugPrint("[info] _verifyReceipt is step 1 ");
if (isValid) {
// 更新本地订阅状态
_hasActiveSubscription = true;
_hasActiveSubscription = true;
// 保存到期时间等信息
}
debugPrint("[info] _verifyReceipt is done ");
......@@ -177,23 +171,6 @@ class SubscriptionService {
debugPrint("[info] _sendReceiptToBackend is done");
return true;
}
Future<void> _handleSuccessfulPurchase(PurchaseDetails purchase,String orderid) async {
try {
// 1. 先直接尝试读取现有收据
String? base64 = await ReceiptHelper.getBase64Receipt();
if (base64 == null) {
// 2. 只有收据不存在时,才刷新一次
await ReceiptHelper.refreshReceipt();
base64 = await ReceiptHelper.getBase64Receipt();
}
// 3. 提交验证
await _sendReceiptToBackend(base64,orderid);
} catch (e) {
print('验证失败: $e');
}
}
// ---------- 恢复购买 ----------
Future<void> restorePurchases() async {
......
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
class ReceiptHelper {
static const _channel = MethodChannel('cn.banxe.appframe/receipt');
/// 获取 Base64 编码的收据数据,直接可用于 /verifyReceipt
static Future<String> getBase64Receipt() async {
try {
final String? base64 = await _channel.invokeMethod('getReceipt');
if (base64 == null || base64.isEmpty) {
throw Exception('收据为空,请先刷新收据');
}
return base64;
} on MissingPluginException {
debugPrint("原生插件未注册,请检查 iOS 代码");
throw Exception('原生插件未注册,请检查 iOS 代码');
}
}
/// 强制刷新收据(沙盒环境常需要)
static Future<void> refreshReceipt() async {
try {
await _channel.invokeMethod('refreshReceipt');
} catch (e) {
debugPrint(e.toString());
throw Exception('刷新收据失败: $e');
}
}
}
\ No newline at end of file
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!