21. august 2007 - 22:57Der er
12 kommentarer og 1 løsning
Kvittering efter POST til betalingsgateway
Hej jeg har sat en indkøbskurv op på en hjemmeside og systemet virker fint. Systemet er baseret på brug af session hvor jeg til slut har en side som udskriver en kvittering, sender kvitteringen pr. e-mail og indsætter køberen i db. Jeg har efterfølgende sat en betalingsside ind, inden kvittering udskrives, som poster til betalingsgateway. Efter betalingen ender køberen på kvitteringssiden, men problemet er nu ikke er nogen informationer er omkring købet. Så vidt jeg forstår det er det fordi den igangværende session brydes af betalingsgatewayen som der postes til. Derfor søger jeg en metode til at fikse dette problem, altså dataen fra købet skal ende på kvitteringssiden efter betalingen er gennemført.
1) Inden at du sender brugeren videre til betalingsiden, skal du gemme orderen i databasen. 2) I den process får orderen et ordre-id, som du kan sende med til betaligssiden. 3) Når betalingen er godkendt laver batalingsiden et callback til din side, og levere order-id'et med. 4) Dette bruger du så til at udtrække oplysningerne om ordren til kviteringen (og til ekspederingen af ordren).
En yderlig fordel ved dette er at du efterfølgende har alle dine ordre liggende i basen istedet for sessions som forsvinder pist-væk når brugerne forlader dit site.
Jo tak - så giver det lidt mere forståelse for hvordan det virker. Betyder det så at der skal opsættes en "temp" tabel hvor alle handelsinformationerne gemmes som har session id som unik nøgle hvor der på kvitteringssiden så kan trækkes en row med sessionid = orderid el. noget lign? Jeg spørger på den måde fordi jeg godt forstår hvad du mener men ikke helt er klar over hvordan det skal sættes op...
Så længe det er usikkert om kunden å dit site ønsker at handle eller ej, bør du gemme ordreoplysningerne i en session.
I det øjeblik at kunden har besluttes sig, dvs. beslutter sig for at gå videre til betalingen, bør ordren gemmes i basen. I denne sammenhæng trækkes et entydigt ordrenummer. Du bør ikke bruge session id som ordre nummer:
1) Dels er det ikke læsevenligt (og ordrenummeret skal muligvis vises på kvitteringen). 2) Dels er det ikke nødvendigvis entydigt; under (meget) uheldige omstændigheder kan risikerer at session-id’er genbruges.
Faktisk bør du glemme alt om session-id lige så snart at kunden er begyndt på betalingen og det der sker efterfølgende.
Ordren bør ikke gemmes i en temporær database. Den bør så vidt muligt gemmes i al fremtid sådan at man altid efterfølgende kan gå ind og se hvad der blev købt, af hvem, og hvornår. Det vil være en hjælp ved eventuelle tvivlsspørgsmål og til det senere regnskab.
Din session vil ikke blive glemt, blot fordi du har været forbi en betalingsside et smut. Det gør den i hvert fald ikke ved alle de butikker jeg har lavet, så mon ikke du blot har en fejl 40 et sted...
Hmm ok - så må konstruere det anderledes end jeg har gjort. Det jeg har gjort er at din session gemmes for så at blive slettet når ordren er gennemført.
Du kan på kvitteringssiden til sidst i scriptet godt destroy din session, hvis du er færdig med at bruge den. Du skal bare ikke destroy den på et forkert tidspunkt, for så vil det selvfølgelig ikke fungere.
Det jeg har gjort tit, er at registrere ordren i databasen lige inden at kunden sendes videre til betalingssiden. På den måde kan man redde flere ordrer i land.
Det der med om sessionen bliver glemt eller ej afhænger meget af hvordan shoppen er sammensat. Hvad der er muligt der, afhænger endvidere af hvordan betalingssitet fungerer.
Hvis der *altid* er et vindue åbent til shoppen vil session blive bevaret. Hvis man på noget tidspunkt forlader shoppen helt, vil session dø. Desuden afhænger det også af hvordan callbacket fra betalingssiden fungere - det er ikke sikkert at callback'et har adgang til session'en.
Uanset hvad så er det stadigvæk en rigtig god ide at gemme ordrene permanent i databasen.
Jeg har lige sat sådan en side op, og jeg bruger sessionIDet i accepturl: <input type="hidden" name="acceptURL" size="30" value="<?php echo $accepturl.htmlspecialchars(SID); ?>" /> det funker selv om jeg sender brugeren væk fra siderne for at taste kortoplysninger. Har du husket session_start i toppen af kvitteringssiden? Har du gemt alle oplysninger du skal bruge som $_SESSION['denskaljegbruge'] = detjegskalbruge;
Hej. Projektet med indkøbskurven har ligget stille et stykke tid og fik derfor heller ikke svaret tilbage på jeres kommentarer. Har nu fået gjort det færdigt og det virker. Jeg gjorde brug af nogle af de råd jeg fik her fra. Jeg satte bl.a. en ny tabel op i databasen som midlertidigt gemmer oplysningerne for en pågælden handel som så gemmes hvis handlen gennemføres. Tak for hjælpen til jer som har kommenteret på min tråd.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.