我正在尝试在我的网站上使用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 xxx@xxx.com",
"source" => $token->id
), array("stripe_account" => $this->account));
$this->copiedCustomer = $copiedCustomer;
}
通过调试我看到当我尝试在connectCustomer函数中创建$ token时发生问题。客户已在我的条带仪表板上添加了正确的来源。该帐户也已创建。 之后我的目标是订阅客户到关联的帐户。我已经成功订阅了他而没有使用Stripe Connect,但现在我需要使用它。 我试图在许多其他论坛中找到解决方案,但没有找到类似的东西。
感谢您的帮助!
答案 0 :(得分:0)
您的代码对我来说很好。我不确定为什么它不起作用。也许缺少一些步骤?在创建连接订阅时遇到同样的问题,因为我试图将平台客户与连接计划相关联。错误消息不是很有帮助。我搜索谷歌的消息,并发现了这个问题。来吧,我能够使用平台客户创建一次性连接费用(在我创建共享源之后)。为什么我不能在这里做同样的事情?因为Subscription API需要客户而不是共享源。条纹演示代码没有多大帮助,直到我仔细阅读文档中的前4个项目符号点:https://stripe.com/docs/connect/subscriptions(一个Ahhhhah时刻!)
对Connect使用订阅具有以下限制:
- 必须在连接上创建客户和计划 帐户(不是您的平台帐户)
- 必须直接在已连接的帐户上创建订阅(不支持使用目标参数)
- 您的平台无法更新或取消未创建的订阅
- 您的平台无法将application_fee添加到未创建的发票或包含未创建的发票项目的发票中
所以,我只是发布一些伪代码,希望它能帮助下一个遇到上述错误信息的人。
您必须从前端/客户端javascript创建要重用的源(而非令牌):
stripe.createSource(card,ownerInfo)
然后,您将使用此源(stripe_token)在平台帐户(stripe_customer_id)上创建客户。这对于一次性连接充电非常有用(如果您需要它)。这也是为了存储原始源(stripe_token),以便您可以稍后为已连接的/ txn_customer_id创建新的可重用令牌/源。
从第3步开始,所有代码都在chargeMonthly函数内部:
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;
}
}
答案 1 :(得分:0)
我知道已经来不及了,但是这对我有用。我有同样的错误。我已经通过创建源代码而不是令牌解决了它。
因此,替换
$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]);