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

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

我正在建立一个在线课程网站,学生可以在这里通过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')并保存在所需的表中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-