somekind napisał(a)
Czy Tobie nie chodzi czasem o WebHandler (ashx)? [...]
Strzał w 10 :d
W zamian mogę się odwdzięczyć moją implementacją - wystarczy w switchu dodać zapisywanie interesujących nas informacji o transakcji, lub cokolwiek.
<%@ WebHandler Language="C#" Class="PlatnosciUrlOnline" %>
using System;
using System.Web;
using System.Configuration;
using System.IO;
using System.Security.Cryptography;
using ServicePlatnosciPl;
public class PlatnosciUrlOnline : IHttpHandler {
#region statusy tranzakcji
private const int STATUS_NOWA = 1;
private const int STATUS_ANULOWANA = 2;
private const int STATUS_ODRZUCONA = 3;
private const int STATUS_ROZPOCZĘTA = 4;
private const int STATUS_OCZEKUJE = 5;
private const int STATUS_ZWROT = 7;
private const int STATUS_ZAKOŃCZONA = 99;
#endregion
#region konfiguracja POSa
private int PosID { get { try { return int.Parse(ConfigurationSettings.AppSettings["ServicePlatnosciPl.PosID"]); } catch (Exception e) { return -1; } } }
private string Key1 { get { return ConfigurationSettings.AppSettings["ServicePlatnosciPl.Key1"]; } }
private string Key2 { get { return ConfigurationSettings.AppSettings["ServicePlatnosciPl.Key2"]; } }
#endregion
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
int error = 0;
//Request.Form["pos_id"]-identyfikator POSa
//Request.Form["session_id"]-wartosc podana przez Sklep w trakcie tworzenia platnosci
//Request.Form["ts"]-znacznik czasowy, wartosc potrzebna w celu weryfikacji podpisu
//Request.Form["sig"]-podpis przeslanej informacji =md5(pos_id + session_id + ts + key2)
try
{
string sessionId = context.Request["session_id"];
string ts = context.Request["ts"];
if (context.Request["pos_id"] != PosID.ToString()) error = 100;
else if (string.IsNullOrEmpty(sessionId)) error = 101;
else if (string.IsNullOrEmpty(ts)) error = 102;
else if (context.Request["sig"].ToUpper() != md5(PosID.ToString() + sessionId + ts + Key2)) error = 103;
else
{
PaymentsClient paymentsClient = new PaymentsClient();
Trans trans = paymentsClient.get(PosID, sessionId, ts, md5(PosID.ToString() + sessionId + ts + Key1));
if (trans.transPosId == PosID)
{
sessionId = trans.transSessionId;
ts = trans.transTs;
//tu trzeba jeszcze zerknąć na podpis trans
if (trans.transSig.ToUpper() == md5(PosID.ToString() + sessionId + trans.transOrderId + trans.transStatus.ToString() + trans.transAmount.ToString() + trans.transDesc + ts + Key2))
switch (trans.transStatus)
{
case STATUS_ANULOWANA:
case STATUS_NOWA:
case STATUS_ODRZUCONA:
case STATUS_ROZPOCZĘTA:
case STATUS_ZWROT:
break;
case STATUS_OCZEKUJE://powinniśmy odebrać lub odrzucić
error = isStatusOK(paymentsClient.confirm(PosID, sessionId, ts, md5(PosID.ToString() + sessionId + ts + Key1)), sessionId);
//error = isStatusOK(paymentsClient.cancel(PosID, sessionId, ts, md5(PosID.ToString() + sessionId + ts + Key1)), sessionId);
break;
case STATUS_ZAKOŃCZONA://Rozliczone
break;
default:
error = 599;
break;
}//błąd podpisu informacji o tranzakcji
else error = 209;
}//przy próbie poprania info o transakcji otrzymaliśmy błędny PosID
else error = 209;
}
if (error == 0) context.Response.Write("OK"); else context.Response.Write(DateTime.Now.ToUniversalTime().ToString("s") + "> " + error.ToString());
}
catch (Exception ex)
{
context.Response.Write(DateTime.Now.ToUniversalTime().ToString("s") + "> " + ex.Message);
}
//wysłanie komunikatu o błedzie lub statusu OK
}
//gotowe
public bool IsReusable { get { return false; } }
private string md5(string s)
{//gotowe
StreamWriter streamWriter = new StreamWriter(new MemoryStream());
streamWriter.Write(s);
streamWriter.Flush();
return Sebo.Tools.byteA2hexStr((new MD5CryptoServiceProvider()).ComputeHash(streamWriter.BaseStream));
}
private int isStatusOK(Status status, string sessionId)
{//Gotowe
if (status.transPosId != PosID) return 209;
if (status.transSessionId != sessionId) return 500;
if (status.transSig.ToUpper() != md5(PosID.ToString() + sessionId + status.transTs + Key2)) return 209;
return 0;
}
}
PS: Metoda Sebo.Tools.byteA2hexStr(byte[]) przekształca ciąg bajtów w jego reprezentację HEX (zapisaną WIELKIMI cyframi).