Avatar billede kaster Novice
09. maj 2016 - 15:31 Der er 14 kommentarer og
1 løsning

Quickpay formular med selvangivet beløbsfelt

Jeg vil gerne lave en quickpay betalingsformular, hvor man selv skriver beløbet.
Nedenstående felt der henter variabelværdien
<input type="text" name="amount" value="<?php echo $params["amount"] ?>">
virker fint, men jeg vil gerne lave et felt som
<input type="text" name="amount" value="">

Hvis man lader variablen stå tom, som her:
// "amount"      => "", //
kommer en fejlmelding.

Håber nogen kan hjælpe

- - - -

<?php
  function sign($params, $api_key) {
    ksort($params);
  $base = implode(" ", $params);

  return hash_hmac("sha256", $base, $api_key);
}

$params = array(
  "amount"      => 135,
  "callbackurl" => "http://min-callback.php",
  "cancelurl"  => "http://min-error.php",
  "continueurl" => "http://min-ok.php",
  "autocapture" => "0",
  "autofee"     => "1",
  "currency"    => "DKK", 
  "deadline"  => 300,
  "order_id"    => time(),
  "payment_methods" => "creditcard,mobilepay,paypal",
  "version"      => "v10",
  "branding_id"  => "",
  "merchant_id"  => xxxx,
  "agreement_id" => xxxxx,
);

$params["checksum"] = sign($params, "nøglekode");
?>

<form method="POST" action="https://payment.quickpay.net">
  <input type="hidden" name="version" value="<?php echo $params["version"] ?>">
  <input type="hidden" name="merchant_id" value="<?php echo $params["merchant_id"] ?>">
  <input type="hidden" name="agreement_id" value="<?php echo $params["agreement_id"] ?>">
  <input type="hidden" name="order_id" value="<?php echo $params["order_id"] ?>">
  <input type="text" name="amount" value="<?php echo $params["amount"] ?>">
  <input type="hidden" name="currency" value="<?php echo $params["currency"] ?>">
  <input type="hidden" name="continueurl" value="<?php echo $params["continueurl"] ?>">
  <input type="hidden" name="cancelurl" value="<?php echo $params["cancelurl"] ?>">
  <input type="hidden" name="callbackurl" value="<?php echo $params["callbackurl"] ?>">
  <input type="hidden" name="autofee" value="<?php echo $params["autofee"] ?>">
  <input type="hidden" name="autocapture" value="<?php echo $params["autocapture"] ?>">
  <input type="hidden" name="payment_methods" value="<?php echo $params["payment_methods"] ?>">
  <input type="hidden" name="deadline" value="<?PHP echo $params["deadline"] ?>">
  <input type="hidden" name="branding_id" value="<?php echo $params["branding_id"] ?>">
  <input type="hidden" name="checksum" value="<?PHP echo $params["checksum"] ?>">
  <input type="submit" value="Gå til dankort betaling...">
</form>
Avatar billede jakobdo Ekspert
09. maj 2016 - 22:39 #1
Har du evt. prøvet at spørge QuickPay ?
Avatar billede jakobdo Ekspert
09. maj 2016 - 22:40 #2
Kunne du måske angive 0 ?
Avatar billede kaster Novice
10. maj 2016 - 10:32 #3
Ja, jeg har kommunikeret meget med Quickpay, men synes ikke det fører nogen vegne. Sidst foreslog de at text-feltet bare skulle være input type="hidden"
Avatar billede kaster Novice
10. maj 2016 - 10:39 #4
Jeg har prøvet med 0 og også helt tom i variablen, men får fejl.
Jeg tror måske, der skal noget script til at hente texfeltets angivelse op i variablen.
For når det står med et angivet tal
...
$params = array(
  "amount"      => 135,
...
virker det fint
Avatar billede olsensweb.dk Ekspert
10. maj 2016 - 17:34 #5
jeg tror du skal ud i noget validering i javascript !

set en event handler på din form,
<form method="POST" action="https://payment.quickpay.net">   


http://www.w3schools.com/js/js_validation.asp
http://www.w3schools.com/jsref/event_onsubmit.asp

i functionen checker du om amount er forskellig fra "" og evt andre felter

lidt dumt eks, bliver submittet hvis feltet er udfyldt

<!DOCTYPE html>
<html>
<body>

<p>This example uses the addEventListener() method to attach a "submit" event to a form element.</p>


<form id="myForm" action="test.php" method="get">
  <input type="text" name="amount" id="amount" value="">
  <input type="submit" value="Submit">
</form>

<script>
document.getElementById("myForm").addEventListener("submit", function(e) {
    e.preventDefault(); // vigtigt   
    var amount = document.getElementById("amount").value;
    console.log("amount = " + amount); // test
    return (amount !="")? this.submit() : false;     
});
</script>

</body>
</html>

kunne også skrives med jquery hvis du bruger det på din side
Avatar billede jakobdo Ekspert
10. maj 2016 - 21:35 #6
Det hele afhænger vel af fejlen der kommer?
Og "hvor" den kommer fra?
For hvis Quickpay api forventer en fast "amount", som muligvis er med i deres MD5 hash, så kan det ikke nytte noget den er dynamisk.
Avatar billede kaster Novice
11. maj 2016 - 10:35 #7
- fejlen er altid den samme: Invalid checksum

Med mindre man bruger 
<input type="text" name="amount" value="<?php echo $params["amount"] ?>">
hvor der så godt kan angives i feltet, men kun variablens værdi accepteres f.eks.
  "amount"      => 135,
Avatar billede olsensweb.dk Ekspert
11. maj 2016 - 10:50 #8
>For hvis Quickpay api forventer en fast "amount",
det må man da ikke håbe, jeg ville da være ked at altid at skulle købe 100 (som der står i Deres eks) af en vare :)


da vi ikke har styr på hvad der sker på payment.quickpay.net må du gøre noget ved data før de sendes (dvs js), så her skal vi lave clientside validering, men det er jo altid en god ide at lave clientside validering også for brugerens skyld.

serverside validering kan du ikke komme uden om (her PHP), det skal der altid laves.

iøvrigt spørgeren's viste code kommer fra
http://tech.quickpay.net/payments/form/
helt nede på siden click på fanen PHP

> Med mindre man bruger 
> <input type="text" name="amount" value="<?php echo $params["amount"] ?>">
hvis du kigger i doc kan du se at amount er påkrævet, og skal opfylde denne regl /^[0-9]{1,9}$/
Avatar billede kaster Novice
11. maj 2016 - 11:03 #9
Ja Ronols, som jeg forstår det, checker den at feltet er udfyldt, hvilket også er godt nok.

Men det jeg tror skal ske er at
  <input type="text" name="amount" value="">
feltet skal stå tomt til at skrive i, og
amount variablen så henter den skrevne værdi fra feltet for at validere i checksum.

...
$params = array(
  "amount"      => "hente værdi fra det skrevne felt",
...
Avatar billede olsensweb.dk Ekspert
11. maj 2016 - 11:09 #10
det du skal gøre vha. js er at checke onsubmit om feltet er tomt, og hvis det er det skriver du 0 i feltet vha js.
Avatar billede Computernørderne Juniormester
18. februar 2019 - 20:24 #11
Fik du nogensinde løst dit problem? Jeg tænker at du skal have en form, hvor folk indtaster et beløb, og når de trykker "Betal" bliver der oprettet en betaling via en PHP-API. Når den kommer retur, henter du med Javascript betalingen hjem via den der form, som QuickPay har eksempel på. Husk at fjerne action=""-argumentet, og tilføj      $('#checkout-form').reset(); under success i Javascript-delen i eksemplet (og giv formularen et ID - det har det ikke som default).
Avatar billede kaster Novice
19. februar 2019 - 10:16 #12
Nej, jeg fandt aldrig ud af den løsning. Men at det kan lade sig gøre - evt med dit forslag - er jeg ikke i tvivl om.
I stedet bruger vi nu Quickpays mulighed for at kreere et batalingslink og sætter det ind i en ordrebekræftelse til kunderne. En smule mere besvær men det virker fint.
Tak for din respons :-)
Avatar billede Computernørderne Juniormester
19. februar 2019 - 10:43 #13
Jeg har i øvrigt, efter jeg skrev min tekst ovenover, opdaget at den der $('#checkout-form').reset() ikke virker, og får Javascriptet til at gå i stå (uden at fryse), hvilket afbryder udførelsen af formen. Så der kunne lige så have stået bladibla; for det har samme resultat. Og det er ikke den pæneste løsning. Jeg arbejder videre på den del, men jeg vil allerhelst lave et system hvor hele betalingen går gennem PHP-api'en, udenom Quickpays Javascriptløsing.
Avatar billede Computernørderne Juniormester
19. februar 2019 - 20:11 #14
Jeg er klar over at det ikke er det, Kaster spurgte, men hvis nogen nu skulle falde over dette:

QuickPays eksempel indeholder et stykke Javascript og en HTML-form. Form(ularen) bruges til at sende data til en API med POST-metoden, mens Javascriptet i baggrunden tager sig af betalingen. Men det betyder, at du ved betaling bliver redirected til den fil, der er angivet i formularens "action". Hvis du hellere vil, at dataene bliver sendt til en API asynkron, skal du ændre action til java script:void(0); og derefter lave en AJAX-Call under success function(form, data) i javascriptet.

Kaster, hvis du vil gøre det mindre besværligt for dine kunder (eller hvad du nu kalder det), så sig til, så kan jeg sikkert hjælpe. Selvom jeg endnu ikke er ved vejs ende, har jeg nu rimelig styr på hvordan jeg får embedded en betalingsløsning fra QuickPay
Avatar billede kaster Novice
20. februar 2019 - 10:23 #15
Løsningen for kunderne er pt uproblematisk, men super, tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester