前言
A2Billing 是目前社群開發最熱門的計費系統套件,因為是開放原始碼授權所以可以合法免費使用。
本篇主要在是教導如何使用這套件,若還沒完成安裝的朋友,請先前往閱讀 A2Billing 安裝篇。
初始化設定
系統在完成安裝後,第一個所要做的設定有:
// FreePBX UI > Trunks
新增 Outbound Trunk,本篇以 Voxalot 為例。
Outgoing Settings
Trunk Name = voxalot
host=us.voxalot.com
username=<sip_number>
fromuser=<sip_number>
secret=<sip_pass>
fromdomain=voxalot.com
nat=yes
insecure=port,invite
qualify=yes
canreinvite=yes
dtmfmode=auto
disallow=all
allow=ulaw&alaw
type=peer
context=from-trunk
新增 Inbound Trunk,這個主要在展示國際電話卡及 DID 轉接的應用,本篇以 iptel 為例。
Outgoing Settings
Trunk Name: iptel
username=<sip_username>
type=friend
secret=<sip_pass>
qualify=yes
insecure=port,invite
host=iptel.org
fromuser=osslab
fromdomain=iptel.org
context=a2billing
Register String: <sip_username>:<sip_pass>@iptel.org/<sip_number>
注意:context 必須是 a2billing
// A2Billing Admin UI > Trunk > Create Provider
provider name = VOXALOT_PROVIDER
description = Voxalot Provider
// A2Billing Admin UI > Trunk > Add Trunk
voip-provider = VOXALOT_PROVIDER
label = VOXALOT_TRUNK
add prefix = 空白
provider tech = SIP
provider ip = voxalot
status = Active
TIPs:
provider ip 必須與 FreePBX 的 trunk name 相同
// A2Billing Admin UI > Ratecard > Create call plan
name = VOXALOT_CALLPLAN
remove inter prefix = YES
TIPs:
remove inter prefix = YES 若撥號有包含 00 或 011 開頭的國際冠碼,在套用 ratecard 的規則前會被去除。
// A2Billing Admin UI > Ratecard > Create new ratecard
tariffname = VOXALOT_RATECARD
trunk = VOXALOT_TRUNK
description = through voxalot trunk
// A2Billing Admin UI > Ratecard > Add Rate
ratecard = VOXALOT_RATECARD
dialprefix = 1800
destination = US-Tollfree
buying rate = 1
buyrate min duration = 6
buyrate billing block = 6
selling rate = 1.5
sellrate min duration = 60
sellrate billing block = 60
trunk = VOXALOT_TRUNK
TIPs:
* dialprefix 若撥號規則符合,會以此費率計算
* destination 用來敘述此費率的區域
//新增 rate 後要再回到 call plan 將 rate card 加入到 call plan
A2Billing Admin UI > Ratecard > List Call Plan > Edit: VOXALOT_CALLPLAN
ratecard = 選擇 VOXALOT_RATECARD, Add Ratecard
應用一:國際電話卡模式
客戶操作流程:
① 使用手機或一般電話機撥打系統號碼(Access Number)
② 語音提示:輸入電話卡號+#
③ 語音提示餘額,輸入目的地電話號碼(00+國碼+區碼+電話號碼+#)
// A2Billing Admin UI > Customers > Create Customers
card number = <隨機產生>
card alias = <隨機產生>;web 登入帳號
webui password = <隨機產生>;web 登入密碼
balance = 50.0;不可為零,且必須以 USD 計算
call plan = VOXALOT_CALLPLAN
activated = YES
simultaneous access = INDIVIDUAL ACCESS
card type = PREPAID CARD
country = TAIWAN
sip account = NO
iax account = NO
實際操作:
因為本篇實做是以 iptel 的號碼作為系統號碼,所以用其他 IPTel 帳號撥入系統號碼,系統會提示語音:請輸入 card number,將剛剛新增的卡號輸入,完成後按#,若正確,系統會提示餘額及可用通話時間,並提示:請輸入目的地電話號碼,將完整電話號碼 011 + 國碼 + 區碼 + 電話號碼 輸入,完成後按#。
TIPs:
* 新增電話卡(Customer),有一些主要的設定,例如 card number, card alias, password,這些是由系統隨機產生,且沒有任何規則,hacker 無法事先計算出這些資訊。
* 附加在 card number 的 另一組代號 alias,這個號碼或 email 地址都可以用來登入用戶的網頁,密碼就是 webui password。
* 若用戶撥號時有加 00,請注意 Call Plan 的 REMOVE INTER PREFIX 建議設為 YES,以避免 outbound 路由錯誤。
應用二:DID 轉接業務
A2Billing 提供 DID 接駁至經由 outbound trunk 的外部號碼、SIP URI、
// A2Billing Admin UI > DID > Add DID Group
name = DID TWN
// A2Billing Admin UI > DID > Add DID
DID = 99474
billing = only dialout rate
DID group = DID TWN
country = TAIWAN
activated = YES
monthly rate = 0
// A2Billing Admin UI > Customers > Create Customers
balance = 50.0
call plan = VOXALOT_CALLPLAN
didgroup = DID TWN
activated = YES
card type = PREPAID CARD
country = TAIWAN
sip account = NO
iax account = NO
設定轉接的目的號碼,可以透過 Admin UI 或 Customer UI 來作
客戶自行購買 DID 號碼
// A2Billing Customer UI > DID
select country = TAIWAN
select virtual phone number = 99474
voip call = NO
destination = 8864123456
TIPs:
* select country 這裡內容會與 DID 的 country 相同
* 若沒有出現 DID number 可選擇,請檢查所登入的 customer 帳號的 DIDGROUP 是否正確
* voip call 若是 NO,輸入外部的 PSTN/SIP 號碼;若是 YES,輸入 SIP URI。
管理員分配 DID 號碼給指定的客戶
// A2Billing Admin UI > INBOUND DID > Destination
destination = 8864123456
customer ID = 選擇適當的 customer
DID = 選擇適當的 DID
activated = yes
validated = 皆可
voip_call = no
TIPs:
* voip call 若是 NO,輸入外部的 PSTN/SIP 號碼;若是 YES,輸入 SIP URI。
* 若需 DID 接入內部分機號碼(不經過 A2B 的 trunk),可以這樣設
-- destination = Local/101@from-internal (適用 FreePBX 的分機 101)
-- destination = SIP/123456 (適用 A2Billing card number 123456)
-- voip_call = yes
* 如果 destination number 要走 A2B 的 trunk,不管該 trunk 是 SIP 或 Zaptel,voip_call 必須是 no。
相關文章連結:
應用三:預付制、月付制會員模式
用戶操作流程:
① 用戶使用 X-Lite 或 ATA 設備透過網路註冊為分機。
② 直接撥目的地電話號碼,例如 886+XXXXXXXX,886 是國碼。
過程中不會有任何額外的提示音,就像一般的 SIP 分機操作相同。
// A2Billing Admin UI > Customers > Create Customers
card number = <隨機產生>
card alias = <隨機產生>;web 登入帳號
webui password = <隨機產生>;web 登入密碼
balance = 50.0;不可為零,且必須以 USD 計算
call plan = VOXALOT_CALLPLAN
activated = YES
simultaneous access = INDIVIDUAL ACCESS
card type = PREPAID CARD
country = TAIWAN
sip account = YES
iax account = YES
TIPs:
* 這裡與(應用一)模式設定相同,只差在 sip/iax account 為 YES。
* 新增 customer 後,要 reload Asterisk 後,SIP 用戶端才能註冊使用。
// 取消 "輸入目的地號碼" 及其他提示音
// A2Billing Admin UI > System Settings > Global List
如果這裡的所有項目沒有 GROUP 為 agi-conf2 的(可善用 GROUP 搜尋功能),請先前往 Add agi-conf > CREATE AGI-CONF2。
回到 Global List 找到 GROUP 為 agi-conf2 且 KEY/VALUE 按以下所述修改:
use_dnid = yes
這個SIP帳號除了要撥外部的路由外,如果還要撥內部的其他 SIP 分機號,需要繼續下面的修改:
sip_iax_friends = yes
sip_iax_pstn_direct_call_prefix = 555
sip_iax_pstn_direct_call = yes
※是否要提示餘額的語音
say_balance_after_auth = no
say_timetocall = no
如果電話不通,不要提示輸入目的地號碼的語音
number_try = 1
TIPs:
* 參數說明:
- Use DNID : YES 表示使用 DNID,並且不會提示 輸入目的地電話號碼的語音
- SIP Call = yes, SIP Call Prefix, Direct Call: 這三個參數是用來使 SIP 註冊帳號後,也能撥其他分機號碼,撥法為 555+SIP Extension
- Say Balance After Auth: 認證後是否提示餘額
- Say Duration: 是否提示剩餘通話時間
- 另一種比較快速的設定是:play_audio = no, use_dnid=yes, number_try=1。
//為此模式新增 dialplan
//編輯 /etc/asterisk/extensions_a2billing.conf,在底下加入:
[custom-a2billing-sipclient]
exten => _X.,1,Answer
exten => _X.,n,Wait(1)
exten => _X.,n,deadAGI(a2billing.php|2)
exten => _X.,n,Hangup
// 在 A2Billing 套用新增的 dialplan
// A2Billing Admin UI > Customer > VoIP Settings
找到 SIP 分機項目,按編輯
Context = custom-a2billing-sipclient
// 最後,執行指令套用所有的修改
# asterisk -rx "reload"
TIPs:
由於版本 1.7.x 的 bug 關係,在 UI 做完操作後,並不會同步修改 asterisk 的設定檔,所以請依照方式作手動修改:
編輯 /etc/asterisk/additional_a2billing_sip.conf ,修改 context 的內容。
要避免每次都要作手動修改,可以參考 F.A.Q 的方法。
應用四:整合 FreePBX 的應用
用途:FreePBX 的分機用戶,在 Outbound Calling 時可以透過 A2Billing 來計費,但其他原有PBX的功能都不會有影響。
// 編輯 /etc/asterisk/extensions_custom.conf
[macro-dialout-trunk-predial-hook]
exten => s,1,GotoIf($["${OUT_${DIAL_TRUNK}:4:4}" = "A2B/"]?custom-freepbx-a2billing,${OUTNUM},1:2)
exten => s,2,MacroExit
[custom-freepbx-a2billing]
exten => _X.,1,DeadAGI(a2billing.php,${OUT_${DIAL_TRUNK}:8})
exten => _X.,n,Hangup()
// FreePBX UI > Trunks > Add Custom Trunk
Custom Dial String = A2B/2
Tips:
2 代表是 agi-conf 2
// FreePBX UI > Outbound Routes
自行設定需要的參數,並導向剛剛的 Trunk。
// FreePBX UI > Extensions
在需要計費的分機設定裡,參數 accountcode 填入 A2Billing 的 Card Number。
Tips:
分機在外撥的路由規則,除了 outbound route 外,還要考慮 A2Billing 的,也就是 RATES 的相關設定。
延伸閱讀
應用五:Caller ID 認證模式
用途:設定電話卡時除了使用輸入卡號的認證方式以外,還能以來電號碼(Caller ID) 辨識來認證。
- 啟用 Caller ID 後,用戶不需要先輸入卡號,就可以直接撥目的地號碼。
- 一個卡號可以設定一組或多組的來電號碼。
- 使用 Admin UI 來管理來電號碼。
- 一旦啟用後,當用戶的來電號碼並非系統所允許時,系統會提示卡號的認證的方式。
// 啟用方式
A2Billing Admin UI > Syetem Settings >
以 agi-conf 的方式來設,可以很容易啟用/關閉這功能,需要用到的參數(Key)如下:
- cid_enable = yes ;yes 啟用,no 關閉,預設是關閉的
- cid_askpincode_ifnot_callerid = yes ; 預設 yes,若 CID 認證失敗,系統會提示輸入 Card Number。
- cid_auto_assign_card_to_cid = yes ; 預設 yes,用戶撥入系統後,如果 CID 認證失敗,系統會提示輸入 Card Number,一旦用戶輸入資訊正確,系統會自動新增 CID,以致於該用戶下次再撥入時,就可以通過 CID 認證,且不會再提示輸入 Card Number。
- cid_auto_create_card = no
// 新增 Caller ID
A2Billing Admin UI > Customers > Caller-ID
CallerID = <用戶的來電號碼>
Activated = yes
ID Card = <選擇卡號>
F.A.Q
Q:如何大量刪除 Customers?
Ans: A2Billing UI > Customers > Add::Search > Search Customers
設定搜尋條件 > 按 Search > 再按旁邊的 Delete All
注意:這個方法無法將 VoIP Setting 一併刪除。
Q:如何大量刪除 VoIP Settings?
Ans: 目前沒有合適的作法。
Q:如何變更系統預設幣別 USD
Ans: 要改兩個地方,修改 base_currency 的參數及更新 currency list。
- A2Billing UI > System Settings > Global List
搜尋 GROUP = global, Key = base_currency
base_curreny = twd - 即使修改了幣別,系統預設的 currency list 仍是以美金 1:1 計算,所以必須修改這個匯率對照表為 TWD 1:1。
A2Billing UI > BILLING > Currency List > CLICK HERE TO UPDATE NOW
Q:匯入 ratecard 時總是出現錯誤 ERROR: file type is not allowed: application/force-download
Ans: 將副檔名 csv 改成 txt。
發現 Bug
版本 |
問題描述 |
1.7.0/1 |
修改 VoIP Settings 的 內容,不會同步更新 Asterisk 設定 |
|
Ans:這是因為 A2Billing 預設是啟動了 Realtime Asterisk 模式(Asterisk 以資料庫型式儲存設定),若只是檢查 *.conf 來判斷 Asterisk 是否更新是不準確的,然而這 bug 卻造成 A2Billing 無法以 relatime 模式更新 Asterisk。暫時的解決方法是使 A2Billing 關閉 realtime asterisk 模式,恢復成 *.conf 方式來更新 asterisk,步驟如下:
A2Billing UI > System Settings > Global List 搜尋 GROUP = global
use_realtime = no (預設為 yes)
Notes: 當關閉了 Realtime 後,爾後若有新增/編輯 VoIP Settings 時,在 CONFIRM DATA 之後,需要在作以下步驟完成 Asterisk 的更新:
- 點選 GENERATE ADDITIONAL_A2BILLING_SIP.CONF
- click here to reload your asterisk server
|
1.7.0 |
新增 CUSTOMER 時,若 balance 欄位維持預設的 0,仍可以存檔 |
|
Ans: 這項不確定是否為 bug,但在 1.3.x 穩定版,存檔前系統會檢查 balance 不可為 0。 |
1.7.0 |
若建立電話卡是有 SIP 註冊帳號的,刪除這個電話卡後,SIP 終端仍可以註冊,但已無法正常撥出。 |
1.7.0 |
在 Customer UI 的 DID 功能,操作 Release DID,按下 Release 後,雖然 DID 有 release,但畫面會成空白頁。 |
1.7.0 |
在 Customer UI 的 DID 功能,從項目列表中刪除 destination number 時,所有欄位的值會出現空白,再按下 Delete 後,雖然資料仍會刪除,但需要再做一次 Release DID。 |