この記事では、SalesforeからLineにメッセージを送る方法をご紹介します。
APIを利用して送ること自体はそんなに大変ではないですが、送るための情報を取得する仕組みや、そのためのSalesforce側の設定は少しコツが必要なので、具体的に解説しています。
Calloutのためのリモートサイトの設定
まずはSalesforceのApexからLineのMessagingAPIを呼べるようにセキュリティの設定を行っておきます。
Salesforceの管理コンソールの「設定」→「リモートサイトの設定」で、LineAPIのURLを登録して、Calloutできるように許可しておきます。
Webhookの設定
次に行うのは、前回の記事にも出てきた、Webhookの設定です。
メッセージ送信を行うLine@アカウントへの友達の申請やメッセージ送信のたびにそのURLにJSONがPOSTされるのでしたね。
そのため、Line側から呼べるURLになっていなければいけません。ここが少しコツのいる部分です。
通常、Salesforce上でApexでWebサービスのエントリポイントを作った場合、それを呼ぶにはログインが必要です。
しかし、Line側はSalesforceのログインIDは知りませんから、ログインできません。
つまり、ログインしないでも呼び出し可能なWebサービス(Webhook)を作成して公開する必要があります。
ApexでWebサービスを作って、匿名呼び出しも可能なように公開する設定については、長くなるので、こちらの記事で詳しく説明しておきます。
Webhook自体はシンプルなものです。下記のようなWebサービスを作成し、上記記事を参考に、匿名で公開しましょう。
@RestResource(urlMapping='/line_webhook_callback') global with sharing class LineWebHookCallback { static String LINE_GET_PROFILE_URI = 'https://api.line.me/v2/bot/profile/'; static String CH_ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxx'; @HttpPost global static Map<String,String> doPost(){ RestRequest req = RestContext.request; RestResponse res = RestContext.response; System.debug('★★req.requestBody.ToString(): ' + req.requestBody.ToString()); Map<String, Object> callbackParams = (Map<String, Object>)JSON.deserializeUntyped(req.requestBody.ToString()); List<Object> resultParams = (List<Object>)callbackParams.get('events'); for (Object obj : resultParams) { Map<String, Object> params = (Map<String, Object>)obj; String eventType = (String)params.get('type'); MapsourceParams = (Map<String, Object>)params.get('source'); if( eventType == 'follow' ){ String sourceType = (String)sourceParams.get('type'); String userId = (String)sourceParams.get('userId'); }else if( eventType == 'message' ){ String sourceType = (String)sourceParams.get('type'); String userId = (String)sourceParams.get('userId'); } Contact newCt = new Contact(); newCt.LastName = displayName; insert newCt; } Map m1 = new Map<String, String>(); m1.put('result', 'success'); return m1; } }
https://<サイトURL>/services/apexrest/line_webhook_callback
で呼び出せます。
公開まで出来たら、Line DevelopersのWebhookのところに上記URLを設定します。これで、メッセージが送信された時などにこのURLの情報がPOSTされます。
「userId」という項目を取得してとりあえず取引先に保存していますが、これが、メッセージをPushAPIなどで送信する際にToに設定するIDになります。スマホの設定で確認できるLineのIDではなく、MIDと呼ばれるLine内部の識別子なので、注意してください。
また、このMIDはユーザごとに一意ではありません。
Line@アカウントが異なれば、同じLineユーザであっても識別するMIDが異なるので、Bot(Line@アカウント)ごとに友達申請してもらって、取得する必要があります。
友達追加
ここで、友達追加をしてもらう方法をメモしておきます。
LINE@MANAGERの「アカウント設定」→「基本設定」に、QRコードや友達追加ボタンのコードがあるので、サイトに貼り付けたりすると、簡単にこのLine@アカウントを追加できます。
メッセージ送信(Push API)
HttpRequest req = new HttpRequest(); req.setHeader('Content-Type', 'application/json'); req.setHeader('Authorization', 'Bearer '+ CH_ACCESS_TOKEN); req.setEndpoint(LINE_PUSH_URI); req.setMethod('POST'); req.setBody('{"to": "取得したuserId(MID)","messages":[{"type":"text", "text":"Hello, world"}, { "type":"text", "text":"ハロー、ワールド" } ]}'); Http http = new Http(); HTTPResponse res; try { res = http.send(req); System.debug('★★★HTTP Response Code: ' + res.getStatusCode()); System.debug('★★★Response Body: ' + res.getBody()); } catch (Exception e) { System.debug('★★★★Callout Error:' + e.getMessage()); }
なお、APIのドキュメントは
https://devdocs.line.me/ja/
を参考にしましょう。