You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel中通过PayPal ID直接支付用户提现金额?

实现Laravel中通过PayPal ID直接转账的功能

你当前使用的Checkout API是面向消费者结账场景的,要实现仅通过PayPal ID向指定用户打款,需要改用PayPal Payouts API——这是PayPal专门用于单笔/批量向第三方账户转账的解决方案,完全匹配你的需求。

下面是具体实现步骤:

1. 开通PayPal账号的Payouts权限

  • 登录你的PayPal商家后台,进入API权限管理页面,申请启用Payouts功能(部分地区需要审核,建议先在沙箱环境测试)。
  • 确保已获取对应环境(沙箱/生产)的Client ID和Secret,可与现有Checkout配置共用,只要账号开通了Payouts权限。

2. Laravel中配置API参数

在.env文件中补充(或复用)PayPal配置:

PAYPAL_MODE=sandbox # 生产环境改为live
PAYPAL_CLIENT_ID=你的客户端ID
PAYPAL_SECRET=你的密钥

3. 编写转账逻辑服务类

创建一个封装Payouts功能的服务类,支持单笔和批量转账:

<?php

namespace App\Services;

use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Api\Payout;
use PayPal\Api\PayoutItem;
use PayPal\Api\Currency;

class PayPalPayoutService
{
    protected $apiContext;

    public function __construct()
    {
        $clientId = env('PAYPAL_CLIENT_ID');
        $clientSecret = env('PAYPAL_SECRET');
        $mode = env('PAYPAL_MODE', 'sandbox');

        $this->apiContext = new ApiContext(
            new OAuthTokenCredential($clientId, $clientSecret)
        );
        $this->apiContext->setConfig([
            'mode' => $mode,
            'log.LogEnabled' => true,
            'log.FileName' => storage_path('logs/paypal.log'),
            'log.LogLevel' => 'DEBUG'
        ]);
    }

    // 单笔转账
    public function sendSingle(string $paypalEmail, float $amount, string $currency = 'USD', string $note = '提现打款')
    {
        $currencyObj = new Currency();
        $currencyObj->setCode($currency)->setValue($amount);

        $item = new PayoutItem();
        $item->setRecipientType('EMAIL')
            ->setReceiver($paypalEmail)
            ->setAmount($currencyObj)
            ->setNote($note);

        $payout = new Payout();
        $payout->setSenderBatchHeader([
            'sender_batch_id' => uniqid('PAYOUT_'),
            'email_subject' => '您的提现已到账'
        ])->addItem($item);

        try {
            $output = $payout->create(null, $this->apiContext);
            return [
                'success' => true,
                'batch_id' => $output->getBatchHeader()->getPayoutBatchId(),
                'status' => $output->getBatchHeader()->getBatchStatus()
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'error' => $e->getMessage()
            ];
        }
    }

    // 批量转账
    public function sendBatch(array $items)
    {
        $payoutItems = [];
        foreach ($items as $item) {
            $currencyObj = new Currency();
            $currencyObj->setCode($item['currency'] ?? 'USD')->setValue($item['amount']);

            $payoutItem = new PayoutItem();
            $payoutItem->setRecipientType('EMAIL')
                ->setReceiver($item['paypal_id'])
                ->setAmount($currencyObj)
                ->setNote($item['note'] ?? '批量提现');

            $payoutItems[] = $payoutItem;
        }

        $payout = new Payout();
        $payout->setSenderBatchHeader([
            'sender_batch_id' => uniqid('BATCH_'),
            'email_subject' => '批量提现到账通知'
        ])->setItems($payoutItems);

        try {
            $output = $payout->create(null, $this->apiContext);
            return [
                'success' => true,
                'batch_id' => $output->getBatchHeader()->getPayoutBatchId(),
                'status' => $output->getBatchHeader()->getBatchStatus()
            ];
        } catch (\Exception $e) {
            return [
                'success' => false,
                'error' => $e->getMessage()
            ];
        }
    }
}

4. 控制器调用服务处理请求

创建控制器接收前端参数,调用服务类完成转账:

<?php

namespace App\Http\Controllers;

use App\Services\PayPalPayoutService;
use Illuminate\Http\Request;

class PayoutController extends Controller
{
    protected $payoutService;

    public function __construct(PayPalPayoutService $payoutService)
    {
        $this->payoutService = $payoutService;
    }

    // 单笔提现接口
    public function single(Request $request)
    {
        $validated = $request->validate([
            'paypal_id' => 'required|email',
            'amount' => 'required|numeric|min:0.01'
        ]);

        $result = $this->payoutService->sendSingle(
            $validated['paypal_id'],
            $validated['amount'],
            $request->currency ?? 'USD',
            $request->note ?? '用户提现'
        );

        return $result['success'] 
            ? response()->json(['msg' => '转账发起成功', 'batch_id' => $result['batch_id']], 200)
            : response()->json(['msg' => '转账失败', 'error' => $result['error']], 400);
    }

    // 批量提现接口
    public function batch(Request $request)
    {
        $validated = $request->validate([
            'payouts' => 'required|array',
            'payouts.*.paypal_id' => 'required|email',
            'payouts.*.amount' => 'required|numeric|min:0.01'
        ]);

        $result = $this->payoutService->sendBatch($validated['payouts']);

        return $result['success'] 
            ? response()->json(['msg' => '批量转账发起成功', 'batch_id' => $result['batch_id']], 200)
            : response()->json(['msg' => '批量转账失败', 'error' => $result['error']], 400);
    }
}

关键注意事项

  • 沙箱测试优先:先用PayPal沙箱的测试账号(包括收款方的沙箱邮箱)验证流程,避免生产环境出错。
  • 手续费与额度:Payouts API每笔会收取手续费,批量转账有笔数和金额上限,具体规则参考PayPal官方说明。
  • 状态跟踪:可通过返回的batch_id调用Payouts查询接口,跟踪每笔转账的最终状态(到账/失败)。
  • 异常处理:生产环境需完善异常捕获逻辑,处理PayPal返回的额度不足、收款方账号异常等情况。

内容的提问来源于stack exchange,提问作者dharti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:17:51