نحوه اتصال به دستگاه پوز
نویسنده: علی ارنا
تاریخ: ۱۴۰۳/۱۲/۲۱ ۰۹:۲۴
آدرس: www.dntips.ir
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; }
}
}