public static void updateClient(MGClient _client, MGPurchase _purchase)
        {
            List <MGClient> clients = new List <MGClient>();

            using (SqlConnection connection = new SqlConnection(LUDBcononnectionString))
            {
                using (SqlCommand command = new SqlCommand())
                {
                    connection.Open();


                    command.CommandText = "[dbo].[SP_UpdateClient]";

                    command.CommandType = CommandType.StoredProcedure;
                    command.Connection  = connection;
                    command.Prepare();
                    command.Parameters.Add("@clientId", SqlDbType.NVarChar).Value   = _client.Id;
                    command.Parameters.Add("@name", SqlDbType.NVarChar).Value       = _client.Name;
                    command.Parameters.Add("@telNumCt", SqlDbType.NVarChar).Value   = _client.TelContact;
                    command.Parameters.Add("@telNumApp", SqlDbType.NVarChar).Value  = _client.TelMGProd;
                    command.Parameters.Add("@street", SqlDbType.NVarChar).Value     = _client.Street;
                    command.Parameters.Add("@city", SqlDbType.NVarChar).Value       = _client.City;
                    command.Parameters.Add("@postalCode", SqlDbType.NVarChar).Value = _client.PCode;
                    command.Parameters.Add("@tokensLeft", SqlDbType.Int).Value      = _client.Tokens;
                    command.Parameters.Add("@packQt", SqlDbType.Int).Value          = _purchase.Quantity;
                    command.Parameters.Add("@packCost", SqlDbType.Decimal).Value    = _purchase.Cost;
                    command.Parameters.Add("@packCastingId", SqlDbType.Int).Value   = _purchase.PackId;
                    command.ExecuteNonQuery();
                }
            }
        }
示例#2
0
        static void Main(string[] args)
        {
            // MGClient client = CreateClientWithEnvVarExample();
            MGClient client = CreateClientWithExplicitConfig();

            DepositExample(client);
            QueryOrderExample(client);
            PayoutExample(client);
            ParseCallbackExample(client);
        }
示例#3
0
        public static MGClient CreateClientWithExplicitConfig()
        {
            // Credentials are hardcoded for showcase purposes - do not use hardcoded credentials on live environment
            MGClient clientWithConfig = new MGClient(
                merchantSecret: "merchant-secret-key",
                endpointId: "400007",
                merchantId: "merchant-id",
                requestUrl: "https://secure.zotapay-stage.com"
                );

            return(clientWithConfig);
        }
示例#4
0
        public async Task CardDepositShouldShowFullErrorMessage()
        {
            // Arrange
            MGDepositCardRequest DepositOrderRequest = Mocks.GetFullDepositCardRequest();
            MGClient             clientWithConfig    = Mocks.GetMockedMGClient(null);
            string expectedErrorMessage = "The CardExpirationYear field is required. | The CardCvv field is required. | The CardExpirationMonth field is required. | The CardHolderName field is required. | The CardNumber field is required.";

            // Act
            var actualResult = await clientWithConfig.InitCardDeposit(DepositOrderRequest);

            // Assert
            Assert.IsFalse(actualResult.IsSuccess);
            Assert.AreEqual(expectedErrorMessage, actualResult.Message);
        }
示例#5
0
        public void MGClientConstructorShouldFail()
        {
            // Arrange
            MGClient         client  = new MGClient(useConstantUrl: false);
            MGDepositRequest request = new MGDepositRequest();
            string           expectedErrorMessage = "MGClient missing parameters: endpoint merchantSecret requestUrl merchantId";

            // Act
            MGDepositResult actual = client.InitDeposit(request).Result;

            // Assert
            Assert.IsFalse(actual.IsSuccess);
            Assert.AreEqual(expectedErrorMessage, actual.Message);
        }
示例#6
0
        public void MGClientProperlyCreatedWithStringConstructor()
        {
            // Arrange
            string merchantSecret = "12345";
            string endpointId     = "400009";
            string requestUrl     = "https://google.com";
            string merchantId     = "merchant_id";

            // Act
            MGClient client = new MGClient(merchantSecret, endpointId, requestUrl, merchantId);

            // Assert
            Assert.IsNotNull(client);
        }
示例#7
0
        public void PayoutOrderSuccess()
        {
            // Arrange
            MGPayoutResult expectedResult = new MGPayoutResult()
            {
                IsSuccess = true,
                Code      = "200",
                Message   = null,
                Data      = new MGPayoutData {
                    orderID = "123456", merchantOrderID = "merch-order"
                }
            };
            string   messageSuccess = "{ \"code\": \"200\", \"data\": { \"orderID\": \"123456\", \"merchantOrderID\": \"merch-order\"} }";
            var      httpMock       = Mocks.GetMockedHttp(HttpStatusCode.OK, messageSuccess);
            MGClient client         = Mocks.GetMockedMGClient(httpClient: httpMock);
            var      payoutRequest  = new MGPayoutRequest
            {
                MerchantOrderID           = "Q44mHY18",
                CustomerBankCode          = "BBL",
                OrderAmount               = "100.00",
                CustomerBankAccountNumber = "1234567",
                CustomerBankAccountName   = "Don Jhoe",
                CustomerEmail             = "*****@*****.**",
                CustomerBankBranch        = "bankBranch",
                CustomerBankProvince      = "province",
                CustomerBankArea          = "bankArea",
                CustomerBankRoutingNumber = "000",
                OrderCurrency             = "USD",
                MerchantOrderDesc         = "desc",
                CustomerFirstName         = "John",
                CustomerLastName          = "Doe",
                CustomerBankAddress       = "The Moon, hill 42",
                CustomerBankZipCode       = "1303",
                CustomerPhone             = "123",
                CustomerIP  = "127.0.0.1",
                RedirectUrl = "https://example-merchant.com/payment/return",
                CheckoutUrl = "https://example-merchant.com/deposit",
                CallbackUrl = "https://example-merchant.com/callback",
            };

            // Act
            MGPayoutResult actual = client.InitPayout(payoutRequest).Result;

            // Assert
            Assert.IsTrue(actual.IsSuccess);
            Assert.AreEqual(expectedResult.Code, actual.Code);
            Assert.AreEqual(expectedResult.Message, actual.Message);
            Assert.AreEqual(expectedResult.Data.orderID, actual.Data.orderID);
            Assert.AreEqual(expectedResult.Data.merchantOrderID, actual.Data.merchantOrderID);
        }
示例#8
0
        public void DepositSuccess()
        {
            // Arrange
            MGDepositResult expectedResult = new MGDepositResult()
            {
                IsSuccess = true,
                Code      = "200",
                Message   = null,
                Data      = new DepositResponseData()
                {
                    DepositUrl      = "https://api.zotapay.com/api/v1/deposit/init/8b3a6b89697e8ac8f45d964bcc90c7ba41764acd/",
                    MerchantOrderID = "QvE8dZshpKhaOmHY",
                    OrderID         = "8b3a6b89697e8ac8f45d964bcc90c7ba41764acd",
                }
            };
            string   messageSuccess = "{ \"code\": \"200\", \"data\": { \"depositUrl\": \"https://api.zotapay.com/api/v1/deposit/init/8b3a6b89697e8ac8f45d964bcc90c7ba41764acd/\", \"merchantOrderID\": \"QvE8dZshpKhaOmHY\", \"orderID\": \"8b3a6b89697e8ac8f45d964bcc90c7ba41764acd\" } }";
            var      httpMock       = Mocks.GetMockedHttp(HttpStatusCode.OK, messageSuccess);
            MGClient client         = Mocks.GetMockedMGClient(httpClient: httpMock);
            var      DepositRequest = new MGDepositRequest
            {
                MerchantOrderID     = "QvE8dZshpKhaOmHY",
                OrderAmount         = "100.00",
                CustomerEmail       = "*****@*****.**",
                OrderCurrency       = "USD",
                MerchantOrderDesc   = "desc",
                CustomerFirstName   = "John",
                CustomerLastName    = "Doe",
                CustomerAddress     = "The Moon, hill 42",
                CustomerCity        = "Sofia",
                CustomerCountryCode = "BG",
                CustomerZipCode     = "1303",
                CustomerPhone       = "123",
                CustomerIP          = "127.0.0.1",
                RedirectUrl         = "https://example-merchant.com/payment/return",
                CheckoutUrl         = "https://example-merchant.com/deposit"
            };

            // Act
            MGDepositResult actual = client.InitDeposit(DepositRequest).Result;

            // Assert
            Assert.IsTrue(actual.IsSuccess);
            Assert.AreEqual(expectedResult.Data.DepositUrl, actual.Data.DepositUrl);
            Assert.AreEqual(expectedResult.Data.MerchantOrderID, actual.Data.MerchantOrderID);
            Assert.AreEqual(expectedResult.Data.OrderID, actual.Data.OrderID);
            Assert.AreEqual(expectedResult.Code, actual.Code);
            Assert.AreEqual(expectedResult.Message, actual.Message);
        }
示例#9
0
        public void DepositCatchesUnexpectedResponse()
        {
            // Arrange
            string   responseMessage      = "!@#$%^&*() -- not a valid json message, that will cause an exception -- !@#$%^&*()";
            var      httpMock             = Mocks.GetMockedHttp(HttpStatusCode.InternalServerError, responseMessage);
            MGClient client               = Mocks.GetMockedMGClient(httpClient: httpMock);
            var      DepositRequest       = Mocks.GetFullDepositRequest();
            string   expectedErrorMessage = "Unexpected character encountered while parsing value: !. Path '', line 0, position 0.: \n" +
                                            "Raw Response: !@#$%^&*() -- not a valid json message, that will cause an exception -- !@#$%^&*()";

            // Act
            MGDepositResult actual = client.InitDeposit(DepositRequest).Result;

            // Assert
            Assert.IsFalse(actual.IsSuccess);
            Assert.AreEqual(expectedErrorMessage, actual.Message);
        }
示例#10
0
        public static void ParseCallbackExample(MGClient client)
        {
            string     exampleRawJson = "{\"type\":\"SALE\",\"status\":\"APPROVED\",\"errorMessage\":\"\",\"endpointID\":\"400009\",\"processorTransactionID\":\"279198e3-7277-4e28-a490-e02deec1a3cc\",\"orderID\":\"32453550\",\"merchantOrderID\":\"QvE8dZshpKhaOmHY1\",\"amount\":\"100.00\",\"currency\":\"USD\",\"customerEmail\":\"[email protected]\",\"customParam\":\"\",\"extraData\":{\"dcc\":false,\"paymentMethod\":\"ONLINE\"},\"originalRequest\":{\"merchantOrderID\":\"QvE8dZshpKhaOmHY1\",\"merchantOrderDesc\":\"desc\",\"orderAmount\":\"100.00\",\"orderCurrency\":\"USD\",\"customerEmail\":\"[email protected]\",\"customerFirstName\":\"John\",\"customerLastName\":\"Doe\",\"customerAddress\":\"The Moon, hill 42\",\"customerCountryCode\":\"BG\",\"customerCity\":\"Sofia\",\"customerZipCode\":\"1303\",\"customerPhone\":\"123\",\"customerIP\":\"127.0.0.1\",\"redirectUrl\":\"https://example-merchant.com/payment/return\",\"callbackUrl\":\"https://ens39ypv7jld8.x.pipedream.net\",\"checkoutUrl\":\"https://example-merchant.com/deposit\",\"signature\":\"0ca81b0354fd669b602b683ca11859635a1831d438ef276289ab653a310c8f76\",\"requestedAt\":\"0001-01-01T00:00:00Z\"},\"signature\":\"7df9a67035e2c2f145c51653bd25aa56658954dac114ce8f77ddc4f991ecab1a\"}";
            MGCallback callback       = client.Parse(exampleRawJson);

            // handle errors or unverified signatures
            if (!callback.IsVerified)
            {
                string reason = callback.ErrorMessage;
                // ...
                return;
            }

            string orderStatus = callback.Status;

            Console.WriteLine(orderStatus);
        }
示例#11
0
        public static void PayoutExample(MGClient client)
        {
            // Assemble payout order data
            MGPayoutRequest payoutRequest = new MGPayoutRequest
            {
                MerchantOrderID           = "Q44mHY18",
                CustomerBankCode          = "BBL",
                OrderAmount               = "100.00",
                CustomerBankAccountNumber = "1234567",
                CustomerBankAccountName   = "Don Jhoe",
                CustomerEmail             = "*****@*****.**",
                CustomerBankBranch        = "bankBranch",
                CustomerBankProvince      = "province",
                CustomerBankArea          = "bankArea",
                CustomerBankRoutingNumber = "000",
                OrderCurrency             = "USD",
                MerchantOrderDesc         = "desc",
                CustomerFirstName         = "John",
                CustomerLastName          = "Doe",
                CustomerBankAddress       = "The Moon, hill 42",
                CustomerBankZipCode       = "1303",
                CustomerPhone             = "123",
                CustomerIP  = "127.0.0.1",
                RedirectUrl = "https://example-merchant.com/payment/return",
                CheckoutUrl = "https://example-merchant.com/deposit",
                CallbackUrl = "https://ens39ypv7jld8.x.pipedream.net",
            };

            // Initiate deposit order request
            MGPayoutResult resp = client.InitPayout(payoutRequest).Result;

            // Check the request status
            if (!resp.IsSuccess)
            {
                // handle unsuccessful request
                string reasonForFailure = resp.Message;
                // ...
                return;
            }

            // Capture ZotaPay order id
            string zotapayOrderId = resp.Data.orderID;

            Console.WriteLine(zotapayOrderId);
        }
示例#12
0
        public void EmptyRequestShowsFullErrorMessage()
        {
            // Arrange
            MGClient         clientMock           = Mocks.GetMockedMGClient(null);
            MGDepositRequest depositRequest       = new MGDepositRequest();
            string           expectedErrorMessage = "The MerchantOrderID field is required. | The MerchantOrderDesc field is required. |" +
                                                    " The OrderAmount field is required. | The OrderCurrency field is required. | The CustomerFirstName field is required. |" +
                                                    " The CustomerLastName field is required. | The CustomerAddress field is required. | The CustomerCountryCode field is required. |" +
                                                    " The CustomerCity field is required. | The CustomerZipCode field is required. | The CustomerPhone field is required. |" +
                                                    " The CustomerIP field is required. | The RedirectUrl field is required. | The CheckoutUrl field is required.";

            // Act
            MGDepositResult actualDepositResult = clientMock.InitDeposit(depositRequest).Result;

            // Assert
            Assert.IsFalse(actualDepositResult.IsSuccess);
            Assert.AreEqual(expectedErrorMessage, actualDepositResult.Message);
        }
示例#13
0
        public static MGClient CreateClientWithEnvVarExample()
        {
            /*
             *  The following are to be set as environment variables:
             *  "ZOTAPAY_MERCHANT_ID"
             *  "ZOTAPAY_MERCHANT_SECRET_KEY"
             *  "ZOTAPAY_ENDPOINT_ID"
             *  "ZOTAPAY_REQUEST_URL";
             */

            // Environment variables set in the code only for showcase purposes - do not use hardcoded credentials on live environment
            Environment.SetEnvironmentVariable(Constants.ENV.ENDPOINT_ID, "400009");
            Environment.SetEnvironmentVariable(Constants.ENV.MERCHANT_ID, "merchant-id");
            Environment.SetEnvironmentVariable(Constants.ENV.MERCHANT_SECRET_KEY, "merchant-secret-key");

            // ZotaPay's Meta Gate client constructed with environment variables
            MGClient client = new MGClient(useConstantUrl: true, environment: Constants.MGEnvironment.Sandbox); // Constants.MGEnvironment.Live

            return(client);
        }
示例#14
0
        public static void QueryOrderExample(MGClient client)
        {
            // Initialize query status payload & send request
            var queryStatusCheckRequest = new MGQueryTxnRequest {
                MerchantOrderID = "QvE8dZshpKhaOmHY1", OrderID = "32453550"
            };
            MGQueryTxnResult orderResponse = client.CheckOrderStatus(queryStatusCheckRequest).Result;

            if (!orderResponse.IsSuccess)
            {
                // Check reason and handle failure
                string reason = orderResponse.Message;
                // ...
                return;
            }

            // Order status
            string status = orderResponse.Data.status;

            Console.WriteLine(status);
        }
示例#15
0
        public static void DepositExample(MGClient client)
        {
            // Assemble deposit order data
            MGDepositRequest DepositOrderRequest = new MGDepositRequest
            {
                MerchantOrderID     = "QvE8dZshpKhaOmHY1",
                OrderAmount         = "100.00",
                CustomerEmail       = "*****@*****.**",
                OrderCurrency       = "USD",
                MerchantOrderDesc   = "desc",
                CustomerFirstName   = "John",
                CustomerLastName    = "Doe",
                CustomerAddress     = "The Moon, hill 42",
                CustomerCity        = "Sofia",
                CustomerCountryCode = "BG",
                CustomerZipCode     = "1303",
                CustomerPhone       = "123",
                CustomerIP          = "127.0.0.1",
                RedirectUrl         = "https://example-merchant.com/payment/return",
                CheckoutUrl         = "https://example-merchant.com/deposit",
                CallbackUrl         = "https://example-merchant.com/payment/callback",
            };

            // Initiate deposit order request
            MGDepositResult resp = client.InitDeposit(DepositOrderRequest).Result;

            // Check the request status
            if (!resp.IsSuccess)
            {
                // handle unsuccessful request
                string reasonForFailure = resp.Message;
                // ...
                return;
            }

            // Redirect the end user to the payment url
            string paymentUrl = resp.Data.DepositUrl;

            Console.WriteLine(paymentUrl);
        }
        public static List <MGClient> GetClients(String _search)
        {
            List <MGClient> clients = new List <MGClient>();

            using (SqlConnection connection = new SqlConnection(LUDBcononnectionString))
            {
                IDataReader dataReader;
                using (SqlCommand command = new SqlCommand())
                {
                    connection.Open();


                    command.CommandText = "[dbo].[SP_GetClientsByName]";

                    command.CommandType = CommandType.StoredProcedure;
                    command.Connection  = connection;
                    command.Prepare();
                    command.Parameters.Add("@Param1", SqlDbType.NVarChar).Value = _search;
                    dataReader = command.ExecuteReader();

                    MGClient client;

                    while (dataReader.Read())
                    {
                        client            = new MGClient();
                        client.Name       = dataReader.GetString(0);
                        client.TelMGProd  = dataReader.GetString(1);
                        client.TelContact = dataReader.GetString(2);
                        client.Street     = dataReader.GetString(3);
                        client.City       = dataReader.GetString(4);
                        client.PCode      = dataReader.GetString(5);
                        client.Tokens     = dataReader.GetInt32(6);

                        clients.Add(client);
                    }
                }
            }
            return(clients);
        }
        public static List <MGClient> GetClients()
        {
            List <MGClient> clients = new List <MGClient>();

            using (IDbConnection connection = new SqlConnection(LUDBcononnectionString))
            {
                IDataReader dataReader;
                using (IDbCommand command = new SqlCommand())
                {
                    connection.Open();


                    command.CommandText = "[SP_GetClients]";
                    command.CommandType = CommandType.StoredProcedure;
                    command.Connection  = connection;
                    dataReader          = command.ExecuteReader();

                    MGClient client;

                    while (dataReader.Read())
                    {
                        client            = new MGClient();
                        client.Id         = dataReader.GetInt32(0);
                        client.Name       = dataReader.GetString(1);
                        client.TelMGProd  = dataReader.GetString(2);
                        client.TelContact = dataReader.GetString(3);
                        client.Street     = dataReader.GetString(4);
                        client.City       = dataReader.GetString(5);
                        client.PCode      = dataReader.GetString(6);
                        client.Tokens     = dataReader.GetInt32(7);

                        clients.Add(client);
                    }
                }
            }
            return(clients);
        }
示例#18
0
        public void DepositUnsuccessful()
        {
            // Arrange
            MGDepositResult expectedResult = new MGDepositResult()
            {
                IsSuccess = false,
                Code      = "400",
                Message   = "endpoint currency mismatch",
                Data      = null,
            };
            string   responseMessage = "{ \"code\": \"400\", \"message\": \"endpoint currency mismatch\" } ";
            var      httpMock        = Mocks.GetMockedHttp(HttpStatusCode.BadRequest, responseMessage);
            MGClient client          = Mocks.GetMockedMGClient(httpClient: httpMock);
            var      DepositRequest  = Mocks.GetFullDepositRequest();

            // Act
            MGDepositResult actual = client.InitDeposit(DepositRequest).Result;

            // Assert
            Assert.IsFalse(actual.IsSuccess);
            Assert.AreEqual(expectedResult.Data, actual.Data);
            Assert.AreEqual(expectedResult.Code, actual.Code);
            Assert.AreEqual(expectedResult.Message, actual.Message);
        }