PayPal
Webhooks
수색…
매개 변수
| 매개 변수 | 세부 |
|---|---|
| 앱 | Express 애플리케이션 참조 |
| bodyParser | JSON 인코딩 된 본문을 사용하기위한 body-parser 패키지 참조 |
| clientId | 애플리케이션 클라이언트 ID (OAuth 2 자격증 명) |
| http | 서버를 실행하기위한 http 패키지 |
| 페이팔 | PayPal 노드 SDK 참조 객체 |
| 비밀 | 애플리케이션 비공개 (OAuth 2 자격증 명) |
| webhookId | 수정할 웹 훅의 ID입니다. |
| webhookUpdate | 업데이트 할 Webhook 세부 정보를 포함하는 JSON 객체 |
비고
이 샘플은 PayPal 웹 훅을 사용하여 애플리케이션 및 지불에 대한 이벤트 모니터링을 제공하는 방법의 실제 예를 다루고 있습니다.
ngrok 및 Express (노드)를 사용하여 샌드 박스 Webhooks 테스트
이 예제에서는 sandbox에서 webhook 알림을 테스트하고, ngrok 를 사용하여 localhost에서 실행중인 Node HTTP Listener에 대한 터널을 인터넷에 제공합니다. 이 예제에서는 Node를 사용하여 결제 이벤트 (예 : 결제)에 대한 알림 웹 훅을 설정 한 다음 webhook 이벤트에서 들어오는 HTTP POST 메시지를 수신하도록 서버를 설정합니다.
이러한 일이 발생하도록하기 위해 여기에 따라야 할 몇 가지 단계가 있습니다.
- PayPal에서 알림이 될 webhooks에서 들어오는 POST 트래픽을 수신하고 localhost에서 수신 대기하는 간단한 서버를 설정합니다.
- 그런 다음 ngrok를 사용하여 localhost에서 인터넷으로 터널을 제공하면 PayPal에서 알림을 게시 할 수 있습니다.
- 마지막으로 2 단계에서 공개 한 ngrok URI를 제공하여 추적하려는 웹 훅 이벤트에 제공된 애플리케이션의 자격 증명 (제공된 자격 증명을 기반으로)을 구독하십시오.
Webhook Listener 만들기
우리가해야 할 첫 번째 일은 청취자를 만드는 것입니다. 청취자로 시작하는 이유는 웹 후크를 만들거나 업데이트 할 때 웹 후크에 제공하기 위해 ngrok 라이브 URL이 필요하기 때문입니다.
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 포트 3001에서 수신 대기하도록 설정합니다. 이제 트래픽 수신을 시작하기 위해 해당 스크립트를 실행하십시오.
ngrok를 사용하여 리스너를 인터넷에 노출시키기
localhost : 3001에 설정된 리스너를 사용하여 다음 작업은 해당 스크립트를 인터넷에 노출 시켜서 ngrok의 작업 인 트래픽을 보낼 수 있도록하는 것입니다.
터미널 창에서 다음 명령을 실행하십시오.
ngrok http 3001
그러면 포트 3001에서 로컬 호스트에 대한 라이브 터널을 제공하는 프로세스가 시작되고 한 번 실행 된 다음 정보가 제공됩니다.
우리가 볼 수 있듯이, 우리가 localhost에서 실행중인 청취자에게 PayPal 웹 훅을 가리 키기 위해 사용할 수있는 실제 주소는 http(s)://055b3480.ngrok.io 입니다. 청취자를 설치하기 위해 알아야 할 모든 것입니다.
알림 구독
마지막 단계는 애플리케이션 용 웹 훅 (webhook)을 만드는 것입니다.이 앱은 앱에 대한 지불, 환불 등 특정 이벤트가 발생할 때 알림을 생성합니다. 이러한 webhook을 응용 프로그램에 바인딩하기 위해 한 번만 만들어야하므로 사용할 때마다 실행할 필요가 없습니다.
먼저 PayPal 노드 SDK에 대한 요구 사항, 클라이언트 ID / 암호가 애플리케이션 생성에서 추가 된 다음 샌드 박스 환경을 구성하여 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
});
다음으로 webhook을위한 JSON 구조를 설정합니다. webhooks 에는 두 가지 정보, 즉 모든 webhook 이벤트를 보내야하는 url 과 우리가 구독하고자하는 event_types 가 들어 있습니다.
이 샘플의 경우 url 은 Google의 라이브 URL로 설정되며, 수신 대기중인 이벤트는 지불이 완료되거나 거부되는 경우입니다.
전체 이벤트 목록은 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);
}
});
해당 응용 프로그램 자격 증명을 사용하여 지불을하면 지불 상태에 대한 정보가 설정 한 끝점으로 전송됩니다.
PayPal에서 알림으로 전송하는 POST 본문의 예는 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로 Webhook 업데이트 (노드 샘플)
이 샘플에서는 기존 webhook 전달 URL (알림을 게시 할 위치)을 업데이트하는 방법을 보여줍니다. 이를 실행하려면 웹 후크를 처음 만들 때 PayPal에서 제공 한 ID가 있어야합니다.
먼저 PayPal SDK를 추가하고 환경을 구성하십시오 (아래 샌드 박스).
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 구조와 webhook 세부 정보를 설정합니다. 먼저 webhook의 ID를 webhookId 지정하십시오. 그런 다음 webhookUpdate 에서 replace 작업을 지정하고 path 를 /url 로 설정하여 해당 자원의 업데이트를 지정하고 새로운 URL을 제공하여 value 이 webhookUpdate .
var webhookId = "YOUR WEBHOOK ID";
var webhookUpdate = [{
"op": "replace",
"path": "/url",
"value": "https://64fb54a2.ngrok.io"
}];
마지막으로 webhookId 및 webhookUpdate 전달하여 notification.webhook.replace(...) 호출합니다.
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
}
