Obsługa Platnosci.pl [C#@IIS]

0

Witam,
Tworzę witrynę web, która powinna obsługiwać płatności online.
Po przejrzeniu ofert serwisów świadczących tego typu usługi skłaniam się do Platnosci.pl (witryna będzie skierowana na polski rynek), jednak nie jest to jeszcze przesądzone. Znalazłem ich dokumentację techniczną a w niej informację (3.8.) o możliwości przekazywania transakcji za pomocą WEBAPI/SOAP.
Do projektu, tworzonego w VS 2008, dodałem "Service Reference" jednak nie widzę gdzie powinienem podać wymagane dane konfiguracyjne (POSid, Key1, Key2), oraz gdzie mam wpisać kod zdarzenia wykonywanego po zaakceptowaniu transakcji.
Interesuje mnie również, czy serwis ten udostępnia interface do testowania tworzonych aplikacji, bez konieczności zakładania konta. Chodzi o to, że tworzę aplikację dla pewnej grupy, z której jednak nie zamierzam sam korzystać - po co więc miałbym zakładać sobie konto w serwisie transakcyjnym.

Pomocne będą również wskazówki jak obsłużyć inne podobne serwisy transakcyjne (wtedy mógłbym nie ograniczać moich potencjalnym klientów jedynie do Platnosci.pl).
A może są jakieś gotowe komponenty pozwalające w łatwy sposób wpiąć płatności online w witrynę ASPX?
Czy ktoś z was robił coś takiego?

0

generalnie wszystko powinno byc w dokumnetacji, jesli nie ma to napisz ze maja dokumnetacje do d...
ale z tego co widze wyglada calkiem niezle
masz parametr mowiacy czy transakcja jest testowa czy nie, oraz podpis wiadomosci, a takze jak podpis skonstruowac
raczej musisz miec konto, jesli projekt jest w fazie rozwoju, to albo niech dadza ci dostep do konta, a jesli juz cos na nim dziala i nie chca ci dac, niech wszystko skonfiguruja i podadza ci odpowiednie parametry

najlepiej zacznij od tego ze przeczytasz cala dokumnetacje! ze zrozumieniem, a jesli nie rozumiesz przeczytaj jeszcze raz, coz po to jest dokumnetacja

0
massther napisał(a)

[...] wszystko powinno byc w dokumnetacji, [...] z tego co widze wyglada calkiem niezle
Z tym to się jak najbardziej zgadzam.
Bez problemu można z tej dokumentacji się dowiedzieć jak odczytywać info o transakcjach, oraz jak wysyłać je i jak nimi sterować (anulować, potwierdzać) w serwisie. Moje wątpliwości w sumie wzbudziło tylko jak zrobić ten UrlOnline z którym ma kontaktować się serwis. Obecnie mam po prostu ASPX web Page (System.Web.UI.Page) w której w metodzie System.Web.UI.Page.Page_Load(object,EventArgs) wykonuję całą robotę, a plik PlatnosciUrlOnline.aspx wygląda następująco:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PlatnosciUrlOnline.aspx.cs" Inherits="PlatnosciUrlOnline" %>
<% %>

No i VS zasypuje mnie ostrzeżeniami o niepoprawnej strukturze XML w tym pliku. Myślałem, że może jest jakiś specjalny template do budowania 'stron' tego typu serwisów.

massther napisał(a)

raczej musisz miec konto, jesli projekt jest w fazie rozwoju, to albo niech dadza ci dostep do konta, a jesli juz cos na nim dziala i nie chca ci dac, niech wszystko skonfiguruja i podadza ci odpowiednie parametry
Największy problem z tym, że ja na razie piszę aplikację a potem dopiero będę szukał dla niej klientów (więc nie bardzo mam kogo zapytać by mi dał dostęp do konta na którym to będzie chodziło ;] ). Tzn jest to swego rodzaju plugin do innego dość popularnego systemu nie posiadającego jednak takiej funkcjonalności.

massther napisał(a)

najlepiej zacznij od tego ze przeczytasz cala dokumnetacje! [...]
Tak oczywiście zrobiłem.

massther napisał(a)

coz po to jest dokumnetacja
No i chwała jej za to, że w ogóle jest [browar]
Niestety ten system do którego chcę to włączyć jest dla odmiany prawie całkowicie jej pozbawiony. ...ale to już osobna bajka.

0

jesli chodzi o ostrzezenia, pewnie chodzi o to ze poprawny dokument html ma znaczniki <html><head><title></title><body></body></html> plus deklaracja typu dokumnetu w kazdym badz razie dla xhtml, nie pamietam czy np. title bylo wymagane w html 4

0
massther napisał(a)

jesli chodzi o ostrzezenia, pewnie chodzi o to ze poprawny dokument html ma znaczniki <html>[...]
No oczywiście, że o to chodzi. No ale przecież nie chcę w odpowiedzi generować dokumentu HTML. Pytanie tylko czy dać sobie spokój z ostrzeżeniami, czy może w .NET jest na to rozwiązanie pozwalające jakoś zadeklarować, że nie tworzę strony HTML tylko raczej serwis, który ma przetwarzać różne zdarzenia w zależności co dostanie w parametrach POST.

0

Czy Tobie nie chodzi czasem o WebHandler (ashx)?
Ma toto adres, metodę ProcessRequest, w której masz dostęp do HttpContext, a więc Request i Response no i nie tworzy żadnego HTMLa.

0
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).

1 użytkowników online, w tym zalogowanych: 0, gości: 1