使用 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 响应
真不知道怎么办。
我只想将 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 响应