Beispiel #1
0
 SubscriptionInfo CreateSubscription(SubscriptionPurchase purchase)
 {
     return(new SubscriptionInfo
     {
         UserId = purchase.EmailAddress,
         TransactionId = purchase.OrderId,
         SubscriptionDate = purchase.StartTimeMillis.ToDateTime() ?? LocalTime.UtcNow,
         ExpirationDate = purchase.ExpiryTimeMillis.ToDateTime() ?? LocalTime.UtcNow,
         CancellationDate = purchase.UserCancellationTimeMillis.ToDateTime(),
         AutoRenews = purchase.AutoRenewing ?? false
     });
 }
        public static PosePurchaseStateType ParseSubscriptionPurchaseState(SubscriptionPurchase subscriptionPurchase)
        {
            PosePurchaseStateType result = PosePurchaseStateType.Unknown;

            switch (subscriptionPurchase.PaymentState)
            {
            case 0:
                result = PosePurchaseStateType.Pending;
                break;

            case 1:
                result = PosePurchaseStateType.Purchased;
                break;

            case 2:
                result = PosePurchaseStateType.Deferred;
                break;
            }

            DateTime origin     = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            DateTime expireTime = origin.AddMilliseconds(subscriptionPurchase.ExpiryTimeMillis ?? 0);
            DateTime resumeTime = origin.AddMilliseconds(subscriptionPurchase.AutoResumeTimeMillis ?? 0);

            if (result == PosePurchaseStateType.Purchased && // 구독 일시정지
                expireTime < DateTime.UtcNow &&
                resumeTime > DateTime.UtcNow)
            {
                result = PosePurchaseStateType.Pause;
            }
            else if (result == PosePurchaseStateType.Pending && // 구독 유예기간 (3일), 결제에 문제가 있어서 해결할 시간을 주는것, 멤버십은 유지
                     expireTime > DateTime.UtcNow)
            {
                result = PosePurchaseStateType.Grace;
            }
            else if (subscriptionPurchase?.AutoRenewing == false &&
                     expireTime < DateTime.UtcNow)
            {
                result = PosePurchaseStateType.Canceled;
            }

            return(result);
        }
        public static async Task <(PoseBillingResult BillingResult, long Payload, string OrderId)> SubscriptionProcess(InAppPurchase inAppPurchase, string appPackageName, string purchaseToken)
        {
            SubscriptionPurchase subscriptionPurchase = await _androidPublisher.Purchases.Subscriptions.Get(appPackageName, inAppPurchase.ProductId, purchaseToken).ExecuteAsync();

            if (!long.TryParse(subscriptionPurchase.DeveloperPayload, out long payLoad))
            {
                return(null, 0, "");
            }

            DateTime origin     = new DateTime(1970, 1, 1, 0, 0, 0, 0);
            DateTime expireTiem = origin.AddMilliseconds(subscriptionPurchase.ExpiryTimeMillis ?? 0);

            PoseBillingResult billingResult = new PoseBillingResult();

            billingResult.PurchaseStateType = ParseSubscriptionPurchaseState(subscriptionPurchase);
            billingResult.MemberRoleType    = inAppPurchase.OfferRoleType;
            billingResult.RoleExpireTime    = expireTiem;
            billingResult.ProductId         = inAppPurchase.ProductId;

            return(billingResult, payLoad, subscriptionPurchase.OrderId);
        }
        public StorePurchase GetPurchase(string productId, PurchaseResult purchaseResult)
        {
            StorePurchase           sP;
            AndroidPublisherService service;
            string packageName, token;

            InitializeImpl(purchaseResult, out sP, out service, out packageName, out token);

            try
            {
                ProductType productType = GetPurchaseType(productId.Trim(), service, packageName.Trim());

                if (productType == ProductType.Subscription)
                {
                    SubscriptionPurchase s = service.Purchases.Subscriptions.Get(packageName, productId, token).Execute();

                    sP = new StorePurchase()
                    {
                        ProductIdentifier = productId,
                        PurchaseId        = token,
                        ProductType       = (int)ProductType.Subscription,
                        PurchaseDate      = Util.FromUnixTime(s.StartTimeMillis.GetValueOrDefault(0)),

                        Subscription = new StorePurchaseSubscription()
                        {
                            Expiration     = Util.FromUnixTime(s.ExpiryTimeMillis.GetValueOrDefault(0)),
                            FirstPurchased = Util.FromUnixTime(s.StartTimeMillis.GetValueOrDefault(0))
                        },

                        Custom = new StorePurchaseCustom()
                        {
                            Consumed             = false,
                            CancelReason         = s.CancelReason,
                            IsTrialPeriod        = false,
                            WillAutoRenew        = s.AutoRenewing.GetValueOrDefault(false),
                            Quantity             = 1,
                            OriginalPurchase     = purchaseResult,
                            AcknowledgementState = s.AcknowledgementState.Value
                        }
                    };

                    if (sP.Subscription.Expiration <= DateTime.Now)
                    {
                        sP.PurchaseStatus = PurchaseStatus.Expired;
                    }
                    else
                    {
                        if (sP.Custom.CancelReason.HasValue)
                        {
                            int cancelReason = sP.Custom.CancelReason.Value;
                            if (cancelReason == 0)
                            {
                                sP.PurchaseStatus = PurchaseStatus.Valid;
                            }
                            if (cancelReason == 1)
                            {
                                sP.PurchaseStatus = PurchaseStatus.Cancelled;
                            }
                        }
                        else
                        {
                            sP.PurchaseStatus = PurchaseStatus.Valid;
                        }
                    }
                }
                else
                {
                    ProductPurchase p = service.Purchases.Products.Get(packageName, productId, token).Execute();
                    sP = new StorePurchase()
                    {
                        ProductIdentifier = productId,
                        PurchaseId        = token,
                        ProductType       = (int)ProductType.Product,
                        PurchaseDate      = Util.FromUnixTime(p.PurchaseTimeMillis.GetValueOrDefault(0)),

                        Custom = new StorePurchaseCustom()
                        {
                            Consumed             = (p.ConsumptionState.HasValue && p.ConsumptionState.Value == 1),
                            IsTrialPeriod        = false,
                            Quantity             = 1,
                            OriginalPurchase     = purchaseResult,
                            AcknowledgementState = p.AcknowledgementState.Value
                        }
                    };
                    if (p.PurchaseState == 1)
                    {
                        sP.PurchaseStatus = PurchaseStatus.Cancelled;
                    }
                    else
                    {
                        if (p.ConsumptionState == 1)
                        {
                            sP.PurchaseStatus = PurchaseStatus.Expired;
                        }
                        else
                        {
                            sP.PurchaseStatus = PurchaseStatus.Valid;
                        }
                    }
                }
            }
            catch (GoogleApiException e)
            {
                switch (e.HttpStatusCode)
                {
                case System.Net.HttpStatusCode.NotFound:
                    throw new StorePurchaseNotFoundException("Google Play Purchase Token was not found");

                default:
                    throw new StoreException(e.Message, e);
                }
            }
            catch (Exception e)
            {
                throw new StoreException(e.Message, e);
            }
            return(sP);
        }