我已经在我的网站上的会员页面上添加了一个PayPal插件,我使用沙盒模式付款,但我没有得到任何 IPN 响应PayPal但我可以模拟 IPN 响应,它返回握手验证
我已经转到了IPN>销售首选项>帐户并更新了那里的URL,并且在我正在使用的插件中,我也将notify_url
位更改为IPN url
插件:https://github.com/srmklive/laravel-paypal
在下面的 IPN 处理程序上,我让它将 post 响应插入数据库表中,以便我可以查看我是否从PayPal中得到任何东西
插件配置
return [
'mode' => env('PAYPAL_MODE', 'sandbox'), // Can only be 'sandbox' Or 'live'. If empty or invalid, 'live' will be used.
'sandbox' => [
'username' => env('PAYPAL_SANDBOX_API_USERNAME', ''),
'password' => env('PAYPAL_SANDBOX_API_PASSWORD', ''),
'secret' => env('PAYPAL_SANDBOX_API_SECRET', ''),
'certificate' => env('PAYPAL_SANDBOX_API_CERTIFICATE', ''),
'app_id' => 'APP-80W284485P519543T', // Used for testing Adaptive Payments API in sandbox mode
],
'live' => [
'username' => env('PAYPAL_LIVE_API_USERNAME', ''),
'password' => env('PAYPAL_LIVE_API_PASSWORD', ''),
'secret' => env('PAYPAL_LIVE_API_SECRET', ''),
'certificate' => env('PAYPAL_LIVE_API_CERTIFICATE', ''),
'app_id' => '', // Used for Adaptive Payments API
],
'payment_action' => 'Sale', // Can only be 'Sale', 'Authorization' or 'Order'
'currency' => 'GBP',
'notify_url' => 'https://www.mywebsite.com/paypal/ipn', // Change this accordingly for your application.
'locale' => '', // force gateway language i.e. it_IT, es_ES, en_US ... (for express checkout only)
'validate_ssl' => false, // Validate SSL when creating api client.
];
IPN 处理程序
public function ipn(Request $request)
{
$data = [
'post' => json_encode($request->all()),
'created_at' => date('Y-m-d H:i'),
];
// Import the namespace SrmklivePayPalServicesExpressCheckout first in your controller.
$provider = new ExpressCheckout;
$request->merge(['cmd' => '_notify-validate']);
$post = $request->all();
$response = (string) $provider->verifyIPN($post);
$data['response'] = $response;
DB::table('ipn_responses')->insert($data);
if ($response === 'VERIFIED') {
// Your code goes here ...
}
}
事实证明我用错了插件。我需要在success_url上"做"付款
例如,当PayPal将我返回到网站时,付款尚未完成。以下代码处理付款,然后进行检查。我一直以为它是通过IPN发送的
/**
* Payement success
* @param Request $request
* @return IlluminateHttpRedirectResponse
*/
public function success(Request $request)
{
$token = $request->get('token');
$PayerID = $request->get('PayerID');
$cart = $this->getCartDataFromToken($token);
// Verify Express Checkout Token
$response = $this->provider->getExpressCheckoutDetails($token);
// Check express checkout was a success
if (in_array(strtoupper($response['ACK']), ['SUCCESS', 'SUCCESSWITHWARNING'])) {
// Perform transaction on PayPal
$response = $this->provider->doExpressCheckoutPayment($cart, $token, $PayerID);
$order = $this->finalizeOrder($cart, $response);
if($order->paid) {
$order->user->startMembership($order->membership);
FormResponse::set('Your order has been successfully completed and your membership has begun. You may check your My Account page to view your membership status.');
}
else {
FormResponse::set('Your payment could not be completed (Error 2)');
}
}
else {
FormResponse::set('Your payment could not be completed (Error 1)');
}
return redirect()->route('memberships');
}