我正在使用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时,它已经在那里了。