Beispiel #1
0
        // -------------------------------------------------------------
        public string          ShowCheckoutWindowAsync(
            PaddleProductID productID,
            CheckoutOptions options,
            bool openInBrowser,
            bool isDialog)
        {
            ScTask        task    = new ScTask();
            PaddleProduct product = Paddle_GetProduct(productID);

            product.Refresh((success) => {
                                #if kUseThreads
                //	do on another thread
                i_threadData.i_currentWindowType = (PaddleWindowType)PaddleWindowType.Checkout;
                i_threadData.i_currentProduct    = product;
                i_threadData.i_checkoutOptions   = options;
                i_threadData.i_openInBrowser     = openInBrowser;
                i_threadData.i_isDialog          = isDialog;
                StartWindowThread();
                                #else
                // do it on this thread
                Paddle.Instance.ShowCheckoutWindowForProduct(product, options, openInBrowser, isDialog);
                                #endif
            });

            return(task.await_result());
        }
Beispiel #2
0
        //-------------------------------------------------------------------

        private string                                  Purchase(string jsonCmd)
        {
            string          jsonResult = "";
            JObject         cmdObject  = JObject.Parse(jsonCmd);
            PaddleProductID prodID     = cmdObject.Value <PaddleProductID>(kPaddleCmdKey_SKU);

            string emailStr   = cmdObject.Value <string>(kPaddleCmdKey_EMAIL);
            string couponStr  = cmdObject.Value <string>(kPaddleCmdKey_COUPON);
            string countryStr = cmdObject.Value <string>(kPaddleCmdKey_COUNTRY);
            string postStr    = cmdObject.Value <string>(kPaddleCmdKey_POSTCODE);
            string titleStr   = cmdObject.Value <string>(kPaddleCmdKey_TITLE);
            string messageStr = cmdObject.Value <string>(kPaddleCmdKey_MESSAGE);

            CheckoutOptions checkoutOptions = new CheckoutOptions {
                Email    = emailStr,
                Coupon   = couponStr,
                Country  = countryStr,
                PostCode = postStr
            };

            //	custom param keys are documented here:
            //	https://paddle.com/docs/api-custom-checkout/
            checkoutOptions.AddCheckoutParameters("quantity_variable", "0");
            checkoutOptions.AddCheckoutParameters("title", titleStr);
            checkoutOptions.AddCheckoutParameters("custom_message", messageStr);

            //	documented here: https://paddle.com/docs/checkout-options-windows-sdk/
            jsonResult = ShowCheckoutWindowAsync(prodID, checkoutOptions, false, true);

            return(jsonResult);
        }
Beispiel #3
0
        public void             CreateInstance(PaddleProductID productID)
        {
            string vendorStr  = i_vendorID.ToString();
            string productStr = productID.ToString();

            // Initialize the SDK singleton with the config
            Paddle.Configure(
                i_apiKeyStr,
                vendorStr,
                productStr,
                Paddle_GetConfig(productID));

            Paddle.Instance.HighDpiMode = true;

            Paddle.Instance.TransactionBeginEvent    += Paddle_CheckoutBeginEvent;
            Paddle.Instance.TransactionCompleteEvent += Paddle_CheckoutCompleteEvent;
            Paddle.Instance.TransactionErrorEvent    += Paddle_CheckoutErrorEvent;

            Paddle.Instance.LicensingStarting      += Paddle_LicensingBeginEvent;
            Paddle.Instance.LicensingCompleteEvent += Paddle_LicensingCompleteEvent;
            Paddle.Instance.LicensingErrorEvent    += Paddle_LicensingErrorEvent;

            Paddle.Instance.RecoveryCompleteEvent += Paddle_RecoveryCompleteEvent;
            Paddle.Instance.RecoveryErrorEvent    += Paddle_RecoveryErrorEvent;

            RegisterEventListeners();
        }
Beispiel #4
0
        //-------------------------------------------------------------------
        private string                                  Activate(string jsonCmd)
        {
            string          jsonResult = "";
            JObject         cmdObject  = JObject.Parse(jsonCmd);
            PaddleProductID prodID     = cmdObject.Value <PaddleProductID>(kPaddleCmdKey_SKU);
            string          emailStr   = cmdObject.Value <string>(kPaddleCmdKey_EMAIL);
            string          snStr      = cmdObject.Value <string>(kPaddleCmdKey_SERIAL_NUMBER);
            PaddleProduct   product    = Paddle_GetProduct(prodID);
            ScTask          task       = new ScTask();

            product.ActivateWithEmail(emailStr, snStr,
                                      (PaddleSDK.Product.VerificationState verifyState, string resultStr) =>
            {
                ActivationState state = ConvertState_VerifyToActivate(verifyState);
                CJsonResult jResult   = new CJsonResult {
                    successB = state == ActivationState.Activated,
                    resultI  = Convert.ToInt32(state),
                    errStr   = resultStr
                };

                task.set_result(CreateJsonResult(jResult));
            });

            jsonResult = task.await_result();
            return(jsonResult);
        }
Beispiel #5
0
        private PaddleProduct           Paddle_GetProduct(PaddleProductID productID)
        {
            PaddleProduct product = PaddleProduct.CreateProduct(
                productID.ToString(),
                PaddleSDK.Product.ProductType.SDKProduct,
                Paddle_GetConfig(productID));

            product.CanForceExit = false;
            return(product);
        }
Beispiel #6
0
        private PaddleProductRec                GetProductRec(PaddleProductID prodID)
        {
            if (i_prodMap.ContainsKey(prodID))
            {
                return(i_prodMap[prodID]);
            }

            debug_print(String.Format("ERROR: GetProductRec: no product: {0}", prodID));

            return(new PaddleProductRec());
        }
Beispiel #7
0
        private PaddleProductConfig     Paddle_GetConfig(PaddleProductID prodID)
        {
            PaddleProductRec prodRec = GetProductRec(prodID);

            PaddleProductConfig config = new PaddleProductConfig {
                ProductName = prodRec.nameStr,
                VendorName  = i_vendorNameStr,
                TrialType   = PaddleSDK.Product.TrialType.None,
                TrialText   = prodRec.localizedTrialStr,
                Currency    = "USD",
                ImagePath   = ""
            };

            return(config);
        }
Beispiel #8
0
        private string                                  Deactivate(string jsonCmd)
        {
            string          jsonResult = "";
            JObject         cmdObject  = JObject.Parse(jsonCmd);
            PaddleProductID prodID     = cmdObject.Value <PaddleProductID>(kPaddleCmdKey_SKU);
            PaddleProduct   product    = Paddle_GetProduct(prodID);
            ScTask          task       = new ScTask();

            product.Deactivate(
                (bool stateB, string resultStr) =>
            {
                CJsonResult jResult = new CJsonResult {
                    successB = stateB,
                    resultI  = Convert.ToInt32(stateB),
                    errStr   = resultStr
                };

                task.set_result(CreateJsonResult(jResult));
            });

            jsonResult = task.await_result();
            return(jsonResult);
        }
Beispiel #9
0
        // -------------------------------------------------------------
        //	validate means verify
        private string                                  Validate(string jsonCmd)
        {
            string          jsonResult;
            JObject         cmdObject = JObject.Parse(jsonCmd);
            PaddleProductID prodID    = cmdObject.Value <PaddleProductID>(kPaddleCmdKey_SKU);
            PaddleProduct   product   = Paddle_GetProduct(prodID);

            if (!product.Activated)
            {
                VerificationState state;

                if (product.TrialDaysRemaining > 0)
                {
                    state = VerificationState.Verified;
                }
                else
                {
                    state = VerificationState.NoActivation;
                }

                CJsonResult jResult = new CJsonResult {
                    successB = state == VerificationState.Verified,
                    resultI  = Convert.ToInt32(state)
                };

                jsonResult = CreateJsonResult(jResult);
            }
            else
            {
                DateTime lastSuccessDateT   = product.LastSuccessfulVerifiedDate;
                TimeSpan spanSinceSuccessT  = DateTime.Now - lastSuccessDateT;
                double   hoursSinceSuccessT = spanSinceSuccessT.TotalHours;

                // Verify the activation only if it's been a while.
                if (hoursSinceSuccessT < 1)
                {
                    CJsonResult jResult = new CJsonResult {
                        successB = true,
                        resultI  = Convert.ToInt32(VerificationState.Verified)
                    };

                    // No need to verify. The product is activated. All's well.
                    jsonResult = CreateJsonResult(jResult);
                }
                else
                {
                    ScTask task = new ScTask();

                    product.VerifyActivation(
                        (PaddleSDK.Product.VerificationState in_state, string resultStr) =>
                    {
                        VerificationState state = (VerificationState)in_state;
                        bool destroyB           = false;

                        switch (state)
                        {
                        case VerificationState.Unverified: {
                            // The activation is no longer valid. Destroy it, let the user know and continue with
                            // the trial.
                            destroyB = true;
                        } break;

                        case VerificationState.UnableToVerify: {
                            // Verify that the last successful verify date is valid.
                            // And then implement a cooldown strategy.

                            // Ensure that the last successful verified date appears valid.
                            // As `compare:` "detects sub-second differences" the dates should not be the same.
                            // Equally we can't have verified the activation in the future.
                            //	future dates have a negative time span since now:
                            if (hoursSinceSuccessT < 0)
                            {
                                // The last successfully verified date does not seem valid. If the time difference
                                // is less than 24 hours, a timezone change is possible. Other than that, tampering
                                // seems likely.
                                //
                                // In doubt, destroy the activation and ask the user to reactivate.
                                destroyB = true;
                            }

                            // Implement a cooldown period: if the user has not gone online within the period,
                            // then destroy the activation and ask them to go online to re-activate.
                            double daysSinceSuccessT = spanSinceSuccessT.TotalDays;

                            if (daysSinceSuccessT >= 30)
                            {
                                destroyB = true;
                            }
                            else
                            {
                                // The grace period continues, so the user can continue to use the core functionality.
                                state = VerificationState.Verified;
                            }
                        } break;
                        }

                        if (destroyB)
                        {
                            product.DestroyActivation();
                            state = VerificationState.Unverified;
                        }

                        CJsonResult jResult = new CJsonResult {
                            successB = state == VerificationState.Verified,
                            resultI  = Convert.ToInt32(state),
                            errStr   = resultStr
                        };

                        task.set_result(CreateJsonResult(jResult));
                    });

                    jsonResult = task.await_result();
                }
            }

            return(jsonResult);
        }
Beispiel #10
0
 public void AddProduct(PaddleProductID prodID, string nameStr, string localizedTrialStr)
 {
     i_prodMap[prodID] = new PaddleProductRec(nameStr, localizedTrialStr);
 }