///<Note>
        // receives order info
        // formats purchase and reimbursements
        // issues download tokens for successful purchase
        ///</Note>
        public Task HandleTransaction(PurchaseRequest order)
        {
            Purchase po     = FormatNewPurchase(order);    // creates a purchase object
            var      charge = _stripe.CreateCharge(order); // create Stripe charge

            po.stripe_charge_token = charge.Id;            // add charge token to purchase
            po.charge_token_result = charge.Status;        // add charge outcome to purchase

            if (charge.Status == "succeeded")
            {
                List <string> purchased = new List <string>();             // empty list will hold download tokens for purchase
                var           cart      = _cart.GetContent(order.cart_id); // pull the item-list from order
                foreach (var c in cart)
                {
                    string     hsmv_token  = String.Empty;                                        // holds the formated download token
                    CrashEvent hsmv_report = _crash.FindByHsmvReportNumber(c.hsmv_report_number); // pull report

                    // if(hsmv_report.timely) // TODO if report is timely
                    // {
                    //     Reimbursement funds = FormatReimbursement(hsmv_report, po.cart_id); // create Stripe transfer
                    // }

                    string token = new DownloadToken(
                        po.cart_id,
                        hsmv_report.hsmv_report_number.ToString(),
                        po.stripe_charge_token).Mint();

                    hsmv_token += hsmv_report.hsmv_report_number.ToString() + "." + token; // concatenate report number to the token
                    purchased.Add(hsmv_token);
                }
                if (!LogTransaction(po)) // saves our purchase object
                {
                    var error = "error writing purchase details";
                    throw new Exception(nameof(error));
                }
                ;
                return(Task.FromResult(purchased)); // return download tokens
            }
            else // path is hit if the Stripe charge fails (ie insufficient funds)
            {
                if (!LogTransaction(po)) // save the attempted purchase
                {
                    var fail = "error writing purchase details";
                    throw new Exception(nameof(fail));
                }

                var failure = new StandardResponse() // return the failure message to the client
                {
                    message = charge.FailureMessage
                };
                return(Task.FromResult(failure));
            }
        }
Exemple #2
0
        public async Task <OrderInfo> Buy(OrderRequest orderRequest)
        {
            if (!OrderRepository.CheckValidOrder(orderRequest.OrderItems))
            {
                throw new MessageException("Invalid order");
            }
            decimal amount = OrderRepository.PricePerOrder(orderRequest.OrderItems);

            Order order = Mapper.Map <Order>(orderRequest);

            await InitializeOrderAsync(orderRequest, order);

            string chargeId = StripeService.CreateCharge(orderRequest.TokenId, (long)amount);

            order.ExternalReferenceId = chargeId;

            string status = await StripeService.GetStatusAsync(chargeId);

            order.OrderStatus = status;

            await OrderRepository.UpdateAsync(order);

            if (order.OrderStatus == "succeeded" || order.OrderStatus == "amount_capturable_updated")
            {
                await OrderRepository.RemoveItemsAsync(orderRequest.OrderItems);

                return(new OrderInfo()
                {
                    Message = "Transaction succeeded!"
                });
            }

            return(new OrderInfo()
            {
                Message = "Payment failed!"
            });
        }