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); }