public override Task <PaymentProviderReversalPaymentResponse> ReversalPaymentAsync(ReversalRequest request, CancellationToken cancellation)
        {
            var tcs = new TaskCompletionSource <PaymentProviderReversalPaymentResponse>();

            try
            {
                var pec = new ir.shaparak.sep.PaymentIFBinding();

                pec.reverseTransactionCompleted += new reverseTransactionCompletedEventHandler((sender, args) =>
                {
                    if (args.Error != null)
                    {
                        tcs.TrySetException(args.Error);
                    }
                    else
                    if (!args.Cancelled)
                    {
                        try
                        {
                            var result = new PaymentProviderReversalPaymentResponse(Now);

                            result.Status       = 0;
                            result.Succeeded    = (args.Result == 1);
                            result.ProviderType = this.ProviderType;

                            tcs.SetResult(result);
                        }
                        catch (Exception ex)
                        {
                            tcs.TrySetException(ex);
                        }
                    }
                    else
                    {
                        tcs.SetCanceled();
                    }

                    pec.Dispose();
                });

                cancellation.Register(() => pec.CancelAsync(request.PaymentCode));

                pec.reverseTransactionAsync(request.PaymentCode, Config.Credentials.Pin, Config.Credentials.Username, Config.Credentials.Password, request.PaymentCode);
            }
            catch (Exception e)
            {
                tcs.SetException(e);
            }

            return(tcs.Task);
        }
        public override PaymentProviderReversalPaymentResponse ReversalPayment(ReversalRequest request)
        {
            var result = new PaymentProviderReversalPaymentResponse(Now);

            result.ProviderType = this.ProviderType;

            var eservice = new ir.shaparak.sep.PaymentIFBinding();
            var r        = eservice.reverseTransaction(request.PaymentCode, Config.Credentials.Pin, Config.Credentials.Username, Config.Credentials.Password);

            result.Status    = 0;
            result.Succeeded = (r == 1);

            return(result);
        }
        protected override PaymentProviderEndPaymentResponse endPayment(IDictionary <string, string> request, string code, string status)
        {
            var result = new PaymentProviderEndPaymentResponse <SamanBankTranStatus>(Now);
            var refnum = code;

            result.ProviderType = this.ProviderType;

            if (string.IsNullOrEmpty(refnum) || !EndPaymentSucceeded(status))
            {
                result.Status = status;
                SamanBankTranStatus strongStatus;
                if (Enum.TryParse <SamanBankTranStatus>(status.Replace(" ", ""), out strongStatus))
                {
                    result.StrongStatus = strongStatus;
                }
            }
            else
            {
                ServicePointManager.ServerCertificateValidationCallback =
                    delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return(true); };

                var eservice = new ir.shaparak.sep.PaymentIFBinding();
                var config   = Config as SamanBankConfig;
                var r        = 0.0;

                for (var i = 0; i < config.MaxFinishPaymentRetry; i++)
                {
                    r = eservice.verifyTransaction(refnum, Config.Credentials.Pin);
                    var ri = SafeClrConvert.ToInt32(r);

                    if (ri != 0)
                    {
                        result.Succeeded = EndPaymentSucceeded(ri);
                        break;
                    }
                }

                result.Query  = code;
                result.Code   = "";
                result.Status = r;
            }

            return(result);
        }
        protected override Task <PaymentProviderEndPaymentResponse> endPaymentAsync(IDictionary <string, string> request, string code, string status, CancellationToken cancellation)
        {
            var tcs    = new TaskCompletionSource <PaymentProviderEndPaymentResponse>();
            var refnum = code;

            try
            {
                ServicePointManager.ServerCertificateValidationCallback =
                    delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return(true); };
                var eservice = new ir.shaparak.sep.PaymentIFBinding();

                eservice.verifyTransactionCompleted += new verifyTransactionCompletedEventHandler((sender, args) =>
                {
                    if (args.Error != null)
                    {
                        tcs.TrySetException(args.Error);
                    }
                    else
                    if (!args.Cancelled)
                    {
                        try
                        {
                            var result = new PaymentProviderEndPaymentResponse <SamanBankTranStatus>(Now);
                            var config = Config as SamanBankConfig;
                            var r      = 0.0;

                            for (var i = 0; i < config.MaxFinishPaymentRetry; i++)
                            {
                                r      = eservice.verifyTransaction(refnum, Config.Credentials.Pin);
                                var ri = SafeClrConvert.ToInt32(r);

                                if (ri != 0)
                                {
                                    result.Succeeded = EndPaymentSucceeded(ri);
                                    break;
                                }
                            }

                            result.Query        = code;
                            result.Code         = "";
                            result.Status       = r;
                            result.ProviderType = this.ProviderType;

                            tcs.SetResult(result);
                        }
                        catch (Exception ex)
                        {
                            tcs.TrySetException(ex);
                        }
                    }
                    else
                    {
                        tcs.SetCanceled();
                    }

                    eservice.Dispose();
                });

                if (string.IsNullOrEmpty(refnum) || !EndPaymentSucceeded(status))
                {
                    var result = new PaymentProviderEndPaymentResponse <SamanBankTranStatus>();
                    result.ProviderType = this.ProviderType;
                    result.Status       = status;

                    SamanBankTranStatus strongStatus;

                    if (Enum.TryParse <SamanBankTranStatus>(status.Replace(" ", ""), out strongStatus))
                    {
                        result.StrongStatus = strongStatus;
                    }

                    tcs.SetResult(result);
                }
                else
                {
                    cancellation.Register(() => eservice.CancelAsync(refnum));

                    eservice.verifyTransactionAsync(refnum, Config.Credentials.Pin, refnum);
                }
            }
            catch (Exception e)
            {
                tcs.SetException(e);
            }

            return(tcs.Task);
        }