コード例 #1
0
        public async Task <IHttpActionResult> CompletePayment(WechatPaymentNotificationModel notification)
        {
            if (notification == null || !notification.IsValid())
            {
                return(Ok(GetErrorModel(ApiErrorCode.InvalidData)));
            }
            using (var context = new TasteContext())
            {
                var payment = context.Payments.FirstOrDefault(o => o.TransactionId == notification.TransactionId);
                if (payment == null || payment.Success)
                {
                    return(Ok());
                }
                var order = context.Orders.FirstOrDefault(o =>
                                                          o.OrderId == payment.OrderId && o.UserId == payment.UserId);
                if (order == null)
                {
                    return(Ok());
                }
                var restaurant = context.Restaurants.FirstOrDefault(r => r.Id == order.RestaurantId);
                if (restaurant == null)
                {
                    return(Ok());
                }

                var merchantId  = ConfigurationManager.AppSettings.Get("WeChatMerchantId");
                var merchantKey = ConfigurationManager.AppSettings.Get("WeChatMerchantKey");

                var paymentMade = await WechatPayHttpClient.CheckIfPaymentIsPaidAsync(payment.TransactionId, ConfigurationManager.AppSettings.Get("WeChatMiniProgramAppId"), merchantId, merchantKey);

                if (!paymentMade)
                {
                    return(Ok(GetErrorModel(ApiErrorCode.PaymentNotMade)));
                }

                payment.Success = true;
                order.Paid      = true;
                restaurant.OustandingBalance += Convert.ToInt32(notification.Total / restaurant.ExchangeRate);
                context.SaveChanges();

                return(Ok());
            }
        }
コード例 #2
0
        public async Task <IHttpActionResult> InitializePayment(PaymentRequestModel model)
        {
            using (var context = new TasteContext())
            {
                var order = context.Orders.FirstOrDefault(o => o.OrderId == model.OrderId && o.UserId == model.UserId);
                if (order == null || order.Paid)
                {
                    return(Ok(GetErrorModel(ApiErrorCode.OrderDoesNotExist)));
                }
                var restaurant = context.Restaurants.FirstOrDefault(r => r.Id == order.RestaurantId);
                if (restaurant == null)
                {
                    return(Ok(GetErrorModel(ApiErrorCode.RestaurantDoesNotExist)));
                }

                const string body          = "豪吃";
                const string signType      = "MD5";
                var          appId         = ConfigurationManager.AppSettings.Get("WeChatMiniProgramAppId");
                var          merchantId    = ConfigurationManager.AppSettings.Get("WeChatMerchantId");
                var          merchantKey   = ConfigurationManager.AppSettings.Get("WeChatMerchantKey");
                var          notifyUrl     = $"{RequestBaseUrl}/api/v1/payment/complete";
                var          userAddress   = HttpContext.Current.Request.UserHostAddress;
                var          nonce         = Guid.NewGuid().ToString().Replace("-", "");
                var          timeStamp     = DateTime.Now.SecondsSinceEpoch().ToString();
                var          transactionId = Guid.NewGuid().ToString().Replace("-", "");

                double total      = 0;
                var    orderItems = context.OrderedDishes.Where(o => o.OrderId == model.OrderId && o.UserId == model.UserId);
                foreach (var od in orderItems)
                {
                    var item = context.Dishes.FirstOrDefault(it => it.Id == od.DishId);
                    if (item == null)
                    {
                        continue;
                    }
                    total += item.Price * od.Quantity;
                }


                context.Payments.Add(new Payment
                {
                    Success       = false,
                    TransactionId = transactionId,
                    CreationDate  = DateTimeExtensions.BeiJingNow(),
                    UserId        = model.UserId,
                    OrderId       = model.OrderId
                });
                order.TipInPennies   = model.TipInPennies;
                order.TotalInPennies = Convert.ToInt32(total * 100);
                order.TaxInPennies   = Convert.ToInt32(order.TotalInPennies * 0.0925);
                context.SaveChanges();

                var subTotalRmb     = Convert.ToInt32(order.TotalInPennies * restaurant.ExchangeRate);
                var tipRmb          = Convert.ToInt32(model.TipInPennies * restaurant.ExchangeRate);
                var taxInPenniesRmb = Convert.ToInt32(order.TaxInPennies * restaurant.ExchangeRate);
                var orderTotalRmb   = subTotalRmb + tipRmb + taxInPenniesRmb;

                var result = await WechatPayHttpClient.GetPaymentInfo(userAddress, notifyUrl, appId, orderTotalRmb, WechatTradeType.JSAPI, transactionId, body, merchantId, model.UserId, merchantKey);

                var paymentData = new WechatPaymentModel
                {
                    Body                 = body,
                    NotifyUrl            = notifyUrl,
                    TransactionId        = transactionId,
                    TotalAmountInPennies = orderTotalRmb,
                    PrepayId             = result.PrepayId,
                    PaySign              = WechatMd5SignGenerator.GetPaymentSignMd5Hash(appId, timeStamp, nonce, result.PrepayId, signType, merchantKey),
                    Nonce                = nonce,
                    SignType             = signType,
                    TimeStamp            = timeStamp,
                    WebUrl               = result.WebUrl
                };

                return(Ok(paymentData));
            }
        }