سلام خسته نباشید
کاربر لاگین میکنه سپس خرید و بعد به درگاه بانک هدایت میشه و بعد از پرداخت خود ، درگاه کاربر رو هدایت می کنه به اون کنترلری که من بهش گفتم مثلا فلان آدرس
ولی وقتی از صفحه بانک بر میگرده دوباره داخل سایت ، کاربر logout شده ،
چه طور میتونم کاربر رو لاگین نگه دارم ؟
از سداد استفاده می کنم
کاربر لاگین نمیشه که بخواد لاگ اوت بشه
همون سداد بهت به مقداری برمرگردونه تو باید اون مقدار رو قبل تو بانکت یا تو سشنی چیزی نگه داری و مجدد مقایسه کنی و ازش بپرسی همچین چیزی رو داره
یه CallApi باید داشته باشی برای رفتن به سداد و وقتی برمیگردی
رو اون باید کار کنی
token
SignData
تو باید وقتی ارسالش میکنی به بانک Token رو نگه داری و تو برگشت Token رو به همراه Sindata بهش بدی بهت نتیجه برگردونه
منظورتون رو متوجه نشدم
کاربر در سایت لاگین میشه و بعد از انتخاب محصول و ... میره سبد خرید اونجا هم به درگاه بانک ارسال میشه ولی وقتی برمیگرده تو سایت دیگه لاگین نیست
دفعه اول که بانک میره که token نداره signdata رو داره ، چه تغییراتی باید بدم signdata رو ؟
var dataBytes = Encoding.UTF8.GetBytes(string.Format("{0};{1};{2}", request.TerminalId, request.OrderId, request.Amount)); var encryptor = symmetric.CreateEncryptor(Convert.FromBase64String(request.MerchantKey), new byte[8]); request.SignData = Convert.ToBase64String(encryptor.TransformFinalBlock(dataBytes, 0, dataBytes.Length));
خب شما مشکلت اینه تو زمان ارسال یا برگشت داری موجودیت کاربر لاگین شدت رو پاک میکنی ربطی به سداد نداره
شما چک کن زمانی که داری callapi میکنی و میفرستی موجودیت کاربرت رو پاک میکنی یا نه
تو برگشت هم چک کن شاید چیزی گذاشتی که داره logout میکنه
چون به جز بسته شدن مرورگر در هیچ صورت دیگری کاربر logout نمیشه مگر خودت بگی
شما زحمت بکش چک کن ببین وقتی لاگین هستی تو همون تب یه سایت دیگرو باز میکنی بر میگردی بازم لاگینی؟ لاگین کن - تو همون تب یه سایت باز کن - مجدد آدرس سایت خودت رو بزن
اگر لاگین نبودی مشکل از جای دیگست نه سداد
نیست اصلا پیدا نکردم اینا دوتا api هایی که صدا می زنم
public async Task<PayResultData> CallPayApi(string apiUrl, object value) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://sadad.shaparak.ir/"); client.DefaultRequestHeaders.Accept.Clear(); StringContent content = new StringContent(JsonConvert.SerializeObject(value), Encoding.UTF8, "application/json"); var response = await client.PostAsync(apiUrl, content); string apiResponse = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject<PayResultData>(apiResponse); return result; } } public async Task<VerifyResultData> CallVerifyApi(string apiUrl, object value) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://sadad.shaparak.ir/"); client.DefaultRequestHeaders.Accept.Clear(); StringContent content = new StringContent(JsonConvert.SerializeObject(value), Encoding.UTF8, "application/json"); var response = await client.PostAsync(apiUrl, content); string apiResponse = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject<VerifyResultData>(apiResponse); return result; } }
اینم متدی هست که برا دفعه اول میره بانک , api رو صدا میزنه
request.OrderId = new Random().Next(1000, int.MaxValue).ToString(); var dataBytes = Encoding.UTF8.GetBytes(string.Format("{0};{1};{2}", request.TerminalId, request.OrderId, request.Amount)); var symmetric = SymmetricAlgorithm.Create("TripleDes"); symmetric.Mode = CipherMode.ECB; symmetric.Padding = PaddingMode.PKCS7; var encryptor = symmetric.CreateEncryptor(Convert.FromBase64String(request.MerchantKey), new byte[8]); request.SignData = Convert.ToBase64String(encryptor.TransformFinalBlock(dataBytes, 0, dataBytes.Length)); if (HttpContext.Request.Host != null) request.ReturnUrl = string.Format("{0}://{1}{2}/factor-checkout",Request.Scheme, Request.Host, Url.Content("~")); var ipgUri = string.Format("https://sadad.shaparak.ir/api/v0/Request/PaymentRequest"); CookieOptions option = new CookieOptions(); option.Expires = DateTime.Now.AddHours(1); Response.Cookies.Append("bank_data", JsonConvert.SerializeObject(request), option); _purchaseResult2 = request; var data = new { request.TerminalId, request.MerchantId, request.Amount, request.SignData, request.ReturnUrl, LocalDateTime = DateTime.Now, request.OrderId, }; var res = await CallPayApi(ipgUri, data); if (res != null && res != null) { "; if (res.ResCode == "0") { )); return new BankResultViewModel { PurchasePage = request.PurchasePage, Token = res.Token }; } ViewBag.Message = res.Description; }
اولا سداد این متد رو دیگه ساپورت نمیکنه SecurityProtocolType.Tls
باید SecurityProtocolType.Tls1.1 | SecurityProtocolType.Tls1.2 استفاده کنی
بعدشم تو این مشکلی نیست گفتم اگر کاربرت لاگین هستش و تو حساب کاربریشه و میره میاد میندازه بیرون ربطی به پرداختت نداره شما داری کاربر رو sinout میکنی کجا؟ معلوم نیست break poit بزار ببین قبل از اینکه redirect میکنی کاربرت هنوز سشن یا هرچیز دیگه که داری برای لاگین ثابت باقی مونده یا نه؟
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)