/// <summary>
        /// Process recurring payment
        /// </summary>
        /// <param name="processPaymentRequest">Payment info required for an order processing</param>
        /// <returns>Process payment result</returns>
        public ProcessPaymentResult ProcessRecurringPayment(ProcessPaymentRequest processPaymentRequest)
        {
            ProcessPaymentResult result = new ProcessPaymentResult();

            if (!processPaymentRequest.IsRecurringPayment)
            {
                // This payment method doesn't actually handle scheduling recurring payments
                // Therefore the initial call to ProcessRecurringPayment - where it actually
                // ISN'T a recurring payment - is ignored.

                return(result);
            }

            Order order = orderService.GetOrderById(processPaymentRequest.InitialOrderId);

            if (order != null) // this needs an initial order to work (this is where subscriptionid is registered)
            {
                int  fraud         = 0;
                long transactionid = -1;
                int  pbsresponse   = -1;
                int  epayresponse  = -1;

                int merchant = Int32.Parse(ePayPaymentSettings.MerchantId);

                // Construct order identification for this recurring payment
                // This is done because the new order that will hold this payment is not fully constructed yet
                // thus no orderId is available
                string orderId = String.Format("{0}-rec-{1}", processPaymentRequest.InitialOrderId, DateTime.UtcNow.ToString("yyMMddHHmm"));

                // authorize subscription payment
                // instant capture!
                using (var subscriptionservice = new epay.subscriptionservice.Subscription())
                {
                    subscriptionservice.authorize(
                        merchant,                                                               // merchantid
                        Int32.Parse(order.SubscriptionTransactionId),                           // subscriptionid
                        orderId,                                                                // orderid
                        Convert.ToInt32(Math.Round(processPaymentRequest.OrderTotal, 2) * 100), // amount
                        Int32.Parse(EPayHelper.GetIsoCode(order.CustomerCurrencyCode)),         // currency
                        1,                                                                      // instantcapture
                        "",                                                                     // group
                        "",                                                                     // description
                        "",                                                                     // email
                        "",                                                                     // sms
                        "",                                                                     // ipaddress
                        ePayPaymentSettings.RemotePassword,                                     // pwd
                        ref fraud,
                        ref transactionid,
                        ref pbsresponse,
                        ref epayresponse);

                    if (epayresponse == -1 && pbsresponse == 0)
                    {
                        result.SubscriptionTransactionId  = order.SubscriptionTransactionId;
                        result.AuthorizationTransactionId = transactionid.ToString();
                        result.CaptureTransactionId       = transactionid.ToString();
                        result.CaptureTransactionResult   = String.Format("Captured: ({0})", transactionid);
                        result.NewPaymentStatus           = PaymentStatus.Paid;
                    }
                    else
                    {
                        int    epayresp         = -1;
                        string pbsresponsetext  = "";
                        var    epayresponsetext = "";

                        subscriptionservice.getPbsError(merchant, 2, pbsresponse, ePayPaymentSettings.RemotePassword, ref pbsresponsetext, ref epayresp);
                        subscriptionservice.getEpayError(merchant, 2, epayresponse, ePayPaymentSettings.RemotePassword, ref epayresponsetext, ref epayresp);

                        result.AddError(String.Format("Error processing recurring payment: PBS({0}) EPay({1})", pbsresponsetext, epayresponsetext));
                    }
                }
            }
            else
            {
                result.AddError("Initial order wasn't set for recurring payment.");
            }

            return(result);
        }
        /// <summary>
        /// Post process payment (used by payment gateways that require redirecting to a third-party URL)
        /// </summary>
        /// <param name="postProcessPaymentRequest">Payment info required for an order processing</param>
        public void PostProcessPayment(PostProcessPaymentRequest postProcessPaymentRequest)
        {
            string lang = EPayHelper.GetLangauge(Thread.CurrentThread.CurrentCulture).ToString();

            decimal orderTotal  = Math.Round(postProcessPaymentRequest.Order.OrderTotal, 2);
            string  amount      = (orderTotal * 100).ToString("0", CultureInfo.InvariantCulture);
            string  currency    = EPayHelper.GetIsoCode(postProcessPaymentRequest.Order.CustomerCurrencyCode);
            string  itemurl     = this.webHelper.GetStoreLocation(false);
            string  continueurl = itemurl + "Plugins/PaymentePay/PDTHandler";
            string  cancelurl   = itemurl + "Plugins/PaymentePay/CancelOrder";
            string  merchant    = ePayPaymentSettings.MerchantId;

            var orderHasRecurringItems = false;

            foreach (var item in postProcessPaymentRequest.Order.OrderItems)
            {
                orderHasRecurringItems = orderHasRecurringItems || (item.Product != null && item.Product.IsRecurring);
            }

            string ordernumber = postProcessPaymentRequest.Order.Id.ToString("D2");

            // ordernumber 1-9 must be with 0 in front, e.g. 01
            if (ordernumber.Length == 1)
            {
                ordernumber = "0" + ordernumber;
            }

            var remotePostHelper = new RemotePost
            {
                FormName = "ePay",
                Url      = itemurl + "Plugins/PaymentePay/Open"
            };

            remotePostHelper.Add("merchantnumber", merchant);
            remotePostHelper.Add("orderid", ordernumber);
            remotePostHelper.Add("amount", amount);
            remotePostHelper.Add("windowstate", ePayPaymentSettings.FullScreen ? "3" : "1");
            remotePostHelper.Add("language", lang);
            remotePostHelper.Add("currency", currency);
            remotePostHelper.Add("accepturl", continueurl);
            remotePostHelper.Add("callbackurl", continueurl);
            remotePostHelper.Add("declineurl", cancelurl);
            remotePostHelper.Add("authmail", ePayPaymentSettings.AuthMail);
            remotePostHelper.Add("authsms", ePayPaymentSettings.AuthSms);
            remotePostHelper.Add("group", ePayPaymentSettings.Group);
            remotePostHelper.Add("instantcapture", Convert.ToByte(ePayPaymentSettings.Instantcapture).ToString());
            remotePostHelper.Add("ownreceipt", Convert.ToByte(ePayPaymentSettings.OwnReceipt).ToString());
            remotePostHelper.Add("cms", "nopcommerce");
            remotePostHelper.Add("subscription", (orderHasRecurringItems) ? "1" : "0");

            string stringToMd5 = "";

            foreach (string key in remotePostHelper.Params)
            {
                stringToMd5 += "" + remotePostHelper.Params[key];
            }

            string md5Check = GetMd5(stringToMd5 + ePayPaymentSettings.Md5Secret);

            remotePostHelper.Add("md5key", md5Check);

            remotePostHelper.Post();
        }