عنوان:

‫نحوه اتصال به دستگاه پوز


نویسنده: علی ارنا
تاریخ: ۱۴۰۳/۱۲/۲۱ ۰۹:۲۴
آدرس: www.dntips.ir
سلام و خسته نباشید
دوستان من یک نمونه کد از پرداخت الکترونیک سامان کیش گرفتم که میخواستم برای دستگاه پوز استفاده کنم. ولی داکیومنتش نگفته عملیات به چه ترتیبی صورت میگیره
فقط میدونم که اول باید درخواست دریافت یک شناسه بدیم و بعد درخواست یک پرداخت رو بدیم.
ولی نمیدونم که بعد این چه اتفاقی میفته. یعنی سیستم اونها چجوری دستگاه ما رو میشناسه و چاپ میکنه.
اگر کسی در این مورد کار کرده لطفا راهنمایی نمایید.
فریم ورک .net و react یا js

نظرات

  • محسن خان در ۱۴۰۳/۱۲/۲۱ ۱۰:۰۹
    سلام؛ برای شرکت پرداخت الکترونیک سداد، روی سیستم کلاینت باید نرم افزار pcpos رو نصب کنید که یک سرویس رو روی ویندوز run میکنه و شما با استفاده از اون، به pos دسترسی خواهید داشت. از این امکان شرکت سداد، برای پروژه حج و زیارت، دادگستری و ... استفاده شده: Sadad PcPos REST Service و یا شما فقط به آدرس سرورشون اطلاعات پرداخت رو ارسال میکنی (اون هم یک REST Service هست). داخل این اطلاعات پرداخت، مشخص میکنی که برای کدوم پایانه، اطلاعات ارسال بشه. پروسه خیلی شبیه به درگاه پرداخت آنلاین هست. تمام پروسه ارسال درخواست، هیچ نیازی به نصب پلاگین یا ابزار خاصی روی سرور نداره و تمام پروسه با ارسال درخواست به سرور‌های شرکت پرداخت الکترونیک سامان کیش انجام میشه. فقط اطلاعات ارتباطی رو باید از سامان کیش بگیرید و یا اینکه درخواست مستندات بهشون بدید تا اطلاعات دسترسی برای تست رو داشته باشین. یک نمونه از پیاده سازی آن با PHP در اینجا هست. برای دات‌نت هم فرقی نمی‌کنه. با HttpClient اطلاعاتی رو به یک REST Service قراره ارسال و دریافت کنید. از همون کد PHP ایده بگیرید:
    using System;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    using System.Net.Http.Headers;
    
    namespace Test
    {
        public class CentralPCPOSController
        {
            private string accessToken = null;
            private string refreshToken = null;
            private string tokenType = null;
    
            public CentralPCPOSController()
            {
                // refresh Access Token
                var terminalInfo = TerminalToken.GetLatest();
                if (terminalInfo == null || terminalInfo.ExpiredAt <= DateTime.Now)
                {
                    RefreshToken().Wait();
                }
                else
                {
                    this.accessToken = terminalInfo.AccessToken;
                    this.refreshToken = terminalInfo.RefreshToken;
                    this.tokenType = terminalInfo.TokenType;
                }
            }
    
            public async Task<HttpResponseMessage> StartPayment(HttpRequestMessage httpRequest)
            {
                var requestContent = await httpRequest.Content.ReadAsStringAsync();
                var request = JsonConvert.DeserializeObject<PaymentRequest>(requestContent);
    
                if (string.IsNullOrEmpty(request.Amount) || string.IsNullOrEmpty(request.ResNum))
                {
                    return new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
                    {
                        Content = new StringContent("Amount and ResNum are required.")
                    };
                }
    
                var terminalId = GetMineTerminal();
                if (terminalId == null)
                {
                    return new HttpResponseMessage(System.Net.HttpStatusCode.Conflict)
                    {
                        Content = new StringContent("Terminal not found. Error code 409")
                    };
                }
    
                var identifier = GetIdentifierPaymentPCPOS().Result;
                if (identifier == null)
                {
                    return new HttpResponseMessage(System.Net.HttpStatusCode.Conflict)
                    {
                        Content = new StringContent("Transaction identifier not found. Error code 409")
                    };
                }
    
                var requestBody = new
                {
                    TerminalID = terminalId,
                    Amount = request.Amount,
                    AccountType = 0,
                    ResNum = request.ResNum,
                    Identifier = identifier,
                    UserNotifiable = new
                    {
                        FooterMessage = "متن پایین رسید پرداخت",
                        PrintItems = new[] {
                            new {
                                Item = "آیتم اول",
                                Value = "محتوا اول",
                                Alignment = 0,
                                ReceiptType = 0
                            }
                        }
                    },
                    TransactionType = 0
                };
    
                try
                {
                    using (var client = new HttpClient())
                    {
                        var httpResponse = await client.PostAsJsonAsync("https://cpcpos.seppay.ir/v1/PcPosTransaction/StartPayment", requestBody);
                        var responseContent = await httpResponse.Content.ReadAsStringAsync();
                        var access = JsonConvert.DeserializeObject<YourResponseType>(responseContent);
    
                        if (access.IsSuccess)
                        {
                            // Save successful payment information if needed
                        }
    
                        return httpResponse;
                    }
                }
                catch (HttpRequestException)
                {
                    return new HttpResponseMessage(System.Net.HttpStatusCode.NotFound);
                }
                catch (Exception)
                {
                    return new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
                }
            }
    
            private async Task RefreshToken()
            {
                var sepUsername = Setting.GetValue("sep_username") ?? "*********";
                var sepPassword = Setting.GetValue("sep_password") ?? "*********";
                var sepScope = Setting.GetValue("sep_scope") ?? "*********";
                var sepGrantType = Setting.GetValue("sep_grant_type") ?? "*********";
    
                try
                {
                    using (var client = new HttpClient())
                    {
                        var response = await client.PostAsync("https://idn.seppay.ir/connect/token", new FormUrlEncodedContent(new[]
                        {
                            new KeyValuePair<string, string>("grant_type", sepGrantType),
                            new KeyValuePair<string, string>("username", sepUsername),
                            new KeyValuePair<string, string>("password", sepPassword),
                            new KeyValuePair<string, string>("scope", sepScope)
                        }));
    
                        var responseContent = await response.Content.ReadAsStringAsync();
                        var access = JsonConvert.DeserializeObject<TokenResponse>(responseContent);
    
                        var newToken = new TerminalToken
                        {
                            AccessToken = access.AccessToken,
                            TokenType = access.TokenType,
                            ExpiresIn = access.ExpiresIn,
                            ExpiredAt = DateTime.Now.AddSeconds(access.ExpiresIn),
                            RefreshToken = access.RefreshToken
                        };
    
                        newToken.Save();
    
                        this.accessToken = access.AccessToken;
                        this.tokenType = access.TokenType;
                        this.refreshToken = access.RefreshToken;
                    }
                }
                catch (HttpRequestException)
                {
                    throw new Exception("Request failed");
                }
            }
    
            private async Task<string> GetIdentifierPaymentPCPOS()
            {
                try
                {
                    using (var client = new HttpClient())
                    {
                        var response = await client.PostAsync("https://cpcpos.seppay.ir/v1/PcPosTransaction/ReciveIdentifier", null);
                        var responseContent = await response.Content.ReadAsStringAsync();
                        var access = JsonConvert.DeserializeObject<IdentifierResponse>(responseContent);
    
                        return access.Data.Identifier;
                    }
                }
                catch (HttpRequestException)
                {
                    return null;
                }
            }
    
            private string GetMineTerminal()
            {
                var terminalUser = TerminalUser.GetByUserId(this.userId);
                return terminalUser?.Terminal?.Code;
            }
        }
    
        public class PaymentRequest
        {
            public string Amount { get; set; }
            public string ResNum { get; set; }
        }
    
        public class YourResponseType
        {
            public bool IsSuccess { get; set; }
            // Other properties...
        }
    
        public class TokenResponse
        {
            public string AccessToken { get; set; }
            public string TokenType { get; set; }
            public int ExpiresIn { get; set; }
            public string RefreshToken { get; set; }
        }
    
        public class IdentifierResponse
        {
            public Data Data { get; set; }
        }
    
        public class Data
        {
            public string Identifier { get; set; }
        }
    
        // Mock classes for TerminalToken, Setting, TerminalUser, etc.
        public class TerminalToken
        {
            public static TerminalToken GetLatest() => null;
            public string AccessToken { get; set; }
            public string RefreshToken { get; set; }
            public string TokenType { get; set; }
            public DateTime ExpiredAt { get; set; }
            public void Save() { }
        }
    
        public class Setting
        {
            public static string GetValue(string key) => null;
        }
    
        public class TerminalUser
        {
            public static TerminalUser GetByUserId(int userId) => null;
            public Terminal Terminal { get; set; }
        }
    
        public class Terminal
        {
            public string Code { get; set; }
        }
    }

  • علی یگانه مقدم در ۱۴۰۴/۰۱/۰۷ ۱۱:۳۳