PayPal REST SDK在execute()时没有返回正确的状态


PayPal REST SDK not returning proper status on execute()

我正在使用PayPal REST SDK进行PayPal支付。当完成购买并调用executePayment()方法时,支付对象的状态没有更新,仍然显示已创建而不是已批准

付款正常通过,如果我在执行后立即查找购买,我得到预期的批准状态:

$paypal = new PayPal;
$payment = $paypal->executePayment($order_id, $payer_id);
echo $payment->getState(); // "created"
$lookup = Payment::get($order_id, getApiContext());
echo $lookup->getState(); // "approved"

(这是PayPal类的相关方法…)

Class PayPal { 
    public function executePayment($paymentId, $payerId) 
    {
        $payment = Payment::get($paymentId, getApiContext());
        $paymentExecution = new PaymentExecution;
        $paymentExecution->setPayer_id($payerId);   
        $payment->execute($paymentExecution, getApiContext());  
        return $payment;
    }
}

在PayPal披萨应用程序上,executePayment方法工作得很好,返回的Payment对象立即显示为"批准"状态。

$payment = executePayment($order['payment_id'], $_GET['PayerID']);
echo $payment->getState(); // "approved"

我的executePayment()与pizza应用程序中的代码一字不差,唯一的区别是我把它放到了一个类中。

怎么了?为什么我不能立即从executePayment()方法获得"批准"?

编辑:

进一步检查,PayPal披萨应用程序使用rest-api-sdk-php v 0.6。*但实际的rest API sdk是在0.7版本。*

Payment::execute()方法已更改。在v0.6中,它像这样返回$this支付对象:

class Payment extends PPModel implements IResource {
    ...
    public function execute( $payment_execution, $apiContext=null) {
        ...
        $json = $call->execute( array('PayPal'Rest'RestHandler'),
        $this->fromJson($json);
        return $this;       
    }
}

,但现在在v0.7中,它正在创建一个新的支付对象并设置新对象的值,这似乎不能正常工作…

class Payment extends PPModel implements IResource {
    ...
    public function execute( $payment_execution, $apiContext=null) {
        ...
        $ret = new Payment();
        $ret->fromJson($json);
        return $ret;
    }
}

. .如果您将这些更改恢复到v0.6而不是$ret,它就可以工作了。不确定创建新的Payment()的原因是什么;对象vs返回$this ..也许有人能开导我一下?

我遇到了paypal沙箱无法完成订单的问题。

我可以在不修改paypal api代码的情况下解决这个问题。

  • 以xxx-facilitator@xxx帐号登录沙箱帐号。
  • 点击菜单项> profile - Update Email
  • 点击"确认",它说已经确认,但现在它可以工作了。

还要确保开发者选择"在完成测试之前审查测试付款"。

在0.7中进行更改的原因是,您之前获得的状态是由于一个bug。

当你做一个get Payment,你获得一个支付对象。之前,当你运行execute时,它会再次填充对象,而不会重置它。因此,您可以执行getStatus,但在Execute方法中没有返回。当你调用get时,它已经在那里了。