一些背景: 我试图让Paypal Standard与付费会员资格Pro WordPress插件一起使用。我没有得到太多的帮助,这就是为什么我在这里。
订单设置为'Review'并保持这种状态,即使打开调试,也没有通过电子邮件发送ipn调试日志。还尝试设置调试,因此它会创建一个调试日志文件,但它不会创建一个。 Paypal IPN的详细信息如下:
原创/重新发送:原创
最新交货日期/时间:---
通知网址:http://example.com/wp-admin/admin-ajax.php?action=ipnhandler
HTTP响应代码:
交货状态:已停用
重试次数:0
IPN类型:已完成交易
IPN消息本身看起来不错。
完成了以下测试:
1 - 启用调试后,我访问IPN网址并获取此信息: 登录日期:01/02/2017 13:20:34 Array()FP!数组([headers] => 加上一整页信息,我通过电子邮件收到了ipn调试日志。
2 - 我设置了一个HTML表单,其操作设置为ipn处理程序url并获得VERIFIED
3 - 使用IPN Simulator和相同的ipn处理程序URL,将事务类型设置为Web Accept,将Payment Status设置为Completed,其他所有内容都是默认值,只是我删除了Custom字段。 IPN日志说验证。
4 - 在Sandbox中测试 - 我使用了买家的一个沙盒买家帐户,并且错误地使用了我的开发者电子邮件地址作为商家(它恰好是Business Paypal帐户),但我得到了验证!结账处理 - 成功。
5 - 我重复了那个测试,除了我使用沙箱商家帐户,但这次得到的结果与实时系统相同 - 订单状态为'审核',没有ipn调试日志等。
6 - 再次重复沙箱测试并使用客户的商家帐户电子邮件地址,我得到了验证!订单成功了。
我尝试过的其他事情: - 在我的客户商家帐户中将语言编码从Windows更改为UTF-8 - 没有区别 - 安装了TLS 1.2兼容性测试插件:“TLS 1.2已启用。 在调用需要TLS 1.2的网关和API时,您的站点应该可以正常工作。端点是https://tlstest.paypal.com/(PayPal)PayPal_Connection_OK;检测到PHP版本5.5.38 cURL 7.34.0或更高版本。
这是处理程序的代码:
function pmpro_ipnValidate() {
//read the post from PayPal system and add 'cmd'
$req = 'cmd=_notify-validate';
//generate string to check with PayPal
foreach ( $_POST as $key => $value ) {
$value = urlencode( stripslashes( $value ) );
$req .= "&$key=$value";
}
//post back to PayPal system to validate
$gateway_environment = pmpro_getOption( "gateway_environment" );
if ( $gateway_environment == "sandbox" ) {
$paypal_url = 'https://www.' . $gateway_environment . '.paypal.com/cgi-bin/webscr';
} else {
$paypal_url = 'https://www.paypal.com/cgi-bin/webscr';
}
$paypal_params = array(
"body" => $req,
"httpversion" => "1.1",
"Host" => "www.paypal.com",
"Connection" => "Close",
"user-agent" => PMPRO_USER_AGENT
);
$fp = wp_remote_post( $paypal_url, $paypal_params );
//log post vars
ipnlog( print_r( $_POST, true ) );
//assume invalid
$r = false;
if ( empty( $fp ) ) {
//HTTP ERROR
ipnlog( "HTTP ERROR" );
$r = false;
} elseif ( ! empty( $fp->errors ) ) {
//error from PayPal
ipnlog( "ERROR" );
ipnlog( "Error Info: " . print_r( $fp->errors, true ) . "\n" );
//log fb object
ipnlog( print_r( $fp, true ) );
$r = false;
} else {
ipnlog( "FP!" );
//log fb object
ipnlog( print_r( $fp, true ) );
$res = wp_remote_retrieve_body( $fp );
ipnlog( print_r( $res, true ) );
if ( strcmp( $res, "VERIFIED" ) == 0 ) {
//all good so far
ipnlog( "VERIFIED" );
$r = true;
} else {
//log for manual investigation
ipnlog( "INAVLID" );
$r = false;
}
}
/**
* Filter if an ipn request is valid or not.
*
* @since 1.8.6.3
*
* @param bool $r true or false if the request is valid
* @param mixed $fp remote post object from request to PayPal
*/
$r = apply_filters( 'pmpro_ipn_validate', $r, $fp );
return $r;
}
我还能做些什么来找出为什么我无法通过客户的Paypal帐户在实时网站上获得成功的Paypal Standard付款,但它可以在Sandbox中使用?
答案 0 :(得分:0)
事实证明我需要启用IPN并在Paypal帐户中设置IPN URL,这违反了PMPRO的指示。