条纹连接充电费返回错误(PHP)

I am developing a web application which is using stripe payment gateway. I need to charge $5 from every transaction to my stripe account and transfer the rest for the supplier's stripe account.

I did following steps.

1). to connect users I shared this url
https://connect.stripe.com/oauth/authorize?response_type=code&client_id=ca_5slZHMozXs9B7rrgh6MDIFcdTvYqSdfz&scope=read_write

2). Set up redirect url to my application and did following codes to handle request

if (isset($_GET['code'])) { // Redirect w/ code
          $code = $_GET['code'];

          $token_request_body = array(
            'grant_type' => 'authorization_code',
            'client_id' => 'ca_5slZHMozXs9B7rrgh6MDIFcdTvYqSdfz',
            'code' => $code,
            'client_secret' => 'sk_test_WcXfM3Tsb0IlkSKmbZTYnq5d'
          );

          $req = curl_init("https://connect.stripe.com/oauth/token");
          curl_setopt($req, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($req, CURLOPT_POST, true );
          curl_setopt($req, CURLOPT_POSTFIELDS, http_build_query($token_request_body));
          curl_setopt($req, CURLOPT_SSL_VERIFYPEER, FALSE);
          //curl_setopt($req, CURLOPT_CAINFO, "assets/cacert.pem");

          // TODO: Additional error handling
          $respCode = curl_getinfo($req, CURLINFO_HTTP_CODE);
          $resp = json_decode(curl_exec($req), true);
          curl_close($req);

          echo $resp['access_token'];
                echo "<br/>";
          echo  $resp['stripe_publishable_key'];
                echo "<br/>";
          echo $resp['stripe_user_id'];

        } else if (isset($_GET['error'])) { // Error
          echo $_GET['error_description'];
        } else { // Show OAuth link
          $authorize_request_body = array(
            'response_type' => 'code',
            'scope' => 'read_write',
            'client_id' => 'ca_5slZHMozXs9B7rrgh6MDIFcdTvYqSdfz'
          );

          $url = AUTHORIZE_URI . '?' . http_build_query($authorize_request_body);
          echo "<a href='$url'>Connect with Stripe</a>";
        }  

I received following response

sk_test_iLSNjRezyNiOiRpQk83UwQ6q
pk_test_0WXzhiA6xehlaZnmPZqP5VBi
acct_15iIu1I4jMsDTdhX

2). Then I used following code in the html file to grab credit card details.put publishable key as above returned publishable key.

<script src="https://checkout.stripe.com/v2/checkout.js" class="stripe-button"
              data-key="pk_test_0WXzhiA6xehlaZnmPZqP5VBi"
              data-email= "<?php echo $usremail; ?>"
              data-amount="<?php echo $valCoursefee*100; ?>" data-description="Pay & Enroll">
            </script>  

3). Then I did following coding to recieve the token and charge from the card.Used above returned stripe_user_id for Stripe-Account parameter

// Get the credit card details submitted by the form
        $token = $_POST['stripeToken'];
        // Stripe_Stripe::setApiKey("sk_test_WcXfM3Tsb0IlkSKmbZTYnq5d");
        // Create the charge on Stripe's servers - this will charge the user's card
        $charge = Stripe_Charge::create(
          array(
            "amount" => 1000, // amount in cents
            "currency" => "usd",
            "source" => $token,
            "description" => "testm@example.com",
            "application_fee" => 5 // amount in cents
          ),
          array("Stripe-Account" => "acct_15iIu1I4jMsDTdhX")
        );

But it returns me following error

Fatal error: Uncaught exception 'Stripe_InvalidRequestError' with message 'There is no token with ID tok_15lW5jI4jMsDTdhXhG9vfnjk.' in C:\wamp2\www\NEW\application\libraries\payment_gateway\lib\Stripe\ApiRequestor.php on line 147

Can you please advice me if I am doing wrong thing here

I resolved this error by putting access token directly.

// Get the credit card details submitted by the form
    $token = $_POST['stripeToken'];
    // Stripe_Stripe::setApiKey("sk_test_WcXfM3Tsb0IlkSKmbZTYnq5d");
    // Create the charge on Stripe's servers - this will charge the user's card
    $charge = Stripe_Charge::create(
      array(
        "amount" => 1000, // amount in cents
        "currency" => "usd",
        "source" => $token,
        "description" => "testm@example.com",
        "application_fee" => 5 // amount in cents
      ),
       ACCESS_TOKEN
    );

Processing a charge directly on a connected account requires authentication, best achieved by providing the platform account’s secret key.

So if you want to charge card with 5$ application fee then you have to authenticate your web app by Strip API. Which return token and then you have to pass that token for charge card. Might be this link will help you more. https://stripe.com/docs/connect/payments-fees

Based on version updations the syntax tends to change a little bit, and sometimes we mixes different syntaxes. Try using higher version of Stripe.

And replace your code with following code:

$token = $_POST['stripeToken'];
$charge = \Stripe\Charge::create(
array(
  "amount" => 1000, // amount in cents
  "currency" => "usd",
  "source" => $token,
  "description" => "Example charge",
  "application_fee" => 123 // amount in cents
),
ACCESS_TOKEN

);

I have finally managed to set everything and succesfully charge the customer.

STEP 1: Connect customer to you platform using the following code:

define('AUTHORIZE_URI', 'https://connect.stripe.com/oauth/authorize');

if (isset($_GET['code'])) { // Redirect w/ code $code = $_GET['code'];

  $token_request_body = array(
    'grant_type' => 'authorization_code',
    'client_id' => ' ca_xxxxxxxxxxxxxxxxxxxxxxxxx',
    'code' => $code,
    'client_secret' => 'sk_live_xxxxxxxxxxxxxxxxxxxxx'
  );

  $req = curl_init("https://connect.stripe.com/oauth/token");
  curl_setopt($req, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($req, CURLOPT_POST, true );
  curl_setopt($req, CURLOPT_POSTFIELDS, http_build_query($token_request_body));
  curl_setopt($req, CURLOPT_SSL_VERIFYPEER, FALSE);
  //curl_setopt($req, CURLOPT_CAINFO, "assets/cacert.pem");

  // TODO: Additional error handling
  $respCode = curl_getinfo($req, CURLINFO_HTTP_CODE);
  $resp = json_decode(curl_exec($req), true);
  curl_close($req);

  echo $resp['access_token'];
        echo "<br/>";
  echo  $resp['stripe_publishable_key'];
        echo "<br/>";
  echo $resp['stripe_user_id'];

} else if (isset($_GET['error'])) { // Error
  echo $_GET['error_description'];
} else { // Show OAuth link
  $authorize_request_body = array(
    'response_type' => 'code',
    'scope' => 'read_write',
    'client_id' => 'ca_xxxxxxxxxxxxxxxxxxxxxx'
  );

  $url = AUTHORIZE_URI . '?' . http_build_query($authorize_request_body);
  echo "<a href='$url'>Connect with Stripe</a>";
}  

After customer connecting your account, the redirect url will return connected account id (acc_xxxxxxxxxxxxxxxxxxx)

STEP 2: Create a form to take the payment as follows:

<form action="confirmed.php" method="POST" class="form" >
<input type="hidden" name="pay" value="pay" />
<script
    src="https://checkout.stripe.com/v2/checkout.js" class="stripe-button"
    data-key="<?php echo $publishable_key; ?>"
    data-image="http://www.domain.co.uk/pay/img/stripe.png"
    data-name="<?php echo $company_name; ?>"
    data-currency="gbp"
    data-email="<?php echo $email; ?>"
    data-description="<?php echo $payment_description; ?>t"
    data-label = "Confirm Payment of <?php echo currency($amount); ?>"
    data-billingAddress="false"
    data-amount="<?php echo $stripe_amount; ?>">
</script>

<input type="hidden" name="stripe_amount" value="<?php echo $stripe_amount; ?>">
<input type="hidden" name="email" value="<?php echo $email; ?>">
<input type="hidden" name="amount" value="<?php echo $amount; ?>">

I am assuming you know what to write for the php variables. This form will go to confirmed.php.

STEP 3:

Add the following code to confirmed.php.

<?php
                    if (isset($_POST['pay']))     { 
                        $stripe_amount = $_POST['stripe_amount'];
                        $amount = $stripe_amount / 100;
                        $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);

                        // Set your secret key: remember to change this to your live secret key in production
                        // See your keys here: https://dashboard.stripe.com/account/apikeys
                        \Stripe\Stripe::setApiKey($secret_key);

                        // Get the credit card details submitted by the form
                        $token = $_POST['stripeToken'];

                        // Create the charge with Stripe
                        $charge = \Stripe\Charge::create(
                          array(
                            "amount" => $stripe_amount, // amount in cents
                            "currency" => $currency,
                            "source" => $token,
                            "description" => "Example charge",
                            "application_fee" => $stripe_amount * 0.01 //charging %1 of the total amount
                          ),
                          array("stripe_account" => 'acct_xxxxxxxxxxxxxxx')
                        );

                        if ($charge){
                        //do something like sending email or updating database

                        echo '
                        <div class="col-md-12">
                            <div class="alert alert-success ">
                                <i class="icon fa fa-check"></i> Payment of <b>&pound;'.$amount.'</b> has been completed.
                            </div>
                        </div>
                        <a href="index.php">Make another payment</a>
                        ';

                        }

                        else {echo 'Something went wrong. Your payment may not have been confirmed. Please contact administrator.';}


                    } 

                ?>

This has worked for me so any question is welcomed. Hope it helps someone