PAYATHON 2026

如何为 Elastix A2Billing 账户配置访问限制

数据小陈

结论

可以对已经创建的 A2Billing 账户实施这些限制,但通常无法只在 Elastix 或 A2Billing 的某个页面中一次完成。比较合适的分工如下:

  • Balance:在 A2Billing 账户中设置。
  • Destination Limit:使用 A2Billing 的 RateCard、Tariff/Call Plan 和号码前缀控制。
  • Days of Week、Active Hours:使用 Asterisk/Elastix 的 Time Conditions 或自定义拨号计划控制。
  • Talktime Limit:单次通话最多 10 分钟,可以由 Asterisk 设置;每日或每月累计通话时间不超过 10 分钟,则需要额外的计数逻辑或定制 A2Billing。

这些设置可以直接应用于已有账户,不需要重新创建。

先把表格转换成策略

不必为表格中的每一行复制一套完整配置。可以先建立几组可复用的策略,例如:

  • MON_SAT_0800_2000
  • MON_FRI_0800_1800
  • MON_FRI_0800_2000
  • ALL_DAYS_24H
  • DEST_LOCAL
  • DEST_LOCAL_MOBILE
  • DEST_LOCAL_MOBILE_SLJJ
  • CALL_10_MINUTES
  • CALL_UNLIMITED

再把已有账户分别关联到对应策略。以后调整办公时间或号码范围时,只需修改策略,不必逐个修改账户。

设置账户余额

在 A2Billing 管理界面中打开已有客户或 Card,然后修改余额或 Credit 字段。

设置前需要确认 300,000 的具体含义:

  • 如果表示三十万货币单位,应按账户币种写入相应数值。
  • 如果逗号是小数分隔符,实际值可能是 300.000。
  • 如果表示信用额度而不是预付余额,应使用当前版本对应的 Credit Limit,而不是直接增加余额。

不同 A2Billing 版本中的字段名称可能是 Credit、Balance 或类似名称,应以当前安装版本的 Card 编辑页面和数据库结构为准。

可以直接修改数据库,但在确认版本和字段含义之前不建议这样做。例如,某些版本使用 cc_card.credit 保存可用余额:

SELECT id, username, credit, currency
FROM cc_card
WHERE username = 'ACCOUNT_ID';

确认字段含义并完成数据库备份后,再执行更新:

UPDATE cc_card
SET credit = 300000
WHERE username = 'ACCOUNT_ID';

优先通过管理界面修改,可以减少币种、数据格式和审计方面的问题。

限制可拨打的目的地

目的地限制更适合由 A2Billing 的计费计划处理,不宜只依赖 Elastix 的 Outbound Route。

可以分别创建或复用三组 RateCard:

  • Local
  • Mobile
  • SLJJ

每组 RateCard 只包含对应的号码前缀。例如,Local 只包含本地号码前缀,Mobile 包含移动号码段,SLJJ 包含相应的长途或业务号码段。

然后建立不同的 Call Plan:

Call Plan包含的 RateCard
CP_LOCALLocal
CP_LOCAL_MOBILELocal、Mobile
CP_LOCAL_MOBILE_SLJJLocal、Mobile、SLJJ

最后,在已有 A2Billing Card 中选择相应的 Call Plan。

如果某个号码无法匹配该 Call Plan 中的任何费率前缀,A2Billing 应拒绝呼叫。还要检查是否存在范围过宽的通配费率,例如可以匹配所有号码的默认前缀,否则用户可能绕过目的地限制。

Local、Mobile 和 SLJJ 对应的具体前缀取决于当地编号规则,无法仅根据示例表格确定。

限制星期和使用时段

对于固定 SIP 分机或已知主叫账户,可以在 Elastix/FreePBX 中使用 Time Groups 和 Time Conditions,也可以在 extensions_custom.conf 中创建自定义上下文。

下面是星期一至星期五 08

至 18
的示例:

[policy-mon-fri-0800-1800]
exten => _X.,1,NoOp(Check calling schedule)
 same => n,GotoIfTime(08:00-18:00,mon-fri,*,*?allowed)
 same => n,Playback(access-denied)
 same => n,Hangup()

 same => n(allowed),Goto(a2billing-entry,${EXTEN},1)

星期一至星期六 08

至 20
可以写成:

[policy-mon-sat-0800-2000]
exten => _X.,1,NoOp(Check calling schedule)
 same => n,GotoIfTime(08:00-20:00,mon-sat,*,*?allowed)
 same => n,Playback(access-denied)
 same => n,Hangup()

 same => n(allowed),Goto(a2billing-entry,${EXTEN},1)

全天策略不需要判断时间:

[policy-all-days-24h]
exten => _X.,1,Goto(a2billing-entry,${EXTEN},1)

这里的 a2billing-entry 只是占位名称,需要替换成当前系统实际使用的 A2Billing 入口上下文。不要直接修改 FreePBX 自动生成的 extensions_additional.conf,因为重新加载配置时,改动可能会被覆盖。

还需要检查服务器时区。如果 Asterisk 使用了错误的时区,配置中的 08:00 就可能不对应当地时间。

设置单次通话最多 10 分钟

如果 “Talktime Limit 10 minutes” 指每通电话最多 10 分钟,可以在进入 A2Billing 呼叫流程前设置 Asterisk 的绝对通话超时:

[policy-call-max-10m]
exten => _X.,1,NoOp(Set maximum call duration to 600 seconds)
 same => n,Set(TIMEOUT(absolute)=600)
 same => n,Goto(a2billing-entry,${EXTEN},1)

也可以把时间限制和通话长度限制合并:

[policy-mon-fri-0800-1800-max10m]
exten => _X.,1,NoOp(Office-hours policy with 10-minute call limit)
 same => n,GotoIfTime(08:00-18:00,mon-fri,*,*?allowed)
 same => n,Playback(access-denied)
 same => n,Hangup()

 same => n(allowed),Set(TIMEOUT(absolute)=600)
 same => n,Goto(a2billing-entry,${EXTEN},1)

TIMEOUT(absolute) 会从设置时开始计时。如果 A2Billing 流程包含较长的语音提示、PIN 输入或选号过程,这些时间也可能计入 600 秒。若要求接通后精确计时 600 秒,应在实际执行 Dial() 的位置设置超时,或者调整 A2Billing 的 AGI 呼叫逻辑。

标记为 “Unlimited” 的账户不要应用这条 600 秒策略。

如果 10 分钟指每日或每月的累计通话时间,上述配置不适用。系统需要读取 A2Billing 的通话详单,按账户和周期汇总已用秒数,并在发起新呼叫前判断剩余额度。标准配置通常无法只靠一个账户字段完整实现累计时间限制。

如何关联到已有账户

如果每个 A2Billing 账户对应一个固定 SIP 分机,可以为该分机分配相应的自定义拨号上下文:

[account-production-101]
include => policy-mon-fri-0800-1800-max10m

同时在 A2Billing 中为该账户选择 CP_LOCAL。

另一个允许拨打本地、移动和 SLJJ 号码的账户,可以使用相同的时间策略,但关联不同的 Call Plan:

[account-production-102]
include => policy-mon-fri-0800-1800-max10m

在 A2Billing 中为这个账户选择 CP_LOCAL_MOBILE_SLJJ。

这样配置后,Asterisk 负责控制时间和通话长度,A2Billing 负责控制目的地和余额。

如果多个用户拨打同一个接入号码,之后才输入 A2Billing PIN,Asterisk 在认证前无法知道具体账户,也就不能只靠入口拨号上下文为不同账户应用不同的使用时段。此时可以采用以下方式:

  1. 为不同策略分配不同的接入号码;
  2. 让每个账户通过固定 SIP 分机或固定上下文进入;
  3. 修改 A2Billing AGI,在账户认证成功后查询账户策略,再执行时间和通话限制。

第三种方式最灵活,但需要定制开发。升级 A2Billing 后,还要重新检查兼容性。

必须同时防止旁路

配置完成后,要确认受限分机不能通过其他路由绕过 A2Billing,例如:

  • 直接进入 Elastix Outbound Route;
  • 使用其他 Trunk;
  • 使用不受限制的自定义上下文;
  • 通过范围过宽的 A2Billing RateCard 匹配所有号码;
  • 使用没有绑定策略的备用接入号码。

实际部署前,至少要测试以下情况:

  • 允许时段内和时段外;
  • 工作日和周末;
  • Local、Mobile、SLJJ 各一个号码;
  • 一个明确禁止的目的地;
  • 通话达到 10 分钟后自动断线;
  • 余额不足;
  • 管理员定义的 “Unlimited” 账户。

这组需求可以实现。配置时,应由 A2Billing 管理账户余额和目的地限制,由 Asterisk/Elastix 管理星期、使用时段和单次通话时长。

备注:内容仅供参考。