捕获条纹支付

Capture stripe payment

我正在使用 stripe/stripe 包来捕获单个产品的付款。一切都按预期工作,但是当用户返回到订单确认页面时,我想获得条带支付 ID。我将如何实现这一目标?

我不确定我是否需要网络钩子,如果需要,我将如何使用它?

public function onCharge() {

    $user = Auth::getUser();
    $course = CourseMeta::where('id', $this->param('id'))->first();


    $stripe = new \Stripe\StripeClient(env('STRIPE_SECRET'));
    $product = $stripe->products->create([
      'name' => $course->course->name . ' - ' . $course->date,
    ]);
    $price = $stripe->prices->create([
      'unit_amount' => $course->price * 120,
      'currency' => 'gbp',
      'product' => $product->id,
    ]);

    $validator = Validator::make(
        [
            'user_id' => $user->id,
            'coursemeta_id' => $course->id,
            'course_id' => $course->course->id,
            'stripe_id' => '1',
        ],
        [
            'user_id' => 'required',
            'coursemeta_id' => 'required',
            'course_id' => 'required',
            'stripe_id' => 'required'
        ]
    );

    if ($validator->fails()) {
        return Redirect::back()->withErrors($validator);
    } else {

            $order = new Order();

            $order->user_id = $user->id;
            $order->coursemeta_id = $course->id;
            $order->stripe_id = '1';
            $order->company = request()->get('company');
            $order->company_firstname = request()->get('company_firstname');
            $order->company_lastname = request()->get('company_lastname');
            $order->company_email = request()->get('company_email');
            $order->company_phone = request()->get('company_phone');
            $order->citb_levy = request()->get('citb_levy');
            $order->d_firstname = request()->get('d_firstname');
            $order->d_lastname = request()->get('d_lastname');
            $order->d_email = request()->get('d_email');
            $order->d_phone = request()->get('d_phone');
            $order->d_dob = request()->get('d_dob');
            $order->d_ninumber = request()->get('d_ninumber');


            $order->save();
        }


    $portal = $stripe->checkout->sessions->create([
      'success_url' => env('APP_URL') . '/order-confirmation'.'?' . 'user=' . $user->id . '&' . 'course=' . $course->id,
      'cancel_url' => env('APP_URL') . '/cancel',
      'line_items' => [
        [
          'price' => $price->id,
          'quantity' => 1
        ],
      ],
      'mode' => 'payment',
    ]);
          
    return redirect($portal->url);

}

您需要使用结帐会话 ID。

当你创建 success_urlcancel_url 时,你也可以用花括号传递 {CHECKOUT_SESSION_ID} 参数。当 payment gateway 将重定向到这些 URL 之一时,它会自动将 {CHECKOUT_SESSION_ID} 替换为实际会话 ID。

你的情况

$portal = $stripe->checkout->sessions->create([
    // HERE ---------------------------------------------------\/----------\/
   'success_url' => env('APP_URL') . '/order-confirmation'.'?session_id={CHECKOUT_SESSION_ID}&' . 'user='. $user->id . '&' . 'course=' . $course->id,
   'cancel_url' => env('APP_URL') . '/cancel',
   'line_items' => [
     [
       'price' => $price->id,
       'quantity' => 1
     ],
   ],
  'mode' => 'payment',
]);

Now when this page is called you can have session ID and you can retrieve all stuff from it.

// on success or cancel page you can use this code to get infos
$stripe = new \Stripe\StripeClient(env('STRIPE_SECRET'));


$session = \Stripe\Checkout\Session::retrieve(get('session_id'));


$customer = \Stripe\Customer::retrieve($session->customer);
$paymentIntent = \Stripe\PaymentIntent::retrieve($session->payment_intent);

// from this $session you can get customer/items/paymentIntent etc..

参考:https://stripe.com/docs/payments/checkout/custom-success-page

如有疑问请评论。