(拉拉维尔)无法从 IPN 获取响应PayPal但模拟响应返回已验证



我已经在我的网站上的会员页面上添加了一个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');
}

最新更新