如何解决贝宝付款批准后如何存储用户详细信息?
我正在建立一个在线课程网站,学生可以在这里通过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 举报,一经查实,本站将立刻删除。