Это очень запутанная проблема, поэтому я сделаю все возможное, чтобы ее разработать. У меня есть приложение facebook холста, который принимает платежи и когда пользователь нажимает кнопку оплаты, происходит следующее:Функции обратного вызова в неправильном порядке
Моей Javascript функции обратного вызова вызывается и передается платежный идентификатор, и поэтому я сохранить этот платежный идентификатор и другой info в мою базу данных заказов.
Facebook вызывает URL-адрес обратного вызова, который у меня настроен, чтобы сообщить мне, когда оплата будет проходить. Он дает мне только идентификатор платежа, поэтому я использую его для поиска в базе данных для строки с идентификатором платежа, который они отправили. Затем я использую информацию в строке, чтобы заполнить электронное письмо, которое я отправляю клиенту для подтверждения заказа.
Моя большая проблема в том, что для какой-то причине шаг 2 становится закончена до выполнения шага 1 так, когда я пытаюсь посмотреть платежный идентификатор в базе данных, пока не существует, так что я не могу отправить электронная почта к клиенту. Что я могу сделать, чтобы исправить это? У меня есть псевдо-код ниже для обоих шагов.
Шаг 1:
using (OrderDBContext order = new OrderDBContext())
{
string message = Encryption.SimpleDecryptWithPassword(orderDetails.request_id, GlobalFacebookConfiguration.Configuration.AppId, 0);
string[] finalMessage = message.Split('@');
int orderID = Convert.ToInt16(finalMessage.ElementAtOrDefault(2));
Models.Order row = order.Orders.Where(i => i.ID == orderID).FirstOrDefault();
switch (orderDetails.status)
{
case "completed":
row.PaymentID = orderDetails.payment_id;
row.Currency = orderDetails.currency;
row.HashKey = orderDetails.request_id;
row.Paid = true;
order.SaveChanges();
return Json(new { message = "Your payment was processed! You will receive a confirmation email soon." }, JsonRequestBehavior.AllowGet);
case "initiated":
row.PaymentID = orderDetails.payment_id;
row.Currency = orderDetails.currency;
row.HashKey = orderDetails.request_id;
row.Paid = false;
order.SaveChanges();
return Json(new { message = "Your payment is being processed! You will receive a confirmation email as soon as the payment is confirmed." }, JsonRequestBehavior.AllowGet);
}
}
Шаг 2:
dynamic result = new StreamReader(request.InputStream).ReadToEnd();
var items = JsonConvert.DeserializeObject<RootObject>(result);
string paymentID;
if (items.entry != null && items.entry.Count > 0)
{
paymentID = items.entry[0].id;
}
else
{
// logic when items.entry is null or doesn't have any elements
paymentID = null;
}
if (PaymentHelper.confirmPayment(paymentID, GlobalFacebookConfiguration.Configuration.AppId, GlobalFacebookConfiguration.Configuration.AppSecret))
{
// if payment is confirmed then send email to us with the order details
// then send confirmation email to user letting them know that we are working on it
using (OrderDBContext order = new OrderDBContext())
{
Order row = order.Orders.Where(i => i.PaymentID == paymentID).FirstOrDefault();
SendEmail.sendOrderDetailsToWriter(row);
SendEmail.sendOrderDetailsToCustomer(row);
}
}
вам потребуется 3-й шаг, синхронизирующий 2 первых. – tschmit007
@ tschmit007 не уверен, что вы имеете в виду именно. можете ли вы привести примерный код? – user3610374