使用 codeigniter 中的 PayPal 集成,成功页面未向我返回任何内容

Success page is not returning anything to me using PayPal integration in codeigniter

真不知道怎么办。

我只想将 PayPal 响应插入到我的数据库中,但在处理付款后没有返回任何值。

我已经在我的 PayPal 沙盒帐户中完成了以下操作:

已启用自动 Return

设置自动 Return URL ('https://hous3r3nt.000webhostapp.com/houserent/MyApplication/paymentSuccess')

启用支付数据传输 (PDT)

但还是没有运气:(.

我正在使用 000webhostapp 使我的网站上线,因为我认为如果我不使用本地主机它会起作用,但它仍然不起作用。

这是我控制器中的代码:

    // Paypal integration

    function buyProduct($property_id){
        // Set variables for paypal form
        $returnURL = base_url().'MyApplication/paymentSuccess'; //payment success url
        $cancelURL = base_url().'MyApplication/paymentFail'; //payment fail url
        $notifyURL = base_url().'MyApplication/ipn'; //ipn url

        // Get product data from the database
        $property = $this->MyApplicationModel->getPropertyApplication($property_id);

        // Get current user ID from the session (optional)
        $userID = !empty($_SESSION['id'])?$_SESSION['id']:1;

        // Add fields to paypal form
        $this->paypal_lib->add_field('return', $returnURL);
        $this->paypal_lib->add_field('cancel_return', $cancelURL);
        $this->paypal_lib->add_field('notify_url', $notifyURL);
        $this->paypal_lib->add_field('item_name', $property['property_name']);
        $this->paypal_lib->add_field('custom', $userID);
        $this->paypal_lib->add_field('item_number',  $property['property_id']);
        $this->paypal_lib->add_field('amount',  $property['property_price']);

        // Render paypal form
        $this->paypal_lib->paypal_auto_form();
    }

    function paymentSuccess(){
            // Get the transaction data
            $paypalInfo = $this->input->get();

            $productData = $paymentData = array();
            if(!empty($paypalInfo['item_number']) && !empty($paypalInfo['tx']) && !empty($paypalInfo['amt']) && !empty($paypalInfo['cc']) && !empty($paypalInfo['st'])){
                    $item_name = $paypalInfo['item_name'];
                    $item_number = $paypalInfo['item_number'];
                    $txn_id = $paypalInfo["tx"];
                    $payment_amt = $paypalInfo["amt"];
                    $currency_code = $paypalInfo["cc"];
                    $status = $paypalInfo["st"];

                    // Get product info from the database
                    $productData = $this->MyApplicationModel->getPropertyApplication($item_number);

                    // Check if transaction data exists with the same TXN ID
                    $paymentData = $this->payment->getPayment(array('txn_id' => $txn_id));
            }

            // Pass the transaction data to view
            $data['product'] = $productData;
            $data['payment'] = $paymentData;
            $this->load->view('paypal/paymentSuccess', $data);
    }

     function paymentFail(){
            // Load payment failed view
            $this->load->view('paypal/paymentFail');
     }

     function ipn(){
            // Retrieve transaction data from PayPal IPN POST
            $paypalInfo = $this->input->post();

            if(!empty($paypalInfo)){
                    // Validate and get the ipn response
                    $ipnCheck = $this->paypal_lib->validate_ipn($paypalInfo);

                    // Check whether the transaction is valid
                    if($ipnCheck){
                            // Check whether the transaction data is exists
                            $prevPayment = $this->payment->getPayment(array('txn_id' => $paypalInfo["txn_id"]));
                            if(!$prevPayment){
                                    // Insert the transaction data in the database
                                    $data['user_id']    = $paypalInfo["custom"];
                                    $data['product_id']    = $paypalInfo["item_number"];
                                    $data['txn_id']    = $paypalInfo["txn_id"];
                                    $data['payment_gross']    = $paypalInfo["mc_gross"];
                                    $data['currency_code']    = $paypalInfo["mc_currency"];
                                    $data['payer_name']    = trim($paypalInfo["first_name"].' '.$paypalInfo["last_name"], ' ');
                                    $data['payer_email']    = $paypalInfo["payer_email"];
                                    $data['status'] = $paypalInfo["payment_status"];

                                    $this->payment->insertTransaction($data);
                            }
                    }
            }
    }

请帮帮我,我现在真的不知道该怎么办。

Auto Return 和 PDT 是 HTML Payments Standard 的古老设置,这是一种 API-less 集成。不要依赖 Auto Return 或 PDT 来做任何重要的事情,尤其是在数据库中记录信息。永远无法保证 return 会发生。客户可能正在 PayPal 上查看收据,但可能不会点击 return,或者他们的客户端可能会崩溃或出现许多问题。绝对没有业务逻辑应该依赖于这些功能,它们仅适用于信息/感谢消息目的。

但是,您发布的代码是针对 IPN 的,所以这至少是朝着正确方向迈出的一步,因为 IPN 服务是一个独立的东西——虽然很旧而且不值得推荐——可以用来异步接收通知。

要确定您没有收到 IPN 通知的原因,请先检查您自己的 IPN listener/notify URL 以及您的 PayPal 帐户 IPN history 的网络服务器日志。

您可以使用 IPN 模拟器测试您的 IPN 侦听器。


为获得最佳效果,请将您的集成升级为不依赖 IPN 的集成。最好的解决方案是在您的服务器上创建两条路由,一条用于 'Create Order',一条用于 'Capture Order',记录在此处:https://developer.paypal.com/docs/business/checkout/server-side-api-calls/ -- 这些路由应该 return JSON 输出(并且只有 JSON)。第二个,在 returning JSON 之前,应该检查是否有成功响应,然后再写入数据库。

将您的两条路线与以下批准流程配对:https://developer.paypal.com/demo/checkout/#/pattern/server

这样就不需要异步IPN消息服务了。当您通过 API.

捕获时,您已经立即获得 同步 success/failure 响应