更新时间:2025-10-16 GMT+08:00
AX模式
package com.huawei.hosting.service.voice;
import com.huawei.hosting.utils.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import java.util.HashMap;
import java.util.Map;
/**
* AX模式(具体场景请参考接口说明)
*/
public class AXDemo {
/**
* 必填,请登录管理控制台,从"应用管理"页获取
*/
private final static String OMPAPPKEY = "a1d1f50cad21415fbdd13d8f53d36d60"; // APP_Key
private final static String OMPAPPSECRET = "cfc881cc704c4fba8d8fef5788e03e6b"; // APP_Secret
private final static String OMPDOMAINNAME = "https://rtcpns.cn-north-1.myhuaweicloud.com"; // APP接入地址
public static void main(String[] args) {
IAXInterfaceDemo ax = new AXInterfaceDemoImpl(OMPAPPKEY, OMPAPPSECRET, OMPDOMAINNAME);
// 第一步: 号码绑定,即调用AX模式绑定接口
// ax.axBindNumber("+8618612345678", "+8618010000001", "0");
// 当用户发起通话时,隐私保护通话平台会将呼叫事件推送到商户应用,参考: HostingVoiceEventDemoImpl
// 当用户使用短信功能,隐私保护通话平台将短信事件推送到商户应用,参考: HostingVoiceEventDemoImpl
// 第二步: 用户通话结束,若设置录音,则商户可以获取录音文件下载地址,即调用获取录音文件下载地址接口
// ax.axGetRecordDownloadLink("ostor.huawei.com", "1200_366_0_20161228102743.wav");
// 第三步: 根据业务需求,可更改绑定关系,即调用AX模式绑定信息修改接口
// ax.axModifyNumber("efw89efwf7fea324252", null, null, true);
// 第四步: 根据业务需求,设置临时被叫,即调用AX模式设置临时被叫接口
// ax.axSetCalleeNumber(null, "+8618010000001", "+8618612345679");
// 第五步: 隐私号码循环使用,商户可将绑定关系解绑,即调用AX模式解绑接口
// ax.axUnbindNumber(null, "+8618010000001");
// 第六步: 商户可查询已订购的隐私号码的绑定信息,即调用AX模式绑定信息查询接口
ax.axQueryBindRelation(null, "+8618612345678", null);
}
}
/**
* AX模式接口
*/
interface IAXInterfaceDemo {
/**
* Set the X number to the user's privacy number | 隐私号码AX绑定
*
* @param origNum 用户号码
* @param privateNum 隐私号码
* @param calleeNumDisplay 是否显示用户号码
*/
void axBindNumber(String origNum, String privateNum, String calleeNumDisplay);
/**
* Modify sms function of the user's privacy number | 隐私号码AX绑定信息修改
*
* @param subscriptionId 绑定关系ID
* @param origNum 用户号码,如果需要修改绑定关系中的用户号码,请指定新的用户号码.不携带时表示不修改该参数值
* @param privateNum 隐私号码
* @param privateSms 是否支持短信
* subscriptionId和privateNum二选一即可,当都传入时,优先选用subscriptionId
*/
void axModifyNumber(String subscriptionId, String origNum, String privateNum, boolean privateSms);
/**
* Unbind the privacy number from number a | 隐私号码AX解绑
*
* @param subscriptionId 绑定关系ID
* @param privateNum 隐私号码
* subscriptionId和privateNum二选一即可,当都传入时,优先选用subscriptionId
*/
void axUnbindNumber(String subscriptionId, String privateNum);
/**
* Query the privacy binding numbers on the X number | 查询AX绑定信息
*
* @param subscriptionId 绑定关系ID
* @param origNum 用户号码
* @param privateNum 隐私号码
* subscriptionId,origNum和privateNum三选一即可,当都传入时,subscriptionId > origNum > privateNum
*/
void axQueryBindRelation(String subscriptionId, String origNum, String privateNum);
/**
* Set the callee number to the ax bind relation | 设置AX临时被叫
*
* @param subscriptionId 绑定关系ID
* @param privateNum 隐私号码
* @param calleeNum 被叫号码
* subscriptionId和privateNum二选一即可,当都传入时,优先选用subscriptionId
*/
void axSetCalleeNumber(String subscriptionId, String privateNum, String calleeNum);
/**
* Get download link of the record file created in call | 获取录音文件下载地址
*
* @param recordDomain 录音文件存储的服务器域名
* @param fileName 录音文件名
*/
void axGetRecordDownloadLink(String recordDomain, String fileName);
}
/**
* AX模式接口测试
*/
class AXInterfaceDemoImpl implements IAXInterfaceDemo {
private Logger logger = Logger.getLogger(AXInterfaceDemoImpl.class);
private String appKey; // APP_Key
private String appSecret; // APP_Secret
private String ompDomainName; // APP接入地址
public AXInterfaceDemoImpl(String appKey, String appSecret, String ompDomainName) {
this.appKey = appKey;
this.appSecret = appSecret;
this.ompDomainName = ompDomainName;
}
/**
* Build the real url of https request | 构建隐私保护通话平台请求路径
*
* @param path 接口访问URI
* @return
*/
private String buildOmpUrl(String path) {
return ompDomainName + path;
}
@Override
public void axBindNumber(String origNum, String privateNum, String calleeNumDisplay) {
if (StringUtils.isBlank(origNum) || StringUtils.isBlank(privateNum) || StringUtils.isBlank(calleeNumDisplay)) {
logger.info("axBindNumber set params error");
return;
}
// 必填,AX模式绑定接口访问URI
String url = "/rest/provision/caas/privatenumber/v1.0";
String realUrl = buildOmpUrl(url);
// 封装JOSN请求
JSONObject json = new JSONObject();
json.put("origNum", origNum); // A方真实号码(手机或固话)
json.put("privateNum", privateNum); // 已订购的隐私号码(X号码)
json.put("calleeNumDisplay", calleeNumDisplay); // 设置非A用户呼叫X时,A接到呼叫时的主显号码
/**
* 选填,各参数要求请参考"AX模式绑定接口"
*/
// json.put("privateNumType", "mobile-virtual"); //固定为mobile-virtual
// json.put("areaCode", "0755"); //城市码
// json.put("areaMatchMode", "1"); //号码筛选方式
// json.put("recordFlag", true); //是否通话录音
// json.put("recordHintTone", "recordHintTone.wav"); //录音提示音
// json.put("privateSms", true); //是否支持短信功能
// JSONObject preVoice = new JSONObject();
// preVoice.put("callerHintTone", "callerHintTone.wav"); //设置A拨打X号码时的通话前等待音
// preVoice.put("calleeHintTone", "calleeHintTone.wav"); //设置非A用户拨打X号码时的通话前等待音
// json.put("preVoice", preVoice); //个性化通话前等待音
// json.put("maxDuration", 120); //设置允许单次通话进行的最长时间,单位为分钟
// json.put("userData", "test123"); //用户自定义数据
// json.put("callDirection", 0); //呼叫方向控制
String result = HttpUtil.sendPost(appKey, appSecret, realUrl, json.toString());
logger.info("Response is :" + result);
}
@Override
public void axModifyNumber(String subscriptionId, String origNum, String privateNum, boolean privateSms) {
if (StringUtils.isBlank(subscriptionId) && StringUtils.isBlank(privateNum)) {
logger.info("axModifyNumber set params error");
return;
}
// 必填,AX模式绑定信息修改接口访问URI
String url = "/rest/provision/caas/privatenumber/v1.0";
String realUrl = buildOmpUrl(url);
// 封装JOSN请求
JSONObject json = new JSONObject();
if (StringUtils.isNotBlank(subscriptionId)) {
json.put("subscriptionId", subscriptionId); // 绑定关系ID
} else {
json.put("privateNum", privateNum); // AX中的X号码
}
if (StringUtils.isNotBlank(origNum)) {
json.put("origNum", origNum); // AX中的A号码
}
json.put("privateSms", privateSms); // 是否支持短信功能
/**
* 选填,各参数要求请参考"AX模式绑定信息修改接口"
*/
// json.put("recordFlag", true); //是否通话录音
// json.put("maxDuration", 120); //修改允许单次通话进行的最长时间,单位为分钟
// json.put("userData", "test123"); //用户自定义数据
// json.put("callDirection", 0); //呼叫方向控制
String result = HttpUtil.sendPut(appKey, appSecret, realUrl, json.toString());
logger.info("Response is :" + result);
}
@Override
public void axUnbindNumber(String subscriptionId, String privateNum) {
if (StringUtils.isBlank(subscriptionId) && StringUtils.isBlank(privateNum)) {
logger.info("axUnbindNumber set params error");
return;
}
// 必填,AX模式解绑接口访问URI
String url = "/rest/provision/caas/privatenumber/v1.0";
String realUrl = buildOmpUrl(url);
// 申明对象
Map<String, Object> map = new HashMap<String, Object>();
if (StringUtils.isNotBlank(subscriptionId)) {
map.put("subscriptionId", subscriptionId); // 绑定关系ID
} else {
map.put("privateNum", privateNum); // AX中的X号码
}
String result = HttpUtil.sendDelete(appKey, appSecret, realUrl, HttpUtil.map2UrlEncodeString(map));
logger.info("Response is :" + result);
}
@Override
public void axQueryBindRelation(String subscriptionId, String origNum, String privateNum) {
if (StringUtils.isBlank(subscriptionId) && StringUtils.isBlank(origNum) && StringUtils.isBlank(privateNum)) {
logger.error("axQueryBindRelation set parsms error");
return;
}
// 必填,AX模式绑定信息查询接口访问URI
String url = "/rest/provision/caas/privatenumber/v1.0";
String realUrl = buildOmpUrl(url);
// 申明对象
Map<String, Object> map = new HashMap<String, Object>();
if (StringUtils.isNotBlank(subscriptionId)) {
map.put("subscriptionId", subscriptionId); // 指定绑定关系ID进行查询
} else {
if (StringUtils.isNotBlank(origNum)) {
map.put("origNum", origNum); // 指定A号码进行查询
} else {
map.put("privateNum", privateNum); // 指定X号码进行查询
}
}
String result = HttpUtil.sendGet(appKey, appSecret, realUrl, HttpUtil.map2UrlEncodeString(map));
logger.info("Response is :" + result);
}
@Override
public void axSetCalleeNumber(String subscriptionId, String privateNum, String calleeNum) {
if (StringUtils.isBlank(calleeNum)
|| (StringUtils.isBlank(subscriptionId) && StringUtils.isBlank(privateNum))) {
logger.info("axSetCalleeNumber set params error");
return;
}
// 必填,AX模式设置临时被叫接口
String url = "/rest/caas/privatenumber/calleenumber/v1.0";
String realUrl = buildOmpUrl(url);
// 封装JOSN请求
JSONObject json = new JSONObject();
if (StringUtils.isNotBlank(subscriptionId)) {
json.put("subscriptionId", subscriptionId); // 绑定关系ID
} else {
json.put("privateNum", privateNum); // AX中的X号码
}
json.put("calleeNum", calleeNum); // 本次呼叫的真实被叫号码
/**
* 选填,各参数要求请参考"AX模式设置临时被叫接口"
*/
// json.put("duration", 120); //临时被叫关系保持时间,单位为秒
// json.put("userData", "test123"); //用户自定义数据
String result = HttpUtil.sendPut(appKey, appSecret, realUrl, json.toString());
logger.info("Response is :" + result);
}
@Override
public void axGetRecordDownloadLink(String recordDomain, String fileName) {
if (StringUtils.isBlank(recordDomain) || StringUtils.isBlank(fileName)) {
logger.info("axGetRecordDownloadLink set params error");
return;
}
// 必填,AX模式获取录音文件下载地址接口访问URI
String url = "/rest/provision/voice/record/v1.0";
String realUrl = buildOmpUrl(url);
// 申明对象
Map<String, Object> map = new HashMap<String, Object>();
map.put("recordDomain", recordDomain); // 录音文件存储的服务器域名
map.put("fileName", fileName); // 录音文件名
String result = HttpUtil.sendGet(appKey, appSecret, realUrl, HttpUtil.map2UrlEncodeString(map));
logger.info("Response is :" + result);
}
}
父主题: Java代码样例