L'obiettivo: Ho una pagina html con due elementi diversi che è possibile acquistare. Uno è $ 5 e l'altro è $ 10. Sto usando la striscia per elaborare i pagamenti. Quando stripe crea un token di pagamento e lo invia al mio process_charge.php, desidero prelevare l'importo del costo dai dati inviati tramite POST. Quindi posso usare quell'importo per chiamare Stripe_Charge::create()
.Ottenere l'importo di addebito da un token stripe utilizzando l'API strip
Il problema: L'importo non viene inviato al mio modulo PHP e non sono sicuro di come ottenerlo.
La mia soluzione temporanea: Un modulo php diverso per ogni singolo articolo che sto vendendo. Quindi un NUOVO MODULO PHP PER OGNI NUOVO OGGETTO !!! non è l'ideale
Attualmente sto usando il metodo di modulo incorporato elencati qui: https://stripe.com/docs/tutorials/checkout
mio ordine pagina simile a questa.
<div class="payment-options">
<form action="process_card.php" method="POST">
<script
src="https://checkout.stripe.com/checkout.js" class="stripe-button"
data-key="pk_test_PUBLIC_KEY_FOR_TESTING"
data-amount="1000"
data-name="Nice Lint"
data-description="High quality belly button lint."
data-image="images/nice-lint.svg"
data-panel-label="Checkout {{amount}}"
data-label="Pay with Credit Card"
data-billing-address="true"
data-shipping-address="true">
</script>
</form>
</div>
Quindi funziona perfettamente. Prende le informazioni del cliente, il loro indirizzo di spedizione/fatturazione e i dettagli della carta di credito. Quindi genera un token di addebito e lo invia a process_card.php
. Ci posso prendere il gettone ed eseguire qualcosa di simile:
if ($_POST) {
Stripe::setApiKey("sk_test_SECRET_KEY_FOR_TESTING");
try {
if (!isset($_POST['stripeToken']))
throw new Exception("The Stripe Token was not generated correctly");
Stripe_Charge::create(array("amount" => '1000'],
"currency" => "usd",
"card" => $_POST['stripeToken']));
}
catch (Exception $e) {
$error = $e->getMessage();
}
}
Qui prendo il token che è stato inviato tramite POST
e inviare via che eseguire lo striping usando il loro API. L'importo, la valuta e il token della carta sono campi obbligatori. Puoi vedere che il token è stato estratto dai dati POST
ma devo inviare una stringa letterale per l'importo. Tutto ciò è bello e dandy finché non ho più di un prodotto/servizio e ho forme diverse che generano token con quantità diverse e li inviano al mio process_card.php
. Quindi quella stringa letterale non sembra più felice. Il suo stupido sorrisetto è cancellato dalla sua stupida faccia.
Quindi, in ogni caso, ho controllato tutti i dati POST
per verificare se uno dei campi inviati contenesse l'importo in modo da poterlo passare. Così ho appena fatto un po 'di ciclo per vedere cosa è stato presentato:
foreach ($_POST as $key => $value) {
echo "key: " . $key . " - " . $value . "<br>";
}
e mi dà questo:
key: stripeToken - tok_youShouldDefinitelyPostThisTokenOnAPublicWebsite
key: stripeEmail - [email protected]
key: stripeBillingName - asdf
key: stripeBillingAddressLine1 - asdf
key: stripeBillingAddressZip - 12345
key: stripeBillingAddressCity - Schenectady
key: stripeBillingAddressState - NY
key: stripeBillingAddressCountry - United States
key: stripeBillingAddressCountryCode - US
key: stripeShippingName - asdf
key: stripeShippingAddressLine1 - asdf
key: stripeShippingAddressZip - 12345
key: stripeShippingAddressCity - Schenectady
key: stripeShippingAddressState - NY
key: stripeShippingAddressCountry - United States
key: stripeShippingAddressCountryCode - US
Nessuna quantità. Shucks. Quindi via ai documenti API per vedere se riesco a trovare una soluzione. La cosa più vicina che ho trovato è stata Stripe_Charge::retrieve({CHARGE_ID});
che è stata trovata qui: https://stripe.com/docs/api/php#retrieve_charge. Questo tuttavia si applicava solo alle spese processate con successo.
Quindi sono bloccato. Non riesco a capirlo. La soluzione migliore che ho trovato è stata l'aggiunta di una riga <input type="hidden" name="amt" value="1000" />
all'interno del modulo incorporato che mi è stato fornito in modo da poter prelevare l'importo tramite $_POST['amt']
. Il problema con questo è che non ho idea se è conforme PCI. In molti posti sul sito strip/api/doc ti dicono di non includere i campi dei nomi nei loro moduli in modo da non passare informazioni sensibili da una pagina all'altra sul tuo sito, quindi immagino "meglio prevenire che curare". C'è un modo alternativo di gestire questa o alcune buone pratiche di cui non sono a conoscenza?
** Mi dispiace che è stato così lungo. Ho fatto tutto il possibile per cercare di risolverlo da solo e volevo fornire quante più informazioni possibili.
Stava anche chiedendo lo stesso, il loro esempio di checkout ha la quantità hardcoded. Guardando fare la stessa cosa con un campo nascosto con la quantità ma non posso fare a meno di pensare che questo sia sbagliato e insicuro, ma probabilmente farò quello che mi serve – Carlton