EDIT:エクスプレスチェックアウト決済戻っても実行が成功した後、関連するリソースを空にする
@bluepnumeが、これはバグで、後に固定されるだろう、おそらく述べたように。
私のケースでは、同じことをしました(支払いの作成/支払いの実行)が、checkout.js
を使わずにREST APIを使ってサーバー側で行いましたが、今はすべてうまくいきます。
唯一の違いはcheckout.js
で生成されたオンサイトライトボックスを使用する代わりに、クライアントをPayPal($payment->getApprovalLink()
)にリダイレクトしていることです。
オリジナル質問:
私は基本的なクライアント統合とPayPalのエクスプレスチェックアウトを統合しました。
すべてうまく見えます。支払いはスムーズに完了し、残りのAPIリクエストとSeller's Account(サンドボックス)の両方から、完了/承認された支払いを見ることができます。
ただし、実行に成功しても支払いが完了しません。注文取り消し後にAPIから払い戻しを行いますが、支払いデータを読み終えた後、支払いのトランザクションで受領できなくなりました。
JSコード(正常に動作します):
paypal.Button.render({
env: $form.find('[name="env"]').val(),
client: {
sandbox: $form.find('[name="client_id"]').val(),
production: $form.find('[name="client_id"]').val()
},
locale: 'it_IT',
commit: true, // Optional: show a 'Pay Now' button in the checkout flow
payment: function() {
var env = this.props.env;
var client = this.props.client;
return paypal.rest.payment.create(env, client, {
transactions: [
{
custom: $form.find('[name="custom"]').val(),
amount: {
total: $form.find('[name="subtotal"]').val(),
currency: $form.find('[name="currency_code"]').val()
},
description: $form.find('[name="item_name"]').val(),
}
],
redirect_urls: {
"return_url": $form.find('[name="return"]').val(),
"cancel_url": $form.find('[name="notify_url"]').val()
}
});
},
onAuthorize: function(data, actions) {
return actions.payment.execute().then(function() {
actions.payment.get().then(function(data) {
pjQ.$.post($form.find('[name="notify_url"]').val(), data).done(function (data) {
return actions.redirect();
});
});
});
},
onCancel: function(data, actions) {
return actions.redirect();
}
}, '#paypal-button');
PHPコード:
$payment = \PayPal\Api\Payment::get($paymentId, $apiContext); // It's ok
$transactions = $payment->getTransactions(); // It's ok
$relatedResources = $transactions[0]->getRelatedResources(); // Empty...
// I can't use the code below as $relatedResources is empty
$sale = $relatedResources[0]->getSale();
$saleId = $sale->getId();
$sale = new \PayPal\Api\Sale();
$sale->setId($saleId);
$refundedSale = $sale->refundSale($refundRequest, $apiContext);
任意のアイデア?
私はあなたの答えを受け入れますが、修正を待つ時間がないので、checkout.jsを使わずにPayPalにリダイレクトしてサーバ側の支払いを作成し実行しました。 – enenen
FYI、checkout.jsを使用することはできますが、 'onAuthorize'からのajax呼び出しでサーバー側で実行します。そのようにしても、同じページのポップアップウィンドウのメリットが得られます。 – bluepnume
ええ、そうですが、クライアントの最初の要件はPayPalにリダイレクトすることでしたので、リダイレクトでも問題ありません。 – enenen