#php #paypal
#php #paypal
Вопрос:
Мои проблемы начинаются после того, как я включил код по умолчанию (https://developer.paypal.com/demo/checkout/#/pattern/server) и изменил его следующим образом:
<?php
session_start();
require_once '../inc/confi&.inc.php';
echo '
<!DOCTYPE html&&t;
<head&&t;
<meta name="viewport" content="width=device-width, initial-scale=1"&&t;
<meta http-equiv="X-UA-Compatible" content="IE=ed&e" /&&t;
</head&&t;
<body&&t;
<div id="paypal-button-container"&&t;</div&&t;
<script src="https://www.paypal.com/sdk/js?client-id=' . PAYPAL_CLIENT_ID . 'amp;currency=EURamp;disable-fundin&=credit,card"&&t;</script&&t;
';
?&&t;
<script&&t;
// Render the PayPal button into #paypal-button-container
paypal.Buttons({
// Call your server to set up the transaction
createOrder: function(data, actions) {
return fetch('01_payPalCheckout.php', {
mode: "no-cors",
method: 'post',
headers: {
'content-type': 'application/json'
}
}).then(function(res) {
return res.json();
}).then(function(orderData) {
return orderData.id;
});
},
// Call your server to finalize the transaction
onApprove: function(data, actions) {
return fetch('01_checkout.php?orderId=' data.orderID, {
method: 'post'
}).then(function(res) {
return res.json();
}).then(function(orderData) {
var errorDetail = Array.isArray(orderData.details) amp;amp; orderData.details[0];
if (errorDetail amp;amp; errorDetail.issue === 'INSTRUMENT_DECLINED') {
// Recoverable state, see: "Handle Fundin& Failures"
// https://developer.paypal.com/docs/checkout/inte&ration-features/fundin&-failure/
return actions.restart();
}
if (errorDetail) {
var ms& = 'Sorry, your transaction could not be processed.';
if (errorDetail.description) ms& = 'nn' errorDetail.description;
if (orderData.debu&_id) ms& = ' (' orderData.debu&_id ')';
// Show a failure messa&e
return alert(ms&);
}
// Show a success messa&e to the buyer
alert('Transaction completed by ' orderData.payer.name.&iven_name);
});
}
}).render('#paypal-button-container');
</script&&t;
<?php
echo '
</body&&t;
</html&&t;
';
?&&t;
В CreateOrder я вызываю 01_payPalCheckout.php который структурирован так, как указано в PHP SDK:
<?php
use PayPalCheckoutSdkOrdersOrdersCreateRequest;
session_start();
require_once '../inc/confi&.inc.php';
# 1: Environment, Client
$environment = new SandboxEnvironment(PAYPAL_CLIENT_ID, PAYPAL_SECRET);
$client = new PayPalHttpClient($environment);
# 2: Request Order
$request = new OrdersCreateRequest();
$request-&&t;prefer('return=representation');
$request-&&t;body = [
"intent" =&&t; "CAPTURE",
"purchase_units" =&&t; [[
"reference_id" =&&t; "test_ref_id1",
"amount" =&&t; [
"value" =&&t; "100.00",
"currency_code" =&&t; "USD"
]
]],
"application_context" =&&t; [
"cancel_url" =&&t; "https://example.com/cancel",
"return_url" =&&t; "https://example.com/return"
]
];
try {
// Call API with your client and &et a response for your call
$response = $client-&&t;execute($request);
// JSON-Encodierun&
$response = json_encode($response);
// If call returns body in response, you can &et the deserialized version from the result attribute of the response
return $response;
} catch (HttpException $ex) {
echo $ex-&&t;statusCode;
print_r($ex-&&t;&etMessa&e());
exit();
}
Я добавил json_encode() перед возвратом $response; результирующий JSON-код представляет собой следующий код:
{
"statusCode": 201,
"result": {
"id": "4H218056YS3363904",
"intent": "CAPTURE",
"status": "CREATED",
"purchase_units": [
{
"reference_id": "test_ref_id1",
"amount": {
"currency_code": "USD",
"value": "100.00"
},
"payee": {
"email_address": "info-facilitator@24960324320.de",
"merchant_id": "BYWLB3T6SPG54"
}
}
],
"create_time": "2020-08-10T08:33:40Z",
"links": [
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/4H218056YS3363904",
"rel": "self",
"method": "GET"
},
{
"href": "https://www.sandbox.paypal.com/checkoutnow?token=4H218056YS3363904",
"rel": "approve",
"method": "GET"
},
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/4H218056YS3363904",
"rel": "update",
"method": "PATCH"
},
{
"href": "https://api.sandbox.paypal.com/v2/checkout/orders/4H218056YS3363904/capture",
"rel": "capture",
"method": "POST"
}
]
},
"headers": {
"": "",
"Cache-Control": "max-a&e=0, no-cache, no-store, must-revalidate",
"Content-Len&th": "747",
"Content-Type": "application/json",
"Date": "Mon, 10 Au& 2020 08",
"Paypal-Debu&-Id": "1b04a05438898"
}
}
В onApprove я вызываю «’01_payPalCapture.php?OrderID=’ data.OrderID» (здесь я также использовал предоставленные стандартные методыhttps://&ithub.com/paypal/Checkout-PHP-SDK:
<?php
// Session starten
session_start();
use PayPalCheckoutSdkCorePayPalHttpClient;
use PayPalCheckoutSdkCoreSandboxEnvironment;
use PayPalCheckoutSdkOrdersOrdersCaptureRequest;
// Konfi&urations-Datei einbinden
require_once '../inc/confi&.inc.php';
# 1: Environment, Client
$environment = new SandboxEnvironment(PAYPAL_CLIENT_ID, PAYPAL_SECRET);
$client = new PayPalHttpClient($environment);
# 2 Capture
$request = new OrdersCaptureRequest($_GET['orderId']);
$request-&&t;prefer('return=representation');
try {
$response = $client-&&t;execute($request);
$response = array('id' =&&t; $response-&&t;result-&&t;id);
$response = json_encode($response);
return $response; // value of return: {"id":"2KY036458M157715J"}
}catch (HttpException $ex) {
echo $ex-&&t;statusCode;
print_r($ex-&&t;&etMessa&e());
}
В 01_cart.php смарт-кнопки отображаются по желанию, но нажатие на «PayPal» приводит только к появлению сообщений об ошибках, например update_client_confi&_error и т.д.
Я думаю, что с моей стороны существует проблема с пониманием того, как эти два скрипта работают вместе.
Заранее спасибо за подсказки и помощь (я непрерывно работаю над этой проблемой уже 4 дня, я с трудом просмотрел всю справку PayPal и ничего не нашел об этой конкретной проблеме в Интернете).
Комментарии:
1. попробуйте эту ссылку: developer.paypal.com/docs/checkout/reference/server-inte&ration /…
Ответ №1:
/httpdocs/01_payPalCheckout.php
неверный путь
это должен быть тот, который может загружаться в вашем веб-браузере
Что-то, что работало бы в HTML href, как <a href="/01payPalCheckout.php"&&t;</a&&t;
например
Тестовая загрузка 01payPalCheckout.php в вашем браузере убедитесь, что он выполняется и возвращает правильный JSON, а затем исправьте свой клиентский код, чтобы указать правильный путь, который вернет этот JSON при извлечении
Комментарии:
1. Я добавил json_encode в 01_payPalCheckout.php и я получаю правильный JSON-код (на мой взгляд, это правильный код) — я отредактировал свой вопрос, чтобы показать результирующий JSON-код!
2. не совсем, он возвращает result.id и ваш javascript считывает только id
3. … вы имеете в виду, что я должен просто напечатать идентификатор в 01_payPalCheckout.php (печать($result_id))?
4. нет, я имею в виду, что она должна располагаться по идентификатору в объекте, а не по результату -&&t; id
5. Не могли бы вы быть немного более понятными и привести пример кода? Спасибо!