Полоса: источник клиента по умолчанию является источником и не может использоваться совместно с существующими клиентами.

Я пытаюсь использовать Stripe Connect на своем веб-сайте. Я создал подключенную учетную запись и клиентов, но возникла ошибка при попытке поделиться клиентом с подключенной учетной записью. Я получаю это:

«Вы предоставили клиента без указания источника. Источником клиента по умолчанию является источник, и он не может использоваться совместно с существующими клиентами».

Hier - это код, который я использую:

function addSource($source){    
    $this->source = $source;
}

function addCustomer(){

    $customer = \Stripe\Customer::create(array(
      "description" => "Customer ".$this->getCustomerName(),
      "email" => $this->getCustomerEmail(),
      "source" => $this->source 
                            ));
    $this->customer = $customer;
}

function createAccount(){

        $account = \Stripe\Account::create(array(
            "country" => "FR",
            "type" => "custom"
        ));

    $this->account = $account->id;
}

function connectCustomer(){
    $token = \Stripe\Token::create(array(
      "customer" => $this->customer->id
    ), array("stripe_account" => $this->account));

    $copiedCustomer = \Stripe\Customer::create(array(
    "description" => "Customer for [email protected]",
    "source" => $token->id
    ), array("stripe_account" => $this->account));

    $this->copiedCustomer = $copiedCustomer;
}

При отладке я увидел, что проблема возникла, когда я пытаюсь создать токен $ в функции connectCustomer. Клиент хорошо добавлен на мою панель Stripe Dashboard с правильным источником. Аккаунт тоже создан. Моя цель после этого — подписать клиента на подключенную учетную запись. Мне удалось подписаться на него без использования Stripe Connect, но теперь мне нужно его использовать. Я пытался найти решение на многих других форумах, но не нашел ничего похожего.

Спасибо за любую помощь!


person t2g    schedule 19.12.2017    source источник


Ответы (2)


Ваш код выглядит хорошо для меня. Я не уверен, почему это не сработало. Может быть, каких-то шагов не хватает? Столкнулся с той же проблемой при создании подписки на подключение, потому что пытался связать клиента платформы с подключенным планом. Сообщение об ошибке не очень помогло. Я ищу Google с сообщением и наткнулся на этот вопрос. Да ладно, я смог использовать клиент платформы для создания единовременного штрафа за подключение (после того, как я создам общий источник). Почему я не могу сделать то же самое здесь? Поскольку для API подписки требуется клиент, а не общий источник. Демонстрационный код Stripe не сильно помог, пока я внимательно не прочитал первые 4 маркированных пункта в документации здесь: https://stripe.com/docs/connect/subscriptions (ахаха момент!)

Использование подписок с Connect имеет следующие ограничения:

  • И клиент, и план должны быть созданы в подключенной учетной записи (а не в учетной записи вашей платформы)
  • Подписки должны быть созданы непосредственно в подключенной учетной записи (использование параметра назначения не поддерживается)
  • Ваша платформа не может обновить или отменить подписку, которую она не создавала
  • Ваша платформа не может добавить application_fee к счету, который она не создавала или который содержит элементы счета, которые она не создавала.

Итак, я просто опубликую некоторый псевдокод в надежде, что он поможет следующему человеку, который столкнулся с этим вопросом с приведенным выше сообщением об ошибке.

  1. Вы должны создать источник (не токен) для повторного использования из внешнего/клиентского javascript:

    stripe.createSource (карта, информация о владельце)

  2. Затем вы должны использовать этот источник (stripe_token) для создания клиента в учетной записи платформы (stripe_customer_id). Это может быть полезно при единовременной подключенной зарядке (если у вас есть в этом необходимость). Это также необходимо для хранения исходного источника (stripe_token), чтобы вы могли позже создать новый повторно используемый токен/источник для connect/txn_customer_id.

Начиная с шага 3, все коды находятся внутри функции chargeMonthly ниже:

  1. Убедитесь, что план подписки является подключенным планом, созданным платформой, указав уникальное имя (3-й пункт выше).
  2. Затем создайте новый повторно используемый источник с идентификатором платформы/stripe_customer_id.
  3. Используйте новый повторно используемый источник для создания клиента (txn_customer_id) в подключенной учетной записи.
  4. Создайте свою подписку с параметрамиconnected/txn_customer_id иconnectedplan_id.

public function createNewCustomer(&$input, $forConnect = false) {
  try {
    // Create new stripe customer
    if ($forConnect) {
      $cu = \Stripe\Customer::create(array(
        'email' => $input['email'],
        'source' => $input['connect_token']
      ), array("stripe_account" => $input['txn_account_id']));

      $input['txn_customer_id'] = $cu->id;
    }
    else {
      $cu = \Stripe\Customer::create(array(
        'email' => $input['email'],
        'source' => $input['stripe_token']
      ));

      $input['stripe_customer_id'] = $cu->id;
      $input['txn_customer_id'] = $cu->id;
    }
  } catch (\Stripe\Error\Base $e1) {
    // log error
    \Log::error($e1);
    return false;
  } catch(\Stripe\Error\Card $e2) {
    \Log::error($e2);
    return false;
  } catch (Exception $e) {
    \Log::error($e);
    return false;
  }

  return true;
}

public function chargeMonthly(&$input, $qty = 1) {
  $plan_name = 'yourplatformname-' . $input['amount'] .'-' . $input['banner_slug'];

  // attempt to retrieve monthly plan
  // if not found, create new plan
  try {
    $plan = \Stripe\Plan::retrieve($plan_name, array("stripe_account" => $input['txn_account_id']));
  } catch(\Stripe\Error\InvalidRequest $e1) {
    // ignore error
    // \Log::error($e1);
  } catch(Exception $e) {
    // ignore error
    // \Log::error($e);
  }

  try {
    // create new if not found
    if(empty($plan)) {
      $plan = \Stripe\Plan::create(array(
          'amount'    => $input['amount'],
          'interval'  => 'month',
          'currency'  => 'usd',
          'id'        => $plan_name,
          "product" => array(
            "name"    => $plan_name
          )
        ), array("stripe_account" => $input['txn_account_id']));
    }

    $token = \Stripe\Source::create(array(
      'customer' => $input['stripe_customer_id'],
      'usage' => 'reusable'
    ), array("stripe_account" => $input['txn_account_id']));

    $input['connect_token'] = $token->id;
    $this->createNewCustomer($input, true);

    $sub = \Stripe\Subscription::create(array(
      'customer'                => $input['txn_customer_id'],
      'plan'                    => $plan->id,
      'quantity'                => $qty,
      'application_fee_percent' => $input['application_fee_percent']),
      array('stripe_account' => $input['txn_account_id'])
    );

    $input['txn_id'] = $sub->id;
    $input['txn_log'] = json_encode($sub);
    $input['recurrence_name'] = $plan->id;

    // success
    return true;
  } catch(\Stripe\Error\InvalidRequest $e1) {
    // ignore error
    \Log::error($e1);
    return false;
  } catch(Exception $e) {
    \Log::error($e);
    return false;
  }
}
person Noogen    schedule 19.04.2018

Я знаю, что уже слишком поздно, но вот что-то сработало для меня. У меня была такая же ошибка. Я решил это, создав источник вместо токена.

Итак, замените

 $token = \Stripe\Token::create(array(
      "customer" => $this->customer->id
    ), array("stripe_account" => $this->account));

с

     $token = \Stripe\Source::create([
                "customer" => $this->customer->id,
            ], ["stripe_account" => $this->account]);

person Ashikur Rahman    schedule 15.02.2019