
本文详解如何通过 Stripe PHP SDK 正确调用 retrieveExternalAccount 接口,准确识别并返回连接账户绑定的是银行卡(bank_account)还是信用卡(card),同时提取其 last4 信息用于前端展示。
本文详解如何通过 stripe php sdk 正确调用 `retrieveexternalaccount` 接口,准确识别并返回连接账户绑定的是银行卡(`bank_account`)还是信用卡(`card`),同时提取其 `last4` 信息用于前端展示。
在 Stripe 平台模式(Platform Mode)下,当你管理已连接的 Stripe 账户(Connected Account)时,常需动态判断其绑定的收款方式类型(如银行卡或信用卡),并安全展示脱敏后的账号/卡号末四位。但直接调用 $stripe->accounts->retrieveExternalAccount() 时若参数错误,极易返回空响应或抛出 InvalidRequestException —— 核心原因在于该方法必须同时传入两个 ID 参数:目标连接账户的 account_id 和待查询的外部账户 external_account_id(即 bank_account_xxx 或 card_xxx 的完整 ID)。
以下是经过验证的正确实现方式:
require_once 'stripe-php-master/init.php';
$stripe = new \Stripe\StripeClient($STRIPE_API_KEY);
// 步骤1:获取连接账户基本信息(可选,用于校验 transfers_enabled)
try {
$connectedAccount = $stripe->accounts->retrieve($STRIPE_DEST, []);
if (!$connectedAccount->transfers_enabled) {
echo '<script>top.location.href = "https://www.website.net/oa-drive.php";</script>';
exit();
}
} catch (\Stripe\Exception\ApiErrorException $e) {
throw new Exception('Failed to retrieve connected account: ' . $e->getMessage());
}
// 步骤2:关键!正确调用 retrieveExternalAccount
// 注意:$externalAccountId 必须是完整的 bank_account_xxx 或 card_xxx ID(非仅 last4 或 token)
// 该 ID 通常来自 accounts.listExternalAccounts() 或创建时的响应
try {
$externalAccount = $stripe->accounts->retrieveExternalAccount(
$STRIPE_DEST, // connected account ID (required)
$externalAccountId, // external account ID (e.g., "card_1PvXYZ...")
[]
);
// 步骤3:安全识别类型并格式化输出
$accountType = match($externalAccount->object) {
'bank_account' => 'bank account ending in ' . ($externalAccount->last4 ?? 'N/A'),
'card' => 'card ending in ' . ($externalAccount->last4 ?? 'N/A'),
default => 'unknown payment method'
};
echo $accountType; // 示例输出: "card ending in 4242"
} catch (\Stripe\Exception\ApiErrorException $e) {
error_log('Stripe External Account retrieval failed: ' . $e->getMessage());
echo 'Unable to verify payment method. Please check account setup.';
}
✅ 关键注意事项:
- retrieveExternalAccount 的第二个参数 不是任意字符串或 id 字段别名,而是 Stripe 返回的完整外部账户 ID(如 card_1PvXYZ... 或 ba_1QwABC...),务必从 listExternalAccounts 列表中获取或持久化存储;
- 不要混淆 accounts.retrieve()(查账户)与 accounts.retrieveExternalAccount()(查其下的某张卡/银行账户)—— 后者必须显式指定两个 ID;
- 始终使用 try/catch 包裹 Stripe API 调用,避免未处理异常导致服务中断;
- last4 字段对 bank_account 和 card 均存在且可靠,但切勿暴露完整卡号或路由号,符合 PCI DSS 合规要求。
通过以上结构化调用,你即可稳定、安全地识别连接账户的收款方式类型,并以用户友好的方式呈现脱敏信息。










