LINE株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。 LINEヤフー Tech Blog

Blog


LINE Payを使った決済をBotに組み込んでみよう(Node.js版BOTサンプルコードあり)

こんにちは、LINEでDeveloper Advocateをしている中嶋です。今回はNode.jsベースのBotのサンプルコードを使いながら、LINE Payによる決済の仕組みをBotに組み込む方法をご紹介します。

用意するもの

  • LINE PayのSandbox

実際にLINE Payで決済を提供してお金を回収するには加盟店登録が必要ですが、検証目的であれば加盟店登録をせずともSandboxで一通りの機能を試すことができます。Sandboxは下記LINE Payの開発者向けサイトから作成できます。
https://pay.line.me/developers/techsupport/sandbox/creation

  • Message APIのChannel

LINEのBotアカウントを作成するためにMessaging APIのChannelを作成します。この手順については LINEのBot開発 超入門(前編)ゼロから応答ができるまで が参考になると思います。

  • LINE Pay API SDK for Node.js(非公式)

LINE Pay APIをそのまま叩いてももちろん問題ありませんが、Node.js用にSDKを作っておきました。後述のサンプルコードではこのSDKベースでの記述例をご紹介します。
https://github.com/nkjm/line-pay

デモ

こちらのBotのような決済を実装するという前提で話を進めていきます。

ユーザーがBotを友だちに追加して話しかけると、「フル機能を使うにはサブスクリプションの購入が必要です。購入しますか?」とBotから返信があります。購入する旨を伝えると、決済に進むためのリンクがBotから提供されます。そのリンクをクリックしてLINE Payで決済を完了させるとBotのフル機能が使えるようになる、というユースケースです。これをどのように実装していくのか見ていきましょう。

決済の流れ

BotでLINE Pay APIを利用した決済を行う場合、3つの登場人物がいます。User、Bot、そしてPayです。この3者がどのように連携して決済を完了させるのかステップごとに詳しくみていきます。

①購入意思確認
BotはUserと会話しながら、何らかのタイミングでUserから商品・サービス購入の意思を確認します。

購入確認のためのメッセージ

{
  type: "template",
  altText: "You need to purchase subscription to use this Chatbot. It's 1yen/month. Do you want to puchase?",
  template: {
    type: "confirm",
    text: "You need to purchase subscription to use this Chatbot. It's 1yen/month. Do you want to purchase?",
    actions: [
      {type: "postback", label: "Yes", data: "yes"},
      {type: "postback", label: "No Thanks", data: "no"}
    ]
  }
}

②決済予約&決済URL送信
購入意思を確認したらLINE PayのReserve APIにアクセスして決済を予約します。このときに決済する商品、金額、通貨、オーダーID(任意のID)および④で承認通知を受け取るためのconfirmUrlなどを渡します。予約が完了すると決済URLおよびトランザクションIDといった決済進行に必要な情報が返されます。この決済URLをUserに送信します。

決済予約と決済URLの送信

const Pay = require("line-pay");
  
const pay = new Pay({
    channelId: process.env.LINE_PAY_CHANNEL_ID,
    channelSecret: process.env.LINE_PAY_CHANNEL_SECRET
});
  
let reservation = {
    productName: "My product",
    amount: 1,
    currency: "JPY",
    confirmUrl: process.env.LINE_PAY_CONFIRM_URL,
    confirmUrlType: "SERVER",
    orderId: YOUR_ORDER_ID
}
pay.reserve(reservation).then((response) => {
    let message = {
        type: "template",
        altText: "Please proceed to the payment.",
        template: {
            type: "buttons",
            text: "Please proceed to the payment.",
            actions: [
                {type: "uri", label: "Pay by LINE Pay", uri: response.info.paymentUrl.web},
            ]
        }
    }
    return bot.replyMessage(YOUR_REPLY_TOKEN, message);
}).then((response) => {
    console.log("Sent payment URL.");
});

③決済承認
UserはBotから連絡のあった決済URLにアクセスし、決済内容を確認して決済承認をおこないます。

④承認通知
あらかじめ指定したconfirmUrlに対してLINE Payから決済承認の通知がおこなわれます。BotはこのURLに対してWebhookを用意しておき、通知を受け取れるようにしておきます。

通知を受け取るためのWebhook

server.get(YOUR_CONFIRM_URL_PATH, (req, res, next) => {
    //通知を受けた後の処理
});

⑤決済実行
BotからLINE PayのConfirm APIにアクセスして決済を実行します。成功すればこの時点でUserの残高から引き落としが行われます。

決済実行

let confirmation = {
    transactionId: YOUR_TRANSACTION_ID, // confirmUrlに通知されます
    amount: YOUR_ORDER_AMOUNT, // 予約時にDBやセッションに保管しておき、それを参照します
    currency: YOUR_ORDER_CURRENCY, // 予約時にDBやセッションに保管しておき、それを参照します
}
return pay.confirm(confirmation).then((response) => {
    res.sendStatus(200);
    let messages = [{
        type: "sticker",
        packageId: 2,
        stickerId: 144
    },{
        type: "text",
        text: "Congratulations! Now your chatbot is fully functional."
    }]
    return bot.pushMessage(USER_ID, messages);
}).then((response) => {
    console.log("Sent message.");
});

⑥機能提供
Botが有償の機能やサービスをUserに提供します。

どのようなタイミングで決済を開始するのか、決済完了後にどうするのかは開発者次第です。自身のBotのユースケースにフィットする挙動を実装してください。

サンプルコード

上記のデモを動作させるためのサンプルコードを公開しています。git cloneしていただき、REAMDEにしたがって設定いただければお手元で動作させることができるはずです。
https://github.com/nkjm/line-pay-in-bot

さらに詳しく

LINE developersコミュニティではSlackで開発者同士のコミュニケーション、Q&Aをおこなっています。今回のPay APIについてご興味があればぜひSlackで情報交換しましょう。近々LINE Pay APIの勉強会も開催しようと計画しています。そちらもSlackでアップデートしていきますのでよければ下記URLよりご参加ください。

LINE developersのSlackへ参加:https://goo.gl/iQJjSQ