使用“实时”商家帐户进行沙盒测试但使用Sandbox商家帐户失败

时间:2017-01-04 04:04:37

标签: php wordpress paypal

一些背景: 我试图让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中使用?

1 个答案:

答案 0 :(得分:0)

事实证明我需要启用IPN并在Paypal帐户中设置IPN URL,这违反了PMPRO的指示。