Kotimaisten verkkopankkien maksu- ja tunnistuspalvelut Drupaliin

Tässä keskustelunavaus kotimaiselle Drupal-foorumillemme:

Drupal Groupsin puolella kyseltiin kotimaisten pankkiliittymien saatavuutta. En ole törmännyt valmiisiin moduuleihin, ainakaan avoimena koodina.

Olen ollut aikoinaan toteuttamassa pankkikoodia webskasovelluksiin. Mainitsin viime syksyn drupal.fi-käynnistyskeskustelussa, että nämähän voisi toteuttaa Drupaliin moduuleina. Voisin olla halukas osallistumaan näiden toteutusprojektiin jossakin muodossa. En todennäköisesti voi osallistua projektiin kuitenkaan toteuttajana, koska tämä voi aiheuttaa ongelmia aiempien sopimustöiden välillä.

TUPAS- ja e-maksu -moduulit kannattaisi julkaista GPLv2-lisenssillä. Näin ei ajauduta ristiriitoihin eri lisenssimallien yhteensovittamisessa. Jokaisella olisi tietysti mahdollisuus käyttää koodia esim. asiakasprojekteissa tai hyödyntää osaamistaan taloudellisesti. Korjaukset ja muutokset koodiin tehtäisiin yhteisesti, jotta lopputuloksena olisi mahdollisimman viimeistelty ja kaikkia hyödyntävä paketti.

Tässä linkkejä kiinnostuneille (ja itsellekin talteen - osoitteet ovat aina hukassa):

Ålandsbankenin ohjeita minulla ei ole, niille en ole ollut toteuttamassa liittymiä.

Minua viehättää erityisesti ajatus TUPAS-tunnistuksen liittämisestä Drupaliin. OpenID on minusta nykyisellään liian monimutkainen loppukäyttäjän näkökulmasta. Drupal 6:n OpenID-moduulin voisi tosin ottaa TUPAS-moduulin toteutuksen pohjaksi, koska peruskäytännöt ovat kummassakin samat. Siitä saisi ainakin peruskoodia esim. sessiohallintaan ja token-kytkennän toteutukseen.

Suomalaiset maksusysteemit

Kannatetaan lämpimästi. Suomalaisten maksusysteemien liittäminen Drupal -moduliksi on takuuvarmasti suurta osaa suomalaisia Drupal -kehittäjiä koskettava asia. Itse en valitettavasti pysty jeesaamaan ainakaan teknisen toteutuksen suhteen. Vinkkinä lienee ainakin se, että kehittäjien kannattaa tosiaankin huolehtia sopimuksista siten, että koodi olisi yhteisön käytettävissä ja ylläpidossa. Kaikille hyödyllistä, tilaaja ja pankit mukaanlukien.

"...Kerran päivässä on varaa antaa periksi..."

Moduulien lisensointi

Miten moduulien lisensointi muuten menee, onko ylipäänsä mahdollista julkaista Drupal-moduulia joka ei olisi GPL-lisensoitu? (Ei sikäli, että olisin tätä tekemässä, mutta kiinnostaa vaan.)

kyllä tuo onnistuu. Eihän se

GPL tunnu meidän drupal ja php sovelluksia muutenkaan saastuttavan kun emme yleensä anna koodejamme muille. Päinvastoin: aika paljon panostamme siihen, ettei kukaan ja varsinkaan häkkerit näkisi miten on sovellukset kirjoitettu. Tämä kai todistaa, että se, että drupal tai PHP (?) on GPL:ää ei tee sovelluksistamme GPL:ää -> saat julkaista koodisi millä tahansa lisenssillä tai jättää julkaisematta kokonaan. 99.9% meistä tuntuu valitsevan tuon jälkimmäisen.

Oma ja julkaistu koodi

GPL sallii koodin muokkaamisen ja johdannaisten tekemisen omaan käyttöön, eikä se sisällä velvoitetta tällaisen koodin julkaisemiseen. Jos koodi kuitenkin julkaistaan, sen pitää itsekin käyttää GPL:ää tai GPL-yhteensopivaa lisenssiä. Yleinen (joskaan ei täysin yksimielinen) mielipide Drupal.orgissa on, että moduulit ja teemat jotka käyttävät Drupalin PHP-funktioita ovat GPL:n koskettamaa johdannaiskoodia. Tästä aiheesta oli pitkä ja riitaisa keskustelu vuonna 2005. Koodin tuotosten eli valmiin sivuston jakelua ei lasketa koodin julkaisemiseksi, eivätkä GPL:n velvoitteet kosketa sitä. Tämän takia esim. Drupal.org voi käyttää teemaa, jota ei ole julkaistu muualla.

no näin se varmaan on, että ei tarvitse julkaista

mutta jos julkaisee niin sitten pitää olla GPL. En ole lakimies. Ihme että free software foundation ei ole tehnyt super GPL:ää, joka velvoittaisi julkaisemaan myös serverside scriptit jos rakennat saittisi tällä super GPL:llä lisensioidun frameworkin päälle.

"Super GPL"

Tällainen GPL-laajennus on olemassa, sen nimi on Affero.

Paitsi jos tarkoitit drupal modulilla sitä, että

drupal.org tms ottaa niitä "markkinoitavaksi" omille sivustoilleen tai liittää drupalin ytimeen tms, niin se on kai sitten niiden asia päättää ottavatko. se, millä lisenssillä tarjoat modulia on niille varmaan tärkeä asia ja luulisin, että vaativat GPL:n, muuten saat markkinoida moduliasi muita kanavia pitkin. Tämä on minun arvaus. Asia varmaan selviäisi jos lukisi drupal.org:in sivuilta jotain developer ohjeita.

Maksusysteemien toteutus

Suomalaiset pankkimaksut voisivat syntyä jonkin asiakasprojektin sivutuotteena, mutta niistä on astetta työläämpää paketoida kovin geneeristä moduulia. Drupal e-commerce ja Ubercart tarjoavat molemmat oman payment gateway rajapintansa, mutta varsinkin e-commercen osalta dokumentaatio on aika heikkoa. Pelkkä maksumoduulin toteutus olisi varsin triviaali, mutta siitä tulisi valitettavan kertakäyttöinen itsenäisenä moduulina. TUPAS-tunnistus onkin sitten ihan toinen tarina. Tunnistaminen ei sinällään liity maksupalveluihin mitenkään vaan toimii sähköisenä allekirjoituksena. Myös TUPAS-tunnistuksen tekninen toteutus on varsin helppo. Drupalin yhteydessä on kuitenkin mietittävä mikä olisi järkevin paikka sähköisille allekirjoituksille.

TUPAS ja pankkimaksu samalla hehtaarilla

Tunnistusta ja maksua käytetään joskus rinnakkain samassa palvelussa.

On mahdollista, että tuote koostuu heti maksettavasta komponentista (esim. toimitusmaksu, ensimmäinen käsiraha) ja osin luotolla myytävästä osuudesta. Ennen kuin asiakkaan luottotiedot voidaan tarkistaa, tarvitaan TUPAS-tunnistus.

Pankkimaksu ja TUPAS ovat teknisenä toteutuksena melko lähellä toisiansa. Maksussa on hieman eri nimisiä kenttiä, mutta logiikka on pitkälle sama kuin TUPAS-tunnistuksessa. Pankkimaksussa pitää tosin luoda HTML-formin kentät pankkikohtaisilla ohjeilla, eli jokaisella pankilla on omansa. TUPAS on helpompi, koska siinä käytetään samaa rakennetta kaikille pankeille.

Pankkikohtaisia merkkijonosäätöjä lukuunottamatta koodin määrä maksun ja TUPAS:in välillä on melkeinpä sama, ja kyseessä siis pitkälti yhteistä koodia. Moduulin koodi voi olla täysin geneeristä. Inputiksi annetaan veloitettavan tuotteen nimike, hinta, asiakastieto, viitenumero, yms. ja lopulta saadaan tieto siitä, onko maksu suoritettu vai ei.

Myyjäkohtaiset tiedot, kryptauksessa tarvittavat pankkiavaimet yms., syötetään kantaan tai hyvin suojattuun tiedostoon. Se, mistä ostoskorirakenteesta nuo tuote- ja veloitustiedot moduuliin siirtyvät, on toissijaista, koska moduulissa on tietysti oltava selkeä API, joilla tiedot välitetään.

Maksujärjestelmän rakentaminen kokonaisuutena on toki tunnistusta järeämpi. On-line -tapahtumien lisäksi tarvitaan tausta-ajoa hoitava systeemi, jossa käsitellään pankeilta tullutta konekielistä dataa ja varmistetaan maksujen kohdistuminen oikein (ns. täsmäytysajo). Tämän kohdalla tullaan sitten niihin asiakaskohtaisiin räätälöintitarpeisiin, kun yhdellä on SAP ja toisella ei...

Pointtini on siis se, että jos tekee kerran TUPAS:in, niin lähes samalla vaivalla saa koodin myös pankkimaksun rakentamiseksi.

Muuallakin ideoidaan...

... eli pari tähän aiheeseen liittyvää moduuliuutuutta. Toiseen maakohtaiseen maksujärjestelmään kaavailtu rajapinta: http://drupal.org/project/clieop Clieop is a specification of the dutch direct debit payment method 'automatische incasso'. The specifications are hold by http://www.equens.com/ and can be downloaded http://www.equens.com/support/file_layout/index.asp Ja ehkä hieman tutumpi maksupalvelu: http://drupal.org/project/gcheckout e-Commerce Google Checkout. This module provides a Google Checkout payment method for the e-Commerce suite of modules. Kummatkin ovat enemmän tai vähemmän suunnittelu/ideointiasteella. Mielenkiintoista seurata, kuinka muiden ratkaisut kehittyvät.

Itsenäinen moduuli vai plugin

Se, mistä ostoskorirakenteesta nuo tuote- ja veloitustiedot moduuliin siirtyvät, on toissijaista, koska moduulissa on tietysti oltava selkeä API, joilla tiedot välitetään. Itse näkisin että kyseinen moduuli ennemminkin toteuttaa jotain valmista apia kuin että tätä kannattaisi ratkaista toteuttamalla itsenäinen moduuli apeineen. Pelkkä Suomalaiset verkkomaksut toteuttava moduuli olisi toki kehittäjille hyödyllinen työkalu, mutta tavallisten käyttäjien kannalta toteutus osana valmista ecommerce -järjestelmää olisi nähdäkseni hyödyllisin ratkaisu. PHP-koodi sekä maksujen, että tunnistuksen tekemiseksi on tosiaan melko yksinkertainen ja löytyy luultavasti valmiina kaikilta asiaan perehtyneiltä kehittäjiltä. Toteutustavasta huolimatta kaikkien pankkien maksut ja tunnistuksen toteuttavan mokkulan julkaiseminen avoimena lähdekoodina dokumentaatioineen olisi iso palvelus myös muille kuin Drupalia käyttäville kehittäjille. Eiköhän pistetä oma projekti pystyyn tämän ympäriltä. Luulen että kiinnostuneita löytyy runsaasti heti kunhan jotain edes etäisen toimivaa on saatu julkiseksi.

Tai moduuli, jolle tehdään plugin-sovitin ja rajapinta?

En ole ihan varma, mitä tarkoitat termillä plugin, tai siis miten se eroaa käytännössä Drupal-moduulista. Moduulin toteutuksen kannalta ei saisi kuitenkaan olla minusta eroa sillä, millaiseen ostoskoriin tai muuhun prosessiin se kytketään. Muuten tulee luotua sellaista koodia, joka ei ole uudelleenkäytettävää, jota joutuu säätämään tapauskohtaisesti ja joka voi mennä rikki kun jonkun toisen moduulin koodia muutetaan.

Maksumoduulin suunnittelussa kannattaa jollakin tavalla tietysti huomioida nuo yleisimmät ja todennäköisimmät vastakappaleet ja niiden rajapinnat.

Käytännön toteutuksessa ne voisi minusta erottaa kuitenkin omiksi sovittimikseen, joka eristää eri moduulien väliset tietorakenteelliset ja semanttiset riippuvuudet ja mahdollistaa uusien ostoskorien yhdistämisen prosessiin. Maksumoduulilla voi siis olla täysin oma "fiksattu" rajapinta, joka ei riipu muista ja on täysin yleiskäyttöinen.

Hatusta revittynä se voisi olla esim. jotain tämän tapaista:

interface iPankkiMaksu {

  // Yhteisiä kaikille i[xxxxx]Maksu -tyypeille:  

  public function luoMaksupyynto($ostoskori, ...);  

  public function kasitteleMaksupyynto();

  // iPankkiMaksu-kohtaiset:   

  public function luoMaksuPainikkeet($maksuPyynto);   

  public function kasittelePankinPaluusanoma($paluuSanoma);

}

Pankkikohtaiset toteutukset johdettaisiin iPankkiMaksusta:

class NordeaPankkiMaksu implements iPankkiMaksu {

  /* ... */   

  public function luoMaksuPainikkeet($tilaus)   

  {     

    return '<form><input x /><input y /></form>';   

  }

}

Tuon lisäksi olisi sitten jokin plugin-moduuli tietylle ostoskoriratkaisulle, joka ymmärtää sen tietorakenteet, tekee mahdolliset normalisoinnit iPankkiMaksu-tyypille ja kutsuu sitten maksutapahtuman aktivoivaa metodia.

Esim. normalisoinnissa voisi olla tämän näköistä koodia:

class UbercartinOstoskoriYleiseksiOstoskoriksi implements iOstoskoriSovitin {

  /* ... */   

  public function asetaAsiakasTiedot($ubercartinKori)   

  {     

    $maksaja = new Henkilo;   

    $maksaja->asetaNimi($ubercartinKori->sukunimi .' '. $ubercartinKori->etunimi);     $drupalOstoskori = new DrupalKori;

    $drupalOstoskori->asetaMaksaja($maksaja);   

  } /* ... */

}

Eli jos toisessa käsitellään nimeä etu- ja sukunimitasolla ja toisessa yhtenä kenttänä (muodossa "Sukunimi Etunimi"), niin sovitin hoitaisi näiden eri muotojen konversiot. Tällaiset tehtävät eivät kuulu maksukomponentin tehtäviin.

Itse asiassa koko maksumoduuli voitaisiin saman tien yleistää niin, että se sallii pankkimaksun lisäksi myös Finvoice-laskutuksen. En tarkoita, että Finvoicea pitäisi toteuttaa, mutta kun kerran tässä jo käsitellään tuotteita, hintoja, asiakastietoa, toimitustapoja jne., niin koossa ovat Finvoiceenkin tarvittavat palaset.

Kokonaistoteutus voisi mennä niin, että on ylätyyppi iTilaus, joka sisältää laskutettavan tilauksen tiedot omina alatyyppeinään (asiakas, tuote, tuotteen parametrit, maksutapa, viitenumerot). iTilaus voitaisiin sitten välittää joko iPankkiMaksu, iLuottokorttiMaksu-, tai iFinvoiceLasku -tyypeille, jotka hoitaisivat sen rahaliikenteen. (Finvoicelle tuo interface voi olla turha, jos toteutuksen johdannaisia on vain yksi.)

Koodista käsin ja siis "käyttäjän" näkökulmasta (jossa käyttäjä voi olla jonkun Ubercartin plugin-koukku, joka on tarkoitettu maksatuksen käynnistämiseksi - tai miten se sitten onkaan toteutettu), kutsuttaisiin kuitenkin aina pelkästään metodia iTilaus.hoidaMaksu();, ja tuo tekisi käytännössä joko pankkimaksun, luottokorttimaksun, Finvoice-laskun jne. riippuen siitä, mikä maksutapa on valittuna ja sallittuna ja mitä sovittimia on asennettuna.

VirtueMartin suomalaismaksujen moduuli

Moi Teemu Mäntynen on julkaisut verkkomaksu moduulin VirtueMartille (GPL2) http://www.tyovaline.fi/oss/fipn/ Voisi olla aiheellista työskennellä yhdessä :)

Payment API

Huomasin tällaisen projekitityngän: http://drupal.org/project/payment_api

Jos oikein ymmärsin, Payment API voisi toimia "välikerroksena" Drupalin ja eri maksurajapintojen välillä. Se siis hoitaisi tuon yleistämisen, jota aiemmassa koodiesimerkissä hahmottelin.

finvoice, übercart &c.

Haen parhaillaan ratkaisua mm. finvoice-laskutuksen integroimiseen drupaliin/übercartiin. Onkohan tämä projekti edennyt mitenkään?

Kansallisesti yhteistyön paikka?

Itse olisin myös kiinnostunut tästä aihekokonaisuudesta. Siis miten ja millä resursseilla saisimme tässä ketjussa esitetyt asiat toteutettua niin että ne olisivat avoimia ja kaikkien hyödennettävissä. Drupal/Ubercart ratkaisu on erittäin mielenkiintoinen, mutta siihen tulisi saada edellä esitettyjä toiminnallisuuksia. Uskoisin että tähän olisi löydettävissä myös julkista rahoitusta, jos vain tekijöitä löytyisi.

t. Mika

Summer of code?

Löytyisiköhän Suomesta sponsoreita pienemmässä mittakaavassa jos tästä tai jostain vastaavista "yleishyödyllisistä" avoimen lähdekoodin hankkeista tekisi Summer of Code -tyyppisen hankkeen? Kansainvälistä rahoitusta voi olla vaikea saada tälläiselle ja ihan puhtaasti vapaaehtoisvoimin vähän kookas hanke. Päteviä opiskelijoita varmasti löytyisi ja menttoreitakin varmaan. Löytyisiköhän kiinnostunut koordinaattori etsimään sponsoreita ja miettimään miten käytännön tekniset muodollisuudet saadaan hoidettua? Julkistakin rahoitusta varmaan saisi jonkun verran, mutta ainakin osa pitäisi luultavasti saada yksityiseltä puolelta.

Pari muutakin vastaavaa hanketta varmaan löytyis D.fi:n ympäriltä. Ihan vaan ideana...

Rahoitusta etsimään

Jep,

Hyviä ajatuksia. COSS sivuilla on Kesäkoodi haku käynnissä. http://www.coss.fi/web/coss/developers/summercode. Tuohan on opiskelijalähtöistä, mutta tänä vuonna olisi Drupaliin liittyvä projekti mukava nähdä listoilla.   COSSin suunnasta voisi kysyä myös yleisesti mahdollisuuksia tähän liittyen. Kyllä varmasti yksityistä rahaakin näiden asioiden kehittämiseen löytyisi, kaikkien ei kannata yrittää rakentaa pyörää uudelleen.

Onko tällä rintamalla mitään uutta?

Minulla on pieni projekti, johon tarvitsisin myös verkkomaksusysteemiä suomalaisia (tai suomessa toimivia) pankkeja vasten.

Itse osaaan jonkin verran koodata php:llä, mutta valitettavasti olio-ohjelmoititaitoni ovat olemattomat/surkeat.
Jos valmista liityntää ei pankkien järjestelmiin (julkisesti) ole, niin kait se pitää sitten keksiä pyörä uudelleen. :)
Projektini on sen verran alkuvaiheessa vielä, että tuo maksurajapinta voi olla kumpaan vaan (ecommerce/übercart).

Kiitos tiedoista jo etukäteen.

Tiedän, että esim. osCommerceen on vastaava liityntä, mutta en haluaisi rakentaa tuota projektiani sen varaan (koska sen ylläpito on melkolailla tuskaa normikäyttäjälle).

On tulossa

Itseasiassa on jo tällä hetkellä työn alla. Jos sinulla on kiire kaikkien kotimaisten maksujen ja Übercartin kanssa ota käyttöön http://drupal.org/project/uc_checkoutfi
Suorat pankkiyhteydet tarjoava moduuli saatanee beta-versiona pihalle noin kuukauden sisällä.

Upeaa

Millaisella lisenssillä tuo moduli tulee?

Koko Drupal on GPL

Myös tämä moduuli on GPL koodia ja vapaasti käytettävissä.

Ehdottomasti isoin työ tässä onkin kunnollisen GPL lisensoidun maksukirjaston väsääminen pankeille. GPL koodina nämä tosiaan löytyvät esim osCommercesta, mutta sellaisenaan niitä on aika vaikea käyttää tässä hyväkseen. Drupaliin tiukasti sidottuja ja ulkopuolista eri lisenssillä olevaa kirjastoa hyödyntäviä toteutuksia löytyy jo ennestään, mutta näissä on molemmissa omat ongelmansa. Järkevintä olisi paketoida itse pankkimaksut toteuttava kirjasto siten että sitä voi tarvittaessa käyttää myös minkä tahansa muun PHP-pohjaisen järjestelmän kanssa ja ylläpitää tätä kirjastoa Drupal moduulin GPL-lisensoituna osana. Näin maksupaketille saataisiin toivottavasti laajempi käyttäjäkunta ja kirjasto pidettyä ajantasalla aina kun pankit päättävät muuttaa rajapintojaan.

Übermahtavaa!!

Hienoa että tämä on mennyt eteenpäin. Myös tuo TUPAS autentikointi moduli on hieno asia. Onko se jo valmis tuotantokäyttöön?

TUPAS-moduuli on puolivalmiste

TUPAS moduulia on jo käytetty muutamassa eri casessa tuotantokäytössäkin ja näissä caseissa se on toiminut hyvin. Moduuli ei kuitenkaan ehkä ihan vielä ole hurjan geneerinen, joten en lupaisi sitä mihin vaan käyttöön bugittomana. Lisäksi moduuli on vähän puolivalmis sikäli että se ei ihan yksinään tee vielä mitään kovin jännittävää.

Mikäli jollain on projekti jossa tarvitaan Drupal ja TUPAS yhdistelmää niin suosittelen kuitenkin rohkeasti osallistumaan D.o hankkeen viemiseen eteenpäin. Koko moduuli on alunperin toteutettu Exoven toimesta asiakasprojektissa ja julkaistu asiakkaan luvalla. Veikkaan ettei moduuli jatkokehity ihan huimasti ennen kuin sitä jälleen tarvitaan seuraavassa projektissa. TUPAS tunnistuksella on aika pieni käyttäjäjoukko joista "omaksi huvikseen" sitä ei varmasti käytä kukaan. Projektina tämä etenee luonnostaan aika hitaasti siksi, koska erilaisia käyttötapauksia tulee vastaan harvoin ja kehittäjäkunnasta aika tarkasti 100% tehnee projektia vain työajallaan.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.