如何从Stripe Checkout返回电子邮件?

Using Stripe, I want to store a customer email address from the email they supplied in Checkout. Unfortunately, posting stripeEmail in my charge.php file returns null.

How can I return the email from checkout so I can use it to send a receipt?

Here's my form code:

<script src="https://checkout.stripe.com/v2/checkout.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js"></script>
<form action="charge.php" method="post">
  <input type="hidden" id="amount" name="chargeAmount"/>
  <button data-charge-amount="300000" data-charge-name="Name" data-charge-description="Description">Select Pledge Level</button>
  <button data-charge-amount="123123" data-charge-name="Name2" data-charge-description="Description2">Donate</button>
</form>
<script>
  $('button').click(function(){
    var token = function(res){
      var $theToken = $('<input type=hidden name=stripeToken />').val(res.id);
      $('form').append($theToken).submit();
    };
    var amount = $(this).data("chargeAmount");
    var name = $(this).data("chargeName");
    var description = $(this).data("chargeDescription");
    $('input#amount').val(amount);
    StripeCheckout.open({
      key:         'pk_test_xxxxxxxxxxxxxxxxxxxxxxxx',
      address:     true,
      amount:      amount,
      currency:    'usd',
      name:        name,
      description: description,
      panelLabel:  'Pledge',
      token:       token,
    });
    return false;
  });
</script>

Here is my charge.php code:

<?php
require_once('./config.php');
$token  = $_POST['stripeToken'];
$amount = $_POST['chargeAmount'];
$customer = \Stripe\Customer::create(array(
    'email' => $email,
    'card'  => $token,
));
$charge = \Stripe\Charge::create(array(
  'customer' => $customer->id,
  'amount'   => $amount,
  'currency' => 'usd',
));
?> 

Here is my config.php code:

<?php
require_once('./stripe-php-2.1.2/init.php');

$stripe = array(
  "secret_key"      => "sk_test_xxxxxxxxxxxxxxxxxxxxxxxx",
  "publishable_key" => "pk_test_xxxxxxxxxxxxxxxxxxxxxxxx"
);

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

Any help would be much appreciated.

THANKS!

The issue here is that you're using Custom Checkout which means that Checkout won't post the data to your server automatically but instead give it in the token callback. In your case you're only retrieving the token id here which is why you are not seeing the email.

Update your code so that the token callback also retrieves the email and send it in the stripeEmail parameter:

var token = function(res){
  var $theToken = $('<input type="hidden" name="stripeToken" />').val(res.id);
  var $theEmail = $('<input type="hidden" name="stripeEmail" />').val(res.email);
  $('form').append($theToken).append($theEmail).submit();
};

I just spent all night on this problem! @Koopajah helped a ton, so here's my entire solution in case anyone else happens to run across this.

Here's the form:

    <form action="/charge.php" method="post">
      <input 
            type="submit"
            id="payMe"          
            class="btn btn-default btn-lg btn-success"
            value="&nbsp;&nbsp; Pay &nbsp;&nbsp;"
            data-key="xxxxxxx"
            data-amount="199"
            data-currency="usd"
            data-name="Stuff"
            data-description="20 Whozits ($19.99)"
    data-image="images/image.jpg"
    data-bitcoin="true"
        /> 
        <script src="https://checkout.stripe.com/v2/checkout.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
        <script>
        $(document).ready(function() {
            $('#payMe').on('click', function(event) {
                event.preventDefault();

                var $button = $(this),
                    $form = $button.parents('form');

                var opts = $.extend({}, $button.data(), {
                    token: function(result) {

                        var $theToken = $('<input>').attr({ type: 'hidden', name: 'stripeToken', value: result.id })
                        var $theEmail = $('<input>').attr({ type: 'hidden', name: 'stripeEmail', value: result.email })
                        $form.append($theToken).append($theEmail).submit();
                    }
                });

                StripeCheckout.open(opts);
            });
        });
        </script>
</form>

And here's charge.php:

<?php
require_once('vendor/autoload.php');

$stripe = array(
  "secret_key"      => "xxxx",
  "publishable_key" => "xxxx"
);

\Stripe\Stripe::setApiKey($stripe['secret_key']);
$token = $_POST['stripeToken'];
$email = $_POST['stripeEmail'];

 \Stripe\Customer::create(array(
      "source"  => $token,
      "email" => $email,
      "description" => "It Worked!"
  ));

  try {
$charge = \Stripe\Charge::create(array(
  "amount" => 199, // amount in cents, again
  "currency" => "usd",
  "source" => $_POST['stripeToken'],
  "description" => "Cat Facts"));
} catch(\Stripe\Error\Card $e) {
  $error = $e->getMessage();
}
?>

I have had a very similar issue but am using node.js. I modified koopajah's answer and placed it in a charge.js file

 const token = req.body.stripeToken;<br>
 const email = req.body.stripeEmail;

and then I used this email variable like so...

return stripe.charges.create({
// ensures we send a number, and not a string
amount: parseInt(process.env.STRIPE_COST, 10),
currency: process.env.STRIPE_CCY,
source: token,
description: 'My product', //