API Gateway + Lambdaを使ってWebhookのエンドポイントを1箇所にしつつその後の処理を開発者ごとに振り分ける方法

Webpayやstripeにはwebhookの仕組みがあります。

大変便利な仕組みなのですが、開発途中ではWebpayやstripeのテストモードを使うことになるかと思いますが、こういったケースでは往々にして以下のような制約が発生するかと思います。

  • 同じシークレットキーをベースに複数の開発者のマシンからAPIをたたくようになる
  • テスト環境のWebhookとして指定できるエンドポイントは1つだけ

webhookを受け取った際に、自分のマシンからAPI叩いたデータか、他のマシンからAPI叩いたデータ化を判別して上げる必要が出てきます。

Webpayの場合はmetadataを付与することができなかったため実現できませんでしたが、stripeの場合はcustomerごとにmetadataを付与することができるので、ここで判別して処理を振り分けてあげればよさそうです。

WebhookのエンドポイントとしてはAPI Gateway + Lambdaを使って1つに集約して、そこの中で振り分け処理を行いそれぞれ別のDBに対して操作するなり、キューを発行してあげるなりしてやればよいかなと思います。

var stripe = require("stripe")(
    "your secret key"
);
stripe.setApiVersion('2016-07-06');

/**
 * メタデータを取得するためのcustomerIdを取得
 * @param object
 * @returns {*}
 */
function getCustomerId(object) {
    var customerId;
    if (object.object != "customer") {
        customerId = object.customer;
    } else {
        customerId = object.id;
    }
    return customerId;
}

exports.handler = function (event, context) {
    var eventId = event.id;
    var data = event.data;
    var livemode = event.livemode;

    if (data) {
        var customerId = getCustomerId(data.object);
        if (customerId) {
            if (!livemode) {
                //テスト環境
                stripe.customers.retrieve(customerId, function (err, customer) {
                    if (err) {
                        console.log(err, err.stack);
                        context.fail(err);
                    } else {
                        console.log(customer);
                        var metadata = customer.metadata;
                        //メタデータの中にマシン名を入れるなりしてここで判別処理をもろもろ行う
                        context.success("success")
                    }
                });
            }
        }
    }
};