この記事では、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');
Map<string, object=""> sourceParams = (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<string, string=""> 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/」
を参考にしましょう。