Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

stripe checkout custom button not charging

I am trying to get Stripe's Checkout Custom Button to charge a credit card but all it does is minimize after I enter the credit card details. I am using the code found in the documentation but I can't get it to work. The simple button is easy to use and I figured it would be as easy as just customizing that one but it's very different.

Here's the code:

Payment Page

<form action="charge.php" method="post">
            <script src="https://checkout.stripe.com/checkout.js"></script>
            <input type="submit" value="Pay with card" id="customButton"/>
            <?php require_once('./config.php'); ?>
                <script>
                var handler = StripeCheckout.configure({
                    key: '<?php echo $stripe['publishable_key']; ?>',
                    image: 'favicon.png',
                    token: function(token, args) {
                    // Use the token to create the charge with a server-side script.
                    // You can access the token ID with `token.id`
                    }
                });

                document.getElementById('customButton').addEventListener('click', function(e) {
                    // Open Checkout with further options
                    handler.open({
                    name: 'Imprintnation',      
                    description: 'Decals',
                    amount: <?php echo $stripeTotal; ?>

                });
                    e.preventDefault();
                });
                </script>
                </form>

Charge Page(charge.php)

<?php
require_once(dirname(__FILE__) . '/config.php');

$token  = $_POST['stripeToken'];

$customer = Stripe_Customer::create(array(
  'email' => '[email protected]',
  'card'  => $token
));

$charge = Stripe_Charge::create(array(
  'customer' => $customer->id,
  'amount'   => 5000,
  'currency' => 'usd'
));

echo '<h1>Successfully charged $5!</h1>';
?>

Configuration Page(config.php)

<?php
require_once('./lib/Stripe.php');

$stripe = array(
secret_key      => 'sk_test_************************',
publishable_key => 'pk_test_************************'
);

Stripe::setApiKey($stripe['secret_key']);
?>

What am I missing here? I can't even get it to retrieve a token.

How can I retrieve a token and charge a card?

like image 711
Josan Iracheta Avatar asked Mar 20 '14 22:03

Josan Iracheta


People also ask

How do you customize the Stripe Checkout button?

Apply branding You can customize the look and feel of Checkout in the Stripe Dashboard. Go to Branding Settings where you can: Upload a logo or icon. Customize the Checkout page's background color, button color, font, and shapes.

What's the difference between Stripe and Stripe Checkout?

You may be wondering what the difference is between Stripe and Stripe Checkout. While our “regular” Stripe Payments integration allows users to enter credit card payment information directly on your form, Stripe Checkout seamlessly redirects users to the Stripe website to process payment.

How long does a Stripe Checkout session last?

Checkout Sessions expire 24 hours after creation. After creating a Checkout Session, redirect your customer to the URL returned in the response.


2 Answers

Finally got it to work. Had to change a bunch of it. Here is the code:

Payment page

<form action="charge.php" method="post">
<script src="https://checkout.stripe.com/checkout.js"></script>
<script src="http://code.jquery.com/jquery-latest.min.js"></script> 

<button id="customButton">Pay with Card</button>
<style>
#customButton{
width:300px;
height:50px;
background-color:orange;
color:white;
border:2px solid green;
}
</style>
 <script>
 $('#customButton').click(function(){
 var token = function(res){
 var $input = $('<input type=hidden name=stripeToken />').val(res.id);
 $('form').append($input).submit();
 };

 StripeCheckout.open({
 key:         '<?php echo $stripe['publishable_key']; ?>',
 address:     false,
 amount:      '<?php echo $price; ?>',
 currency:    'usd',
 name:        'test',
 description: '<?php echo $desc; ?>',
 panelLabel:  'Checkout',
 token:       token
 });

 return false;
 });
 </script>
 <input type="hidden" name="desc" value="<?php echo $desc; ?>"/>
 <input type="hidden" name="totalPrice" value="<?php echo $price; ?>"/>
</form>

charge.php

<?php
require_once(dirname(__FILE__) . '/config.php');

$token  = $_POST['stripeToken'];
$amount = $_POST['totalPrice'];
$desc = $_POST['desc'];
$percent = "0.01";
$realAmount = $amount * $percent;
try {       
$charge = Stripe_Charge::create(array(
    'card' => $token,
    'amount'   => $amount,  
    'currency' => 'usd',
    'description' => $desc
    ));

    } catch(Stripe_CardError $e) {
// The card has been declined
}

echo "<h1>Successfully charged $$realAmount!</h1>";
?>

I wish Stripe's documentation was more straightforward but this code handles the charge and it logs it on your dashboard.

like image 179
Josan Iracheta Avatar answered Sep 21 '22 04:09

Josan Iracheta


@BlueSix is right, why do you have:

<input type="hidden" name="totalPrice" value="<?php echo $price; ?>"/>

Just because the value is hidden, does not mean it cannot be edited by the end user.

It would be much better to set $amount = $price directly, passing the variable through your application backend.

like image 31
mkapuza Avatar answered Sep 22 '22 04:09

mkapuza