【发布时间】:2018-04-29 14:58:00
【问题描述】:
我正在我的项目中实现 ipnlistner。我在我的贝宝帐户中设置了 ipn url。但我没有收到对该 url 的所有事务 ipn 响应。但是当我在我的帐户中检查 ipn 历史记录时,它显示所有 ipn 都已发送。例如昨天它显示所有 112 ipn 已发送。但我的数据库中只有 7 个。这是我的 ipn 监听器代码。我只在第一行插入我在数据库中获取的所有数据。
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Response;
class PaypalIPN extends Controller {
private $use_sandbox = null;
const VALID = 'VERIFIED';
const INVALID = 'INVALID';
public function useSandbox() {
$this->use_sandbox = env( 'USE_SANDBOX' );
}
public function getPaypalUri() {
if ( $this->use_sandbox ) {
return env( 'SANDBOX_VERIFY_URI' );
} else {
return env( 'VERIFY_URI' );
}
}
public function verifyIPN() {
try {
DB::table( 'ipn_response' )->insert( [ 'data' => json_encode( $_POST, true ) ] );
if ( ! count( $_POST ) ) {
throw new \Exception( "Missing POST Data" );
}
$raw_post_data = file_get_contents( 'php://input' );
$raw_post_array = explode( '&', $raw_post_data );
$myPost = array();
foreach ( $raw_post_array as $keyval ) {
$keyval = explode( '=', $keyval );
if ( count( $keyval ) == 2 ) {
// Since we do not want the plus in the datetime string to be encoded to a space, we manually encode it.
if ( $keyval[0] === 'payment_date' ) {
if ( substr_count( $keyval[1], '+' ) === 1 ) {
$keyval[1] = str_replace( '+', '%2B', $keyval[1] );
}
}
$myPost[ $keyval[0] ] = urldecode( $keyval[1] );
}
}
// Build the body of the verification post request, adding the _notify-validate command.
$req = 'cmd=_notify-validate';
$get_magic_quotes_exists = false;
if ( function_exists( 'get_magic_quotes_gpc' ) ) {
$get_magic_quotes_exists = true;
}
foreach ( $myPost as $key => $value ) {
if ( $get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1 ) {
$value = urlencode( stripslashes( $value ) );
} else {
$value = urlencode( $value );
}
$req .= "&$key=$value";
}
// Use the sandbox endpoint during testing.
$this->useSandbox();
// Post the data back to PayPal, using curl. Throw exceptions if errors occur.
$ch = curl_init( $this->getPaypalUri() );
curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $req );
curl_setopt( $ch, CURLOPT_SSLVERSION, 6 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 1 );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $ch, CURLOPT_FORBID_REUSE, 1 );
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 30 );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Connection: Close' ) );
$res = curl_exec( $ch );
if ( ! ( $res ) ) {
$errno = curl_errno( $ch );
$errstr = curl_error( $ch );
curl_close( $ch );
throw new \Exception( "cURL error: [$errno] $errstr" );
}
$info = curl_getinfo( $ch );
$http_code = $info['http_code'];
if ( $http_code != 200 ) {
throw new \Exception( "PayPal responded with http code $http_code" );
}
curl_close( $ch );
// Check if PayPal verifies the IPN data, and if so, return true.
if ( $res == self::VALID ) {
DB::table( 'ipn_response' )->insert( [ 'data' => json_encode( $res, true ) ] );
} else {
DB::table( 'ipn_response' )->insert( [ 'data' => json_encode( $res, true ) ] );
}
// Reply with an empty 200 response to indicate to paypal the IPN was received correctly.
header( "HTTP/1.1 200 OK" );
}catch (\Exception $e){
DB::table( 'ipn_response' )->insert( [ 'data' => json_encode( ["Exception"=>$e->getMessage()]) ] );
}
}
}
我非常喜欢这个网址上的 IPN
我的 ipn 网址是
https://www.myproject.com/api/verify-ipn
注意:之前我在此帐户上创建了一些贝宝按钮,我没有收到该按钮付款的 ipn 响应
请帮助或指导为此做些什么..
【问题讨论】:
-
什么时候写入数据库? -- 显示代码
-
你的 PHP 错误日志是怎么说的?
-
数据库写入是通过
DB类完成的。不确定它是什么库,但可能是问题的根源。 -
@smcjones 因为我们看不到它,我们无法知道这不是问题所在。
-
@Martin 我们也不知道这不是问题所在。我跟着你。然而,快速浏览告诉我这是 Laravel 的
DB类(如此标记)。语法对我来说很熟悉。可能不是 Laravel 错误。
标签: php mysql laravel-5 paypal paypal-ipn