public void AuthorizeOrderRequestTests()
        {
            AuthorizeOrderRequest req = new AuthorizeOrderRequest(ORDER_NUMBER);

            AutoGen.AuthorizeOrderRequest post
                = EncodeHelper.Deserialize(req.GetXml()) as AutoGen.AuthorizeOrderRequest;
            Assert.AreEqual(req.GoogleOrderNumber, post.googleordernumber);

            req = new AuthorizeOrderRequest(MERCHANT_ID, MERCHANT_KEY, "Sandbox", ORDER_NUMBER);
            post
                = EncodeHelper.Deserialize(req.GetXml()) as AutoGen.AuthorizeOrderRequest;
            Assert.AreEqual(req.GoogleOrderNumber, post.googleordernumber);
        }
示例#2
0
        /// <summary>
        /// called from client server to create an order tht the user will authorize
        /// </summary>
        public async Task <ActionResult <object> > AuthorizeOrder([FromBody] AuthorizeOrderRequest orderRequest)
        {
            try
            {
                var user = (this.GetCachedUser());
                if (this.GetUserMode() != null && this.GetUserMode() == 1)
                {
                    throw new NotImplementedException();
                }

                if (user != null)
                {
                    if (user.IsBanned)
                    {
                        return(StatusCode(403));
                    }

                    var checkOrder = await GetOrder(orderRequest.OrderId);

                    if (checkOrder == null)
                    {
                        return(StatusCode(404));
                    }
                    var(order, client) = checkOrder.Value;

                    if (order.OrderState != 0)
                    {
                        return(StatusCode((int)HttpStatusCode.Gone));
                    }
                    if (order.ClientId != orderRequest.ClientId)
                    {
                        return(StatusCode((int)HttpStatusCode.BadRequest));
                    }
                    var orderItems = await _dbContext.OrderItem.Where(e => e.OrderId == order.OrderId).ToArrayAsync();

                    if (orderItems.Length > client.OrderMaxSize)
                    {
                        return(StatusCode((int)HttpStatusCode.NotAcceptable));
                    }

                    if (orderItems.Sum(e => e.CornAmount) > client.OrderMaxCost)
                    {
                        return(StatusCode((int)HttpStatusCode.NotAcceptable));
                    }

                    var recipientUser = await _dbContext.JoinUserModels()
                                        .FirstOrDefaultAsync((u) => u.UserId == client.RecipientUser);

                    var cornPrice = await ProbitApi.GetCornPriceAsync(_dbContext);

                    var cornOrderSum   = orderItems.Select(e => e.CornAmount).Sum();
                    var cornCurrentSum = orderItems.Select(e => e.UsdAmount / cornPrice).Sum();
                    var costDiff       = Math.Abs(cornCurrentSum - cornOrderSum);

                    if (costDiff <= client.AcceptedCostDiff)
                    {
                        if (recipientUser != null)
                        {
                            var processInfo = await TxUtils.PrepareTransaction(user,
                                                                               recipientUser,
                                                                               cornOrderSum,
                                                                               client.ClientId,
                                                                               "app:order",
                                                                               _dbContext);

                            var paymentSuccess = await processInfo.ExecuteTransaction(_dbContext);

                            if (paymentSuccess)
                            {
                                var jwt = CreateJwt(client, order, orderItems, cornOrderSum, processInfo.Transactions[0].TxId.Value);

                                order.TxId        = processInfo.Transactions[0].TxId;
                                order.OrderState  = 1;
                                order.CompletedAt = DateTime.Now;

                                await _dbContext.SaveAsync();

                                if (string.IsNullOrEmpty(client.Capture))
                                {
                                    return(new
                                    {
                                        jwt,
                                        txId = order.TxId.Value,
                                        amount = cornOrderSum
                                    });
                                }
                                else
                                {
                                    var restClient  = new RestClient();
                                    var url         = $"{client.Domain}/{client.Capture}";
                                    var redirectUrl = $"{client.Domain}/{client.Redirect}";

                                    var restRequest = new RestRequest(url, Method.POST);
                                    if (client.PostFormat == "application/x-www-form-urlencoded")
                                    {
                                        restRequest.AddHeader("Content-Type", "application/x-www-form-urlencoded");
                                        restRequest.AddObject(new { jwt });
                                    }
                                    else
                                    {
                                        restRequest.AddJsonBody(new { jwt });
                                    }

                                    var restResponse = restClient.Execute(restRequest);
                                    await BITCORNLogger.LogError(_dbContext, new Exception("Order hook callback"), restResponse.Content);

                                    return(new
                                    {
                                        redirect = redirectUrl,
                                        txId = order.TxId.Value,
                                        amount = cornOrderSum
                                    });
                                }
                            }
                            else
                            {
                                return(new
                                {
                                    txId = -1
                                });
                            }
                        }
                    }
                    else
                    {
                        return(StatusCode((int)HttpStatusCode.PaymentRequired));
                    }
                }

                return(StatusCode((int)HttpStatusCode.BadRequest));
            }
            catch (Exception e)
            {
                await BITCORNLogger.LogError(_dbContext, e, JsonConvert.SerializeObject(orderRequest));

                return(StatusCode(500));
            }
        }