同时选择号码和价格
购买从最新可用号码搜索结果中选定的一个具体号码。将所选条目的 info.uuid 用作号码 ID,并将同一条目的 price[].uuid 中的一个值用作价格 ID。此路由也接受完整的已存储号码,但国家、地区或前缀 ID 不能代替具体的号码选择。
搜索或读取已保存的价格不会预留号码,也不会锁定价格。请确认所选方案的开通费、月费、每分钟来电费率、包含的分钟数和通道数,以及账户的购买权限和登记要求。已审查的辅助程序中的初始基础金额为开通费加月费;还必须针对所选方案确认供应商特有的全部费用和条款。
使用 POST 提交带保护条件的购买请求
请从获准的来源 IP 地址,通过 HTTPS 使用已启用的 API 账户。以下命令会执行购买,并非获取报价或试运行。所有变量均须取自同一次最新的号码及价格选择。上限字段保留了旧版的 restore_quote_ 前缀;当前门户也使用这些字段为具体号码的购买提供保护。
curl --silent --show-error --user "$API_USER:$API_PASSWORD" \
--data-urlencode "restore_quote_price_id=$PRICE_ID" \
--data-urlencode "restore_quote_setup=$SETUP_PRICE" \
--data-urlencode "restore_quote_monthly=$MONTHLY_PRICE" \
--data-urlencode "restore_quote_per_minute=$PER_MINUTE_PRICE" \
--data-urlencode "restore_quote_channels=$CHANNELS" \
"https://api.multitel.net/v3/rentnumber/$NUMBER_ID/$PRICE_ID"请按示例使用表单 POST。辅助程序也支持解析 JSON 和选项包装结构,但本次审查尚未确认它们在所有报价及供应商处理路径上具有完全一致的行为。即使此旧版协调器没有显式的请求方法保护,也不要使用 GET 购买。
| 字段 | 含义 |
|---|---|
| NUMBER_ID | 搜索结果中所选号码的 UUID,或完整的已存储号码。每个请求仅限一个号码。 |
| PRICE_ID | 与所选号码及您的账户关联的价格 UUID。始终显式提供此值。 |
| restore_quote_price_id | 必须与解析得到的价格 ID 一致。提供此字段会启用报价检查;它不是幂等键。 |
| restore_quote_setup | 可接受的最高开通费,须为有限的非负数值。 |
| restore_quote_monthly | 可接受的最高月费,须为有限的非负数值。 |
| restore_quote_per_minute | 可接受的最高每分钟来电费率,须为有限的非负数值。 |
| restore_quote_channels | 所选价格选项对应的确切整数通道数,并非请求改用其他通道方案。 |
提供报价价格 ID 时,务必同时提供所有数值型报价字段。如果 ID 已更改、价格超过上限、上限缺失或无效、通道数已更改,或报价锁被占用,系统会在调用所选号码租用供应商之前返回 API 代码 409。比较时允许少量浮点误差;请使用实际显示的方案数值,不要手动对价格取整。
这些保护条件不会使整个流程成为试运行或事务。登记资料查询、身份实体创建或其他辅助处理可能在这些检查之前发生。它们也不会锁定外部库存,或取代账户级购买限制。
登记与激活
如有要求,请添加 RegistrationID 表单字段,填入归该客户所有的登记资料 UUID。此值不是已上传证明材料、供应商地址或独立身份实体的 ID。辅助程序会依据已认证的账户查找该资料,并拒绝缺失或不可用的资料。
部分受支持的库存允许在登记完成前购买;其他库存则要求在购买前提供登记资料。仍可能需要进行运营商特有的验证或开通处理。不要将购买成功或未执行前置检查理解为免于登记或立即激活。
如果响应中包含 registration_requirements,该字段会标明按国家和号码类型进行结构化要求查询的信息。请使用登记目录和证明材料流程,完成适用的要求。返回的文本和元数据本身并不代表登记资料已获批准。
避免方案被悄然替换
旧版协调器可以根据缓存的号码数据推断被省略的价格。当显式提供的价格 ID 已不存在时,它还可能回退到缓存前缀对应的最新账户价格,并更新缓存中的允许价格选择。不要依赖这些回退机制来选取客户已确认的方案。
请显式提供所选价格及匹配的报价保护字段。报价 ID 保护会在发起租用调用前拒绝回退到其他 ID。发生价格过期冲突后,请刷新搜索并重新取得客户确认的选择,不要移除保护条件来强行购买。
并非每条处理路径都有保证的预留期限或统一强制执行的缓存有效期。流程中会重新检查号码可用性、账户价格限制和购买政策,但供应商特有的完整行为仍在审查中。
高级:账户路由默认设置
购买时可能继承账户现有的语音目的地、故障转移目的地、短信目的地和origination 中继偏好。请在下单前检查这些默认设置;省略路由选项并不保证所购号码未配置路由。已审查的辅助程序默认启用自动续费。
| 选项 | 解析行为 |
|---|---|
| uri, uri2, uri3 | 省略值时会继承相应的账户默认设置。显式传入空值会清除辅助程序中的对应值,而非继承默认值。请使用适合所选路由模式的有效目的地。 |
| smsuri | 省略值时会继承账户的短信目的地;显式传入空值会在辅助程序中清除该目的地。 |
| origintrunk | 可识别的显式中继 ID 优先。无法解析的值可能回退到账户偏好或旧版默认值,而不报错。 |
| forward_destination, forwarding_destination, type | 路由模式的别名字段,仅在非空时生效,优先级按上述顺序排列。请使用账户路由配置中支持的值,不要猜测模式的数字值。 |
| RegistrationID | 在该客户范围内查询登记资料;此选项与路由目的地相互独立。 |
| autorenew | 默认为 1。辅助程序使用非空值检查,因此通过此购买字段传入 0 并不能可靠地关闭续费。请使用受支持的账户续费管理功能,并核实已保存的设置。 |
这些是共享辅助程序的处理语义,并不保证每家供应商都会以相同方式保存每项可选设置。其他旧版语音、语音信箱、传真和短信字段仍然存在,但还需要针对各供应商进行完整审查。在依赖通话或消息功能之前,请通过账户流程核实所购号码已保存的配置。
响应
以下为简单购买场景的虚构示例;具体数值和功能因所选方案而异。
{
"status": {
"code": 200,
"msg": ""
},
"response": {
"number": "12025550123",
"price": {
"per_minute": "0.0100",
"free_minutes": "100",
"setup_price": "2.00",
"monthly_price": "4.00",
"channels": "2",
"overflow": "0"
},
"features": [
"voice"
],
"needs_registration": 0,
"registration_requirements": null
}
}协调器使用自身的 status.code/status.msg 和 response 封装结构,不保证包含 status.results 字段。发生错误时,响应列表通常为空。成功后,请检查返回的号码和价格,然后核对账户库存及登记状态。供应商接受订单并不等于已进行实际语音、短信或传真测试。
错误与不确定的结果
| API 代码 | 含义 |
|---|---|
| 403 | 账户价格或购买限制、不可用的价格选择,或无法访问的登记资料,都可能阻止处理。 |
| 404 | 所选号码、价格或前缀缺失或不可用。 |
| 409 | 号码已处于激活状态、报价保护条件不再匹配,或另一个受保护的操作持有该锁。 |
| 422 | 在已审查的登记处理路径中,需要提供登记信息、信息不完整,或无法完成登记配置。 |
| 500 及其他供应商或账户代码 | 供应商、本地处理或政策相关故障。这些结果并不能在所有情况下证明未发生购买或扣费。 |
请同时读取实际的 API 响应正文和 HTTP 状态。外部供应商可能已接受租用,随后本地通知、登记或其他处理才发生失败。部分本地库存分配使用数据库事务,但并不存在适用于所有外部供应商订单的统一回滚机制。此协调器不提供客户端幂等键。
重试前先核实
- 先将已获确认的号码、价格和报价上限保存在应用的订单记录中,然后仅提交一次。
- 请求结束后,读取同一账户的已购号码库存和号码详情;即使发生超时或错误,也应如此。
- 如果该号码已存在,请核实其价格、续费、路由和登记状态,不要再次提交购买请求。
- 如果结果仍不确定,请先让支持人员核对供应商订单和账户账单,再重试。仅凭错误消息或旧版日志中的成功标记,证据并不充分。
- 确认号码归属和激活状态后,完成账户常规的路由检查和服务测试。