贝宝付款批准后如何存储用户详细信息?

开发者

我正在建立一个在线课程网站,学生可以在这里通过PayPal购买课程。付款流程已成功运行,但是我对PayPal付款批准后在何处或如何存储课程和用户数据感到困惑。

我有一个用户表,课程表和数据透视表:course_students,用于存储课程ID和学生ID:

-------------
course_students
--------------
student_id    course_id
    1            2
----------

这是PayPalService类别:

class PayPalService
{
    use ConsumesExternalServices;

    protected $baseUri;

    protected $clientId;

    protected $clientSecret;

    public function __construct()
    {
        $this->baseUri = config('services.paypal.base_uri');
        $this->clientId = config('services.paypal.client_id');
        $this->clientSecret = config('services.paypal.client_secret');
    }

    public function resolveAuthorization(&$queryParams, &$formParams, &$headers)
    {
        $headers['Authorization'] = $this->resolveAccessToken();
    }

    public function decodeResponse($response)
    {
        return json_decode($response);
    }

    public function resolveAccessToken()
    {
        $credentials = base64_encode("{$this->clientId}:{$this->clientSecret}");

        return "Basic {$credentials}";
    }

    public function handlePayment(Request $request)
    {
        $order = $this->createOrder($request->value, $request->currency);

        $orderLinks = collect($order->links);

        $approve = $orderLinks->where('rel', 'approve')->first();

        session()->put('approvalId', $order->id);

        return redirect($approve->href);
    }

    public function handleApproval()
    {
        if (session()->has('approvalId')) {
            $approvalId = session()->get('approvalId');

            $payment = $this->capturePayment($approvalId);
            $name = $payment->payer->name->given_name;
            $payment = $payment->purchase_units[0]->payments->captures[0]->amount;
            $amount = $payment->value;
            $currency = $payment->currency_code;

            return redirect()
                ->route('success')
                ->with('payment', "Thanks, {$name}. We received your {$amount}{$currency} payment.");
        }

//        $errorMessage = 'We cannot capture the payment. Try again, please';
        return redirect()
            ->route('paymentform')
            ->with('error','We cannot capture the payment. Try again, please');
    }

    public function createOrder($value, $currency)
    {
        return $this->makeRequest(
            'POST',
            '/v2/checkout/orders',
            [],
            [
                'intent' => 'CAPTURE',
                'purchase_units' => [
                    0 => [
                        'amount' => [
                            'currency_code' =>strtoupper($currency),
                            'value' => round($value * $factor = $this->resolveFactor($currency)) / $factor,
                        ]
                    ]
                ],
                'application_context' => [
                    'brand_name' => config('app.name'),
                    'shipping_preference' => 'NO_SHIPPING',
                    'user_action' => 'PAY_NOW',
                    'return_url' => route('approval'),
                    'cancel_url' => route('cancelled'),
                ]
            ],
            [],
            $isJsonRequest = true,
        );
    }

    public function capturePayment($approvalId)
    {
        return $this->makeRequest(
            'POST',
            "/v2/checkout/orders/{$approvalId}/capture",
            [],
            [],
            [
                'Content-Type' => 'application/json'
            ],
        );
    }

    public function resolveFactor($currency)
    {
        $zeroDecimalCurrencies = ['JPY'];

        if (in_array(strtoupper($currency), $zeroDecimalCurrencies)) {
            return 1;
        }

        return 100;
    }

}

PaymentController:

public function paymentForm($course_uuid)
    {
        $currencies = Currency::all();
        $platforms = PaymentPlatform::get();

        $course = Course::where('uuid', $course_uuid)->where('status',1)->where('availability',1)->first();

        return view('public.payment.paypalform', compact('currencies','platforms','course'));
    }

    /**
     * implment Payemnt process
     *
     * @param Request $request
     */
    public function pay(Request $request)
    {
//        dd($request->all());
        $rules = [
            'value' => ['required', 'numeric', 'min:5'],
            'currency' => ['required', 'exists:currencies,iso'],
            'payment_platform' => ['required', 'exists:payment_platforms,id'],
        ];

        $request->validate($rules);

        $paymentPlatform = $this->paymentPlatformResolver
            ->resolveService($request->payment_platform);

        session()->put('paymentPlatformId', $request->payment_platform);

        return $paymentPlatform->handlePayment($request);
    }

    protected function approval()
    {
        if (session()->has('paymentPlatformId')) {
            $paymentPlatform = $this->paymentPlatformResolver
                ->resolveService(session()->get('paymentPlatformId'));

            return $paymentPlatform->handleApproval();
        }else{
            return redirect()
                ->route('courses.levels')
                ->withErrors('We cannot retrieve your payment platform. Try again, please.');
        }

    }

    protected function canceled()
    {
        return redirect()
            ->route('courses.levels')
            ->withErrors('You cancelled the payment.');
    }
图欣

在您的付款控制器中,您可以在会话中保存课程信息。付款后,当用户将重定向时,将信息保存到所需的数据库表中。

//save course info or other  info
session()->put('courseInfo', [your data]);

您的控制器功能:

   /** 
     * implment Payemnt process
     *
     * @param Request $request
     */
    public function pay(Request $request)
    {
//        dd($request->all());
        $rules = [
            'value' => ['required', 'numeric', 'min:5'],
            'currency' => ['required', 'exists:currencies,iso'],
            'payment_platform' => ['required', 'exists:payment_platforms,id'],
        ];

        $request->validate($rules);

        $paymentPlatform = $this->paymentPlatformResolver
            ->resolveService($request->payment_platform);

        session()->put('paymentPlatformId', $request->payment_platform);

        //save course info or other  info
        session()->put('courseInfo', [your data]);


        return $paymentPlatform->handlePayment($request);
    }

您的另一个功能:付款完成后,在其中approval()调用另一个功能$paymentPlatform->handleApproval();

转至handleApproval()功能,希望您能在其中找到用户帐户创建代码。现在获取会话值session()->get('courseInfo')并保存在所需的表中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用存储的信用卡详细信息进行贝宝(Paypal)专业付款

保持贝宝付款时如何通过邮件获取订单详细信息?

贝宝JS SDK和WebHooks-获取付款人详细信息

发送购买的物品的详细信息到贝宝?

贝宝订阅按钮和详细信息

贝宝:如何获取订单ID并传递到交易详细信息页面

如何在贝宝的订单摘要页面上显示买家详细信息?

用户单击我的网站上的确认后,如何确认贝宝快递付款?

如何在EmberJS中存储当前用户详细信息?

登录后如何使用用户详细信息?

在贝宝付款后如何获取交易编号

用户详细信息存储最佳实践

应用程序中的贝宝付款,如何清除以前的用户贝宝数据?

如何在成功付款时从 Stripe Google pay 获取用户填写的详细信息

LDAP 成功登录后,如何将用户详细信息存储到数据库中?

如何通过Bots.Business存储用户信息并通过其详细信息恢复信息?

ActiveMerchant:将商品详细信息发送到贝宝网址

如何删除重复的用户详细信息

如何使用 Razorpay PHP API 获取付款详细信息?

如何在不询问用户的情况下存储用户详细信息?

用户登录后,如何获取该特定用户的详细信息?

如何在用户登录后显示 uesrname 而不在登录时填写用户详细信息

如何使用localStorage来存储和获取用户登录详细信息?

如何在会话中存储用户详细信息并传递给Spring REST控制器

如何存储用户输入的详细信息并在ios中将其取回?

如何在 Firebase 存储中获取用户详细信息?

在Android Studio中存储用户登录详细信息

Java SE-存储当前登录的用户详细信息

使用 JSON 存储用户详细信息的 PHP 登录页面