PayPal
Webhooks
Поиск…
параметры
| параметр | подробности |
|---|---|
| приложение | Наша экспресс-ссылка на приложение |
| bodyParser | Ссылка на пакет body-parser для работы с закодированными органами JSON |
| ID клиента | Идентификатор клиента приложения (учетные данные OAuth 2) |
| HTTP | Пакет http для запуска сервера |
| PayPal | Опорный объект SDK SDK |
| секрет | Секрет приложения (учетные данные OAuth 2) |
| webhookId | ID веб-камеры, подлежащей изменению |
| webhookUpdate | Объект JSON, содержащий сведения о веб-узле, которые необходимо обновить |
замечания
Эти примеры охватывают рабочие примеры того, как использовать веб-камеры PayPal для мониторинга событий для вашего приложения и платежей.
Тестирование веб-кнопок Sandbox с помощью ngrok и Express (Node)
В этом примере мы рассмотрим тестирование уведомлений webhook в песочнице, используя ngrok, чтобы предоставить туннель для нашего HTTP-прослушивателя Node, работающего на localhost, в Интернете. В этом примере мы собираемся использовать Node для создания веб-узлов уведомлений о событиях оплаты (например, сделанного платежа), а затем настроить сервер для прослушивания входящих HTTP-сообщений POST из событий webhook.
Мы предпримем несколько шагов, чтобы это произошло:
- Настройте простой сервер, чтобы прослушивать входящий трафик POST с веб-узлов, который будет являться уведомлением от PayPal, и начать прослушивание на localhost.
- Затем используйте ngrok для предоставления туннеля из локального хоста в Интернет, чтобы PayPal мог отправлять уведомления через.
- Наконец, подпишитесь на наше приложение (на основе предоставленных учетных данных) на события веб-хоста, которые мы хотим отслеживать, предоставив публичный URI ngrok с шага 2.
Создание прослушивателя Webhooks
Первое, что нам нужно сделать, это создать слушателя. Причина, по которой мы начинаем с слушателя, заключается в том, что нам нужен прямой URL-адрес ngrok, чтобы предоставлять веб-узлы, когда мы создаем или обновляем их.
var bodyParser = require('body-parser'),
http = require('http'),
app = require('express')();
app.use(bodyParser.json());
app.post('/', function(req, res){
console.log(JSON.stringify(req.body));
});
//create server
http.createServer(app).listen(3001, function () {
console.log('Server started: Listening on port 3001');
});
Наш слушатель - это простой маршрут, использующий Express. Мы слушаем любой входящий трафик POST, а затем выставляем тело POST на консоль. Мы можем использовать это, чтобы делать все, что захочет, с слушателем, когда оно появится.
Когда мы создаем HTTP-сервер в конце, мы настроили его на прослушивание на localhost port 3001. Запустите этот скрипт, чтобы начать прослушивание трафика.
Использование ngrok для размещения слушателя в Интернете
Когда слушатель настроен на localhost: 3001, наша следующая работа заключается в том, чтобы открыть этот скрипт в Интернете, чтобы трафик мог быть отправлен на него, что является задачей ngrok.
Выполните следующую команду из окна терминала:
ngrok http 3001
Это запустит процесс предоставления живого туннеля для локального хоста на порту 3001 и предоставит следующую информацию после запуска:
Как мы видим, живым адресом, который мы можем использовать, чтобы указать веб-хост PayPal на наш текущий прослушиватель на localhost, является http(s)://055b3480.ngrok.io . Это все, что нам нужно знать, чтобы настроить слушателя.
Подписка на уведомления
Нашим последним шагом является создание веб-узлов для нашего приложения, которое будет создавать уведомления, когда определенные события происходят с платежами, возмещениями и т. Д. В нашем приложении. Нам нужно только создать эти webhooks один раз, чтобы связать их с приложением, поэтому их не нужно запускать каждый раз, когда вы хотите их использовать.
Сначала мы настраиваем среду PayPal, добавляя требование к SDK PayPal Node, нашему идентификатору клиента / секретарю от создания приложения, а затем настраиваем среду для песочницы.
var paypal = require('paypal-rest-sdk');
var clientId = 'YOUR APPLICATION CLIENT ID';
var secret = 'YOUR APPLICATION SECRET';
paypal.configure({
'mode': 'sandbox', //sandbox or live
'client_id': clientId,
'client_secret': secret
});
Затем мы создали структуру JSON для наших веб-узлов. webhooks содержит две части информации, url который должны быть отправлены все события веб-хоста, и event_types которые мы хотим подписаться.
В случае с этим образцом url установлен на наш прямой URL-адрес ngrok, а события, которые мы слушаем, - это случаи, когда платежи завершены или отклонены.
Полный список потенциальных событий см. На странице https://developer.paypal.com/docs/integration/direct/rest-webhooks-overview/#event-type-support .
Наконец, мы передаем объект webhooks в вызов для создания webhooks, notification.webhook.create . В случае успеха PayPal отправит уведомления конечной точке, которую мы указали, которая работает на localhost.
var webhooks = {
"url": "https://436e4d13.ngrok.io",
"event_types": [{
"name": "PAYMENT.SALE.COMPLETED"
},{
"name": "PAYMENT.SALE.DENIED"
}
]};
paypal.notification.webhook.create(webhooks, function (err, webhook) {
if (err) {
console.log(err.response);
throw error;
} else {
console.log("Create webhook Response");
console.log(webhook);
}
});
После того, как мы произведем платеж с использованием этих учетных данных, информация о состоянии платежа будет отправлена в конечную точку, которую мы установили.
Пример органа POST, который PayPal отправляет в качестве уведомления, может выглядеть следующим образом, которое было отправлено после успешного платежа PayPal:
{
"id": "WH-9FE9644311463722U-6TR22899JY792883B",
"create_time": "2016-04-20T16:51:12Z",
"resource_type": "sale",
"event_type": "PAYMENT.SALE.COMPLETED",
"summary": "Payment completed for $ 7.47 USD",
"resource": {
"id": "18169707V5310210W",
"state": "completed",
"amount": {
"total": "7.47",
"currency": "USD",
"details": {
"subtotal": "7.47"
}
},
"payment_mode": "INSTANT_TRANSFER",
"protection_eligibility": "ELIGIBLE",
"protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE",
"transaction_fee": {
"value": "0.52",
"currency": "USD"
},
"invoice_number": "",
"custom": "",
"parent_payment": "PAY-809936371M327284GK4L3FHA",
"create_time": "2016-04-20T16:47:36Z",
"update_time": "2016-04-20T16:50:07Z",
"links": [
{
"href": "https:\/\/api.sandbox.paypal.com\/v1\/payments\/sale\/18169707V5310210W",
"rel": "self",
"method": "GET"
},
{
"href": "https:\/\/api.sandbox.paypal.com\/v1\/payments\/sale\/18169707V5310210W\/refund",
"rel": "refund",
"method": "POST"
},
{
"href": "https:\/\/api.sandbox.paypal.com\/v1\/payments\/payment\/PAY-809936371M327284GK4L3FHA",
"rel": "parent_payment",
"method": "GET"
}
]
},
"links": [
{
"href": "https:\/\/api.sandbox.paypal.com\/v1\/notifications\/webhooks-events\/WH-9FE9644311463722U-6TR22899JY792883B",
"rel": "self",
"method": "GET"
},
{
"href": "https:\/\/api.sandbox.paypal.com\/v1\/notifications\/webhooks-events\/WH-9FE9644311463722U-6TR22899JY792883B\/resend",
"rel": "resend",
"method": "POST"
}
]
}
Обновление веб-узла с новым URL-адресом (пример узла)
В этом примере вам будет показано, как обновить существующий URL-адрес пересылки webhook (где уведомления должны быть отправлены POSTED). Чтобы запустить это, вы должны иметь ID, предоставленный PayPal, когда вы впервые создали свои веб-камеры.
Сначала добавьте SDK PayPal и настройте среду (песочница ниже).
var paypal = require('paypal-rest-sdk');
var clientId = 'YOUR APPLICATION CLIENT ID';
var secret = 'YOUR APPLICATION SECRET';
paypal.configure({
'mode': 'sandbox', //sandbox or live
'client_id': clientId,
'client_secret': secret
});
Затем настройте структуру JSON и данные веб-узла. Сначала назначьте идентификатор для своего веб-чек в webhookId . Затем в webhookUpdate укажите операцию замены, укажите path /url для указания обновления этого ресурса и укажите новый URL-адрес, чтобы заменить его value .
var webhookId = "YOUR WEBHOOK ID";
var webhookUpdate = [{
"op": "replace",
"path": "/url",
"value": "https://64fb54a2.ngrok.io"
}];
Наконец, вызовите notification.webhook.replace(...) , передав в webhookId и webhookUpdate .
paypal.notification.webhook.replace (webhookId, webhookUpdate, function (err, res) {if (err) {console.log (err); throw err;} else {console.log (JSON.stringify (res));} });
Если все удастся, то из PayPal должен быть возвращен объект, аналогичный приведенному ниже, и, в случае этого примера, отображаться в терминале с обновленной информацией.
{
"id":"4U496984902512511",
"url":"https://64fb54a2.ngrok.io",
"event_types":[{
"name":"PAYMENT.SALE.DENIED",
"description":"A sale payment was denied"
}],
"links":[{
"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks/4U496984902512511",
"rel":"self",
"method":"GET"
},{
"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks/4U496984902512511",
"rel":"update",
"method":"PATCH"
},{
"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks/4U496984902512511",
"rel":"delete",
"method":"DELETE"
}],
"httpStatusCode":200
}
