はじめに
こんにちは!shiroです(^o^)/
みなさん、SalesforceからSMSを送信したことはありますか??
私はないです\(^o^)/
というわけで、今回はSalesforceからSMSLINKのAPIに接続してSMSを送信してみようと思います🏁
Salesforce開発を始めたばかりのエンジニアさんで外部サービス連携してみたい方や、
営業活動の効率化・生産性向上に興味のある方の参考になりますと幸いです!
※ 現在はSMSに加えメールと印刷発送もできる CPaaS NOW が主流です 👉[リファレンス]
ゴール 🏁
Salesforceの取引先責任者(Contact)画面から、SMSLINKのAPIを経由して、ボタン1つでSMSを送信できる状態を作ります!
【全体像】
To Do
- STEP0 ▌ 事前準備(開発環境を整える)
- STEP1 ▌ External Credential(外部ログイン情報)の作成
- STEP2 ▌ 権限セットを割り当てる
- STEP3 ▌ Named Credential(指定ログイン情報)の作成
- STEP4 ▌ Apex実装(SMS送信APIコールアウト)
- STEP5 ▌ LWC (Lightning Web Components) 実装
- STEP6 ▌ レコードページ配置
- STEP7 ▌ テスト送信(SMSLINK側で確認)
STEP0 ▌ 事前準備(開発環境を整える)
■ SMSLINK① 利用登録
アカウントがない人は作ってもらうところから!
👉 SMSLINK公式サイト
- 初期費用や月額固定費がない(送信件数に応じた従量課金)ので比較的ハードルは低め?👀
■ SMSLINK② APIトークンを取得する
Salesforceに登録するAPIトークンを事前に確認しておきます!
■ Salesforce① 開発環境へサインアップ
今回はSFが学習用に提供してくれている無償プラットフォームを使います!
下記リンクから画面に従ってSalesforce Developer Edition(DE)のアカウントを発行します💪
■ Salesforce② CLI (sf/sfdx)を使えるようにセットアップ
-
Salesforce CLI のダウンロード
※ 最新バージョンのコマンドはsfコマンドですが、今回は旧バージョンのsfdxコマンドで作成してうまくいったためそのまま書き出していますbrew install sf # バージョン確認できればインストール完了! # @salesforce/cli/2.105.6 darwin-arm64 node-v24.8.0 みたいな結果が返ってくる sf --version sfdx --version
-
組織を認証する
# 以下コマンドの実行でブラウザが自動で開くので、先ほど作成したDEアカウントでログイン sfdx auth:web:login -r https://login.salesforce.com -a dev-ed # 認証後、組織の一覧を確認、dev-ed という名前で組織が登録されていればOK sf org list # ┌──┬────────┬──────────────────────────────────┬────────────────────┬───────────┐ # │ │ Alias │ Username │ Org Id │ Status │ # ├──┼────────┼──────────────────────────────────┼────────────────────┼───────────┤ # │ │ dev-ed │ ********@agentforce.com │ ****************** │ Connected │ # └──┴────────┴──────────────────────────────────┴────────────────────┴───────────┘
STEP1 ▌ External Credential(外部ログイン情報)の作成
このステップではSMSLINKの認証に使う情報(トークン等)をSalesforce側で管理できるように設定していきます!
⭐️ External Credential(外部ログイン情報)とは?
外部サービスに接続するための認証情報の入れ物(コンテナ)です。
このコンテナの中にPrincipal(プリンシパル)という単位の箱を作り、実際の認証情報(APIキー/トークン等) を保管しておきます
- 「設定」を開く
- 検索窓で「指定ログイン情報」を検索して開く
※「指定ログイン情報」の項目はサイドバーの「セキュリティ」タブからも開けます - 「外部ログイン情報」のタブを開き、接続情報を登録する
- 表示ラベル:SmsLinkToken
- 名前:SmsLinkToken
- 認証プロトコル:カスタム
- 画面をスクロールして「プリンシパル」を開き、SMSLINKのAPIトークンを登録
※ プリンシパル:外部サービスに接続する際の個々の認証情報(ユーザー名/トークン情報など)を書く- パラメーター名:testtoken
- 連番:1
- 認証パラメーター:「追加」をクリック
- 認証パラメーター1
- 名前:token ← トークンのkey名を書き込みます
- 値:******************** ← STEP0で取得したAPIトークンを貼り付け
- 認証パラメーター1
これで認証情報の設定は完了です!
STEP2 ▌ 権限セットを割り当てる
このステップでは、先ほど作った External Credential の Principal をユーザーが使えるように、権限の設定をしていきます!
⭐️ 権限セット とは?
Salesforceでは設定値を登録しただけではまだその設定を使えません。
権限セットという箱の中に 設定値の箱を入れることで、その設定値を実行したり、参照、利用する許可をしておく必要があります。
またこの時、「誰に許可するか」という設定も必要です。
ここでは、External Credential の Principal を権限セットの箱に入れ込み、APIを使わせたいユーザーとの紐付けを行います!
- まずは「権限セット」を作成
- 作成した「権限セット」にSTEP1で作成した Principal を追加
- 最後に、この「権限セット」を使うことのできるユーザーを選択
※これをやらないと「権限不足エラー」になるため注意!
これで権限の設定は完了です!
🏆 shiroは トークンの利用権限 をてにいれた!
STEP3 ▌ Named Credential(指定ログイン情報)の作成
このステップではSMSLINKへの接続情報を具体的に設定していきます!
⭐️ Named Credential(指定ログイン情報) とは?
外部サービスの「接続先(URL)」と、その接続先で使う「認証情報(External Credential)」の紐付けルールを定義するものです。
※ ApexではURLを直接書かず、callout:<指定ログイン情報名>を使ってAPIを呼び出します(【STEP4】のコード参照)。
External Credential と設定情報を分けて保管することで、
・URLに変更があれば Named Credential だけ変更
・トークン変更があれば External Credential だけ変更
といった形で、セキュリティと運用性を両立できるわけですね!
- 「指定ログイン情報」のタブを開く
- 「新規」ボタンをクリックし、「新規指定ログイン情報」を登録する
※ 旧仕様UIでは「カスタムトークン」が使えないため、新仕様の項目を利用します- 表示ラベル:SmsLinkDev
- 名前:SmsLinkDev
- URL:https://********************* ←api接続したいリンク
- 認証
- 外部ログイン情報:SmsLinkToken ← ここで【STEP1】で作成したExternalCredential(外部ログイン情報)を選択
- コールアウトオプション
- 認証ヘッダーを生成:チェックそのままでOK
- HTTPヘッダーの数式を許可:チェックを入れる
- カスタムヘッダ-の項目で「新規」をクリックして2つのヘッダーを設定する
- tokenの設定
- 名前:token
- 値:
{!$Credential.SmsLinkToken.token} - 連番:1
- acceptの設定
- 名前:Accept
- 値:
application/json - 連番:2
これでログイン情報の設定も完了しました!
あとは誰がどこで使えるのかを設定すれば Apex でcalloutが使えるようになります!
STEP4 ▌ Apex実装(SMS送信APIコールアウト)
このステップでは、Apex を使ってSMSLINKのAPIを呼び出す処理を実装していきます!
⭐️ Apex とは?
Salesforceが提供している独自のプログラミング言語です。
Salesforceのサーバーからデータを取得したり、外部サービスのAPIを呼び出すことができます。
ここでは、SalesforceからSMSLINKのAPIを呼び出して、SMSを送信できるように作り込んでいきます。
SMSLINK の送信 API に対して、電話番号と SMS本文をJSON形式で送信しています。
-
設定のサイドメニューの「カスタムコード」から「Apexクラス」を選択する
-
「新規」を開く
-
ウィンドウに以下を貼り付け、実装する
※認証に必要なAPIトークンは、Named / External Credential の設定によりHTTPヘッダーに自動付与されるため、コードには直接記述しません。public with sharing class SmsLinkService { @AuraEnabled public static String sendSms(String phone, String message) { HttpRequest req = new HttpRequest(); req.setEndpoint('callout:SmsLinkDev/v1/messages'); req.setMethod('POST'); req.setHeader('Content-Type', 'application/json'); req.setBody(JSON.serialize(new Map<String, Object>{ 'to' => phone, 'body' => message })); Http http = new Http(); HttpResponse res = http.send(req); if (res.getStatusCode() >= 200 && res.getStatusCode() < 300) { return res.getBody(); } throw new AuraHandledException('SMS送信失敗: ' + res.getStatus() + ' ' + res.getBody()); } }
これで、電話番号とメッセージさえ受け取れればSMS送信できる状態になりました!
あとは送信ボタンの作り込みのみ…!
STEP5 ▌ LWC (Lightning Web Components) 実装
このステップでは、Apex の処理を呼び出すUIを作っていきます!
⭐️ LWC (Lightning Web Components) とは?
Salesforce 上で動くフロントエンドのコンポーネント技術です。
画面(HTMLのUI)、処理(JavaScriptのロジック)、配置設定(メタ情報:公開設定や対象ページ)の3つのファイルで1つのコンポーネントを構成します。
今回は以下の3ファイルを作ります!
- smsSendAction.html
- smsSendAction.js
- smsSendAction.js-meta.xml
-
smslnk-uiプロジェクトを作成する
sfdx force:project:create -n smslink-ui cd smslink-ui # Developer Edition(本番ドメインなら login.salesforce.com) sfdx auth:web:login -r https://login.salesforce.com -a dev-ed # ブラウザが開く → DE org でログイン → 許可 # コンポーネントの雛形を作成する sf lightning generate component --name smsSendAction --type lwc --output-dir force-app/main/default/lwc -
リポジトリ内に自動生成された3つのファイルに、それぞれ以下を記述
smsSendAction.html<template> <lightning-card title="SMS送信"> <div class="slds-p-around_medium"> <lightning-input label="電話番号" value={phone} onchange={handlePhone}></lightning-input> <lightning-textarea label="本文" value={body} onchange={handleBody}></lightning-textarea> <lightning-button variant="brand" label="送信" onclick={handleSend}></lightning-button> </div> </lightning-card> </template>smsSendAction.jsimport { LightningElement, track } from 'lwc'; import sendSms from '@salesforce/apex/SmsLinkService.sendSms'; import { ShowToastEvent } from 'lightning/platformShowToastEvent'; export default class SmsSendAction extends LightningElement { @track phone = ''; @track body = ''; handlePhone(e) { this.phone = e.target.value; } handleBody(e) { this.body = e.target.value; } async handleSend() { try { await sendSms({ phone: this.phone, message: this.body }); this.dispatchEvent(new ShowToastEvent({ title: '成功', message: 'SMS送信しました', variant: 'success' })); } catch (e) { this.dispatchEvent(new ShowToastEvent({ title: '失敗', message: e.body?.message || e.message, variant: 'error' })); } } }smsSendAction.js-meta.xml<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata"> <apiVersion>61.0</apiVersion> <isExposed>true</isExposed> <targets> <target>lightning__RecordPage</target> </targets> <targetConfigs> <targetConfig targets="lightning__RecordPage"> <objects> <object>Contact</object> </objects> </targetConfig> </targetConfigs> </LightningComponentBundle> -
ファイルを保存したらデプロイ!
sf project deploy start --source-dir force-app/main/default/classes -o dev-ed sf project deploy start --source-dir force-app/main/default/lwc/smsSendAction -o dev-ed
これでSalesforce上にSMS送信ボタンが設置できる状態になりました!
STEP6 ▌ レコードページ配置
このステップでは、先ほど作成したSMS送信ボタンを実際の画面上に設置していきます!
-
SMS送信 のアクションを作成する
(1). 設定のサイドメニューの「オブジェクトおよび項目」から「オブジェクトマネージャー」を選択する
(2). 右上検索窓で「取引先責任者(Contact)」を検索して選択
(3). 左メニュー 「ボタン、リンク、およびアクション」を開き、「新規アクション」をクリック
(4). 以下の設定をして保存- アクションの種類:Lightning Web コンポーネント
- Lightning Web コンポーネント:smsSendAction を選択
- 表示ラベル:SMS送信(任意)
- 名前:SendingSMS
-
取引先責任者画面のレイアウトへ設置できる項目として追加
(1). サイドメニューの「ページレイアウト」を開き、「Contact Layout」を選択する
(2). 「Contact Layout」セクション内の「モバイルおよび Lightning のアクション」を選択
(3). 作成した SMS送信 のアクションをドラッグ&ドロップで「モバイルおよび Lightning Experienceのアクション」 セクションに保存 -
取引先責任者を用意する
(1). 設定画面のメニューから「セールスコンソール」を開く
(2). グローバルアクションから「新規取引先責任者」を開く
(3). 適当な名前を入力して保存する -
取引先責任者画面に先ほど追加したSMS送信アクションを設置する
(1). 取引先責任者画面を開き、作成した責任者を選択して開く
(2). 設定メニューを開き、「ページを編集」をクリックする
(3). 編集画面に移行したら、サイドバーのカスタム項目から、「smsSendAction」をドラッグ&ドロップで、責任者画面に配置して「保存」
(4). 「有効化」をクリックし、「組織のデフォルトとして割り当て」をクリック
(5). 「デスクトップおよび電話」を選択して「完了」をクリック
(6). 念のためもう一回「保存」をクリック取引先責任者の画面に戻ってみると、SMS送信用のフォームがちゃんとできている

STEP7 ▌ テスト送信(SMSLINK側で確認)
つまずいたポイントまとめ
◼︎ デプロイが失敗した
- デプロイコマンド実行時、
-o dev-edを付けなかったことでエラーが出てしまいました
◼︎ tokenがコード内に展開できない
- External Credentialで設定したtokenが、Named Credentialの設定で、Apexコードに展開される想定が、値が渡される気配がなく原因特定に数日かかりました
-
{!$Credential.token}で変数にtokenを渡せる想定だった…。 -
結論として、tokenを格納しているExternal Credentialのコンテナ名の記載まで必要だったようです
-
参考:【SF公式Help】Use API Keys in Custom Headers with Named Credentials
-
◼︎ SMSが送信できなかった
- External / Named Credential の設定値に不備がないか指差し確認!
- 権限不足、権限セットの割当忘れがないか確認!
さいごに
先輩が丁寧に手引きを作ってくれたので、なんとかSMS送信するところまでこぎつけました!
が、External CredentialとNamed Credentialの存在意義が理解できなかったことで、
作業内容が腑に落ちなかったために、全体の構造理解にかなり難航しました汗
改めて、Salesforceは必要な学習範囲が広く奥も深いことが分かりました🥹
専門のエンジニアがいるのが本当頷けます。すごい。
ところで当方お勉強チーム、なんと社内にSalesforceの専門エンジニアがいたことに今さら気が付きました…!!(知らなかった…!)
次回は専門家様にアドバイスいただきつつ、うまくいかなった部分の整理や、配信予定日時UI改善、配信履歴管理ができるのかなどを深堀り予定です(๑•̀ㅁ•́๑)9
最後まで読んでくださり、ありがとうございました!
また読みに来ていただけると嬉しいです(ㆁωㆁ*)
もっと他の記事も読んでみたい方
当社に興味がある方はこちら👀













