from django.db.models import Q from Ansjer.config import LOGGER, CONFIG_INFO, CONFIG_TEST, PAY_TYPE_IN_APP_PURCHASE, BASE_DIR from appstoreserverlibrary.api_client import AppStoreServerAPIClient, GetTransactionHistoryVersion from appstoreserverlibrary.models.Environment import Environment from appstoreserverlibrary.receipt_utility import ReceiptUtility from appstoreserverlibrary.models.HistoryResponse import HistoryResponse from appstoreserverlibrary.models.TransactionHistoryRequest import TransactionHistoryRequest, ProductType, Order from appstoreserverlibrary.signed_data_verifier import SignedDataVerifier from Model.models import Order_Model, DeviceApplePackage ENV = Environment.SANDBOX if CONFIG_INFO == CONFIG_TEST else Environment.PRODUCTION class InAppSubscription: def __init__(self): key_id = 'N42WMFCV6A' issuer_id = '69a6de8c-789b-47e3-e053-5b8c7c11a4d1' bundle_id = 'com.ansjer.zccloud' environment = ENV key_path = '{}/Ansjer/file/in_app_purchase/SubscriptionKey_N42WMFCV6A.p8'.format(BASE_DIR) with open(key_path, 'rb') as file: # 读取文件内容 private_key = file.read() self.client = AppStoreServerAPIClient(private_key, key_id, issuer_id, bundle_id, environment) def check_subscriptions(self, uid, subscription_group_id): """ 检查用户是否订阅 :param uid: :return: True/False True表示已订阅 """ # 查询订单信息 has_order_qs = Order_Model.objects.filter(UID=uid, payType=5).exclude(original_transaction_id="") if not has_order_qs.exists(): return False has_order = has_order_qs.values('transaction_id', 'original_transaction_id', 'orderID', 'addTime').order_by( '-addTime') # 判断用户是否取消订阅 device_apple_package = DeviceApplePackage.objects.filter( original_transaction_id=has_order[0]['original_transaction_id']).values("subscription_status") if not device_apple_package.exists(): return False elif device_apple_package[0]['subscription_status'] != 1: return False # 通过 transaction_id 获取订阅状态 subscription_statuses = self.client.get_all_subscription_statuses(has_order[0]['transaction_id']) if not subscription_statuses.data: return False LOGGER.info("subscription_statuses:{}".format(subscription_statuses)) for subscription_status in subscription_statuses.data: if str(subscription_status.subscriptionGroupIdentifier) == subscription_group_id: for subscription_status_item in subscription_status.lastTransactions: if str(subscription_status_item.status) == "Status.ACTIVE": return True else: return False