SalesforceでLineのMessaging(PUSH)APIを使ってみる

この記事では、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/」

を参考にしましょう。