PayPal
Webhooks
サーチ…
パラメーター
| パラメータ | 詳細 |
|---|---|
| アプリ | Expressアプリケーションのリファレンス |
| bodyParser | JSONエンコードされたボディを操作するbody-parserパッケージリファレンス |
| クライアントID | アプリケーションクライアントID(OAuth 2の認証情報) |
| http | サーバーを実行するためのhttpパッケージ |
| ペイパル | PayPalノードSDK参照オブジェクト |
| 秘密の | アプリケーションの秘密情報(OAuth 2の認証情報) |
| webhookId | 修正するウェブフックのID |
| webhookUpdate | 更新されるwebhookの詳細を含むJSONオブジェクト |
備考
これらのサンプルは、PayPalウェブフックを使用してアプリケーションと支払いのイベント監視を提供する方法の実例をカバーしています。
ngrokとExpress(ノード)を使用したサンドボックスWebhookのテスト
この例では、サンドボックスでwebhook通知をテストし、 ngrokを使用して、localhostで実行されているNode HTTPリスナーのトンネルをインターネットに提供する方法を見ていきます。この例では、ノードを使用して支払いイベント(支払いが行われているなど)の通知ウェブフックを設定し、WebhookイベントからのHTTP POSTメッセージを受信するようにサーバーを設定します。
これを実現するためにここに従うべきいくつかのステップがあります:
- Webhooksからの着信POSTトラフィックを聞くためのシンプルなサーバーを設定します。これはPayPalからの通知であり、localhostでのリスニングを開始します。
- その後、ngrokを使用してローカルホストからインターネットへのトンネルを提供し、PayPalが通知を送信できるようにします。
- 最後に、(提示された資格情報に基づいて)私たちが追跡したいwebhookイベントにアプリケーションを登録し、ステップ2のpublic ngrok URIを提供します。
Webhooksリスナーの作成
まず、リスナーを作成する必要があります。リスナーを開始する理由は、webhooksを作成または更新する際に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 webhookを指すために使用できるライブアドレスは、 http(s)://055b3480.ngrok.ioです。リスナーを設定するには、それだけで十分です。
通知を購読する
私たちの最後のステップは、私たちのアプリケーション用のウェブフックを作成することです。これは、私たちのアプリで支払いや払い戻しなどのイベントが発生したときに通知を作成します。これらの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
});
次に、webhooksのJSON構造を設定します。 webhooksは、2つの情報、すべての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(通知をPOSTする場所)を更新する方法を説明します。これを実行するには、最初にウェブフックを作成したときに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構造とウェブフックの詳細を設定します。ためにあなたのウェブフックのためのIDを割り当てwebhookId最初。次に、 webhookUpdateでreplaceの操作を指定し、 /urlへのpathを設定してそのリソースの更新を指定し、新しいURLを指定してそのvalue下に置き換えvalue 。
var webhookId = "YOUR WEBHOOK ID";
var webhookUpdate = [{
"op": "replace",
"path": "/url",
"value": "https://64fb54a2.ngrok.io"
}];
最後に、 webhookIdとwebhookUpdateを渡して、 notification.webhook.replace(...)をwebhookUpdateます。
JSON.string(JSON.stringify(res));} {if(err)};}}}}}} });
すべて成功した場合は、次のようなオブジェクトを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
}
