Извините за мой английский.
I’M try to create a charge with a connected account in stripe using standalone account. Я подключаю свои учетные записи с помощью этой статьи в stripe: примеры приложений OAuth . У меня 3 счета: а) основной счет. В этом аккаунте находятся клиенты нашего приложения. Учетная запись B и учетная запись C являются другими учетными записями, подключенными к учетной записи A (я вижу, что эти два счета соединяются в настройках учетной записи A. Это говорит мне, что два счета уже подключены, верно?). Все приложение пользователя находится в учетной записи A, и мы хотим поделиться с учетной записью B и C, это наша цель.
Когда учетные записи подключены, мы сохраняем в нашей БД токен acces_token и refresh. В документах общих клиентов говорится, что нам нужно создать маркер с customer_id и account_id, чтобы создать маркер с информацией о кредитной карте клиента, но когда мы выполняем код, он возвращает ошибку:
Предоставленный ключ ‘sk_test_********************uJ3l’ не имеет доступа к аккаунту ‘ acct_—————‘ (или эта учетная запись не существует). Доступ к приложению может быть отозван.
Мы тестируем несколько комбинаций переменных, которые передаются в api, и результат всегда возвращает ошибку.
Что делают неправильно в этом случае. Вы можете нам помочь???
Это код, который мы используем: все комментарии были еще один тест, который мы пытаемся:
public function createtransaction($customer_id, $paymentDesc, $destinationAccount) {
$errors = array();
try {
$secret_key = $this->get_secret_key();
StripeStripe::setApiKey($secret_key);
// THIS ONLY FOR TESTING PURPOSE. WE WANT SEE IF CAN ACCESS TO CONNECTED ACCOUNT
// Fetching an account just needs the ID as a parameter
// WHIT ACCESS_TOKEN WORKS THE RETRIEVE METHOD
// $account = StripeAccount::retrieve('access_token_from_db');
// WHIT ACCOUNT_ID DOES NOT. RETURNS AN ERROR
// $account = StripeAccount::retrieve('acct_***********');
// echo "<pre>------";
// print_r($account);
// echo "-----</pre>";
// HERE ONLY WE CAN TEST IF WE CAN CREATE A CUSTOMER. THIS IS ONLY TO CHECK IF THE ACCOUNT IS CONNECTED. THE CUSTOMER ALREADY EXISTS IN MAIN ACCOUNT
// Recommended: sending API key with every request
// StripeCustomer::create(
// array("description" => "example@stripe.com"),
// array("api_key" => 'sk_test_***************') // account's access token from the Connect flow
// SAME. WITH stripe_account DOES NOT WORK. WHIT api_key PARAM WORKS WELL
// );
// THE DOCS SAYS WE NEED CREATE A TOEKN WITH customer AND stripe_account, BUT IT RETURNS AN ERROR OF PERMISSION
// Create a Token from the existing customer on the platform's account
// $token = StripeToken::create(
// array("customer" => $customer_id),
// array("stripe_account" => 'acct_********************') // id of the connected account
// );
// echo "<pre>------";
// print_r($token);
// echo "-----</pre>";
// ONE COMBINATION. DOES NOT WORK
// var_dump($customer_id, $paymentDesc, $destinationAccount);
// $charge = StripeCharge::create(array(
// "amount" => $paymentDesc['total'] * 100,
// "currency" => "usd",
// "source" => $token,
// "description" => $paymentDesc['description'],
// 'destination' => $destinationAccount
// ));
//
//
// IT WORKS IN THE MAIN ACCOUNT BUT IT IS NOT OUR GOAL, BUT WE CAN TRANSFER THE MONEY TO ANOTHER CONNECTED ACCOUNT
// $charge = StripeCharge::create(array(
// 'amount' => $paymentDesc['total'] * 100,
// 'currency' => 'usd',
// 'customer' => $customer_id,
// "description" => $paymentDesc['description']
// ));
// ANOTHER COMBINATION. DOES NOT WORK
/*$charge = StripeCharge::create(array(
'amount' => $paymentDesc['total'] * 100,
'currency' => 'usd',
"description" => $paymentDesc['description'],
'customer' => $customer_id
), array('stripe_account' => 'acct_************'));*/
// ANOTHER COMBINATION. DOES NOT WORK
/*$charge = StripeCharge::create(array(
'amount' => $paymentDesc['total'] * 100,
'currency' => 'usd',
"description" => $paymentDesc['description'],
'customer' => $customer_id
), array('api_key' => 'ACCESS_TOKEN_IN_DB'));
echo "<pre>------";
print_r($charge);
echo "-----</pre>";
return array('charge' => $charge);*/
} catch(Stripe_CardError $e) {
$errors = array('error' => false, 'message' => 'Card was declined.', 'e' => $e);
} catch (Stripe_InvalidRequestError $e) {
$errors = array('error' => false, 'message' => 'Invalid parameters were supplied to Stripe's API', 'e' => $e);
} catch (Stripe_AuthenticationError $e) {
$errors = array('error' => false, 'message' => 'Authentication with Stripe's API failed!', 'e' => $e);
} catch (Stripe_ApiConnectionError $e) {
$errors = array('error' => false, 'message' => 'Network communication with Stripe failed', 'e' => $e);
} catch (Stripe_Error $e) {
$errors = array('error' => false, 'message' => 'Stripe error. Something wrong just happened!', 'e' => $e);
} catch (Exception $e) {
$errors = array('error' => false, 'message' => 'An error has ocurred getting info customer.', 'e' => $e);
}
return $errors;
}
Вам не нужно сохранять
access_token
andrefresh_token
,stripe_user_id
для работы с Connect требуется только идентификатор подключенной учетной записи.Вы можете использовать секретный ключ API вашей платформы для всех запросов и просто передать идентификатор подключенной учетной записи в заголовок Stripe-account, как показано в документации общих клиентов. Как правило, этот заголовок можно добавить почти к каждому запросу API, чтобы он был направлен на подключенную учетную запись:
https://stripe.com/docs/connect/authentication#authentication-via-the-stripe-account-header
В вашем случае вы бы сделали:
Затем можно создать плату из этого общего клиента таким же образом: