您在这里:开发者文档 > 开发指南

平台概述

平台概述

为降低开发者了解和测试平台功能的门槛,同时为防止平台被过分滥用,绿豆云通讯平台为每一位完成注册的开发者提供1000条免费短信,您可以使用免费短信完整的体验平台服务。在使用免费短信完成开发测试的同时,我们建议您详细阅读开发测试应用的约束条件。

计费原则

当你选择接入平台服务时,接入过程不会产生除资源占用外的其他费用。所有服务只在您开发接入完成后按使用量进行计费,不使用不计费。

API

一、REST API:

云通讯平台REST接口为开发者提供短信发送、流量充值等功能。云通讯平台 REST Web Service 接口。

1.Base URL

文档中所有被引用的地址都有如下Base URL:http://112.74.19.39:9999

2.统一请求包头

业务URL格式:Base URL与业务URL相拼接为完整请求URL


帐号鉴权:
Base URL/业务URL?id=${accountKey}&sign=${sign}

HTTP标准报头字段:
Accept:application/json;
Content-Type:application/json;charset=utf-8;
Content-Length:256;
Authorization:********************************;

属性说明

参数名称 类型 约束 说明
accountKey String 必选 主账户Key。由32个英文字母和阿拉伯数字组成的唯一标识符
sign String 必选 验证参数,请求URL必须带此参数,生成规则:使用MD5加密(主账户key+主账户token+时间戳), 时间戳格式:yyyyMMddhhmmss
Accept String 必选 客户端响应接收数据格式:application/json
Content-Type String 必选 类型:application/json;charset=utf-8
Content-Length String 必选 Content-Length
Authorization String 必选 验证信息 生成规则:使用Base64编码(主账户key+冒号+时间戳) 冒号:为英文冒号 时间戳格式:yyyyMMddhhmmss

二、短信业务:

1.发送接口

请求地址:Base URL/sms/send?id=${accountKey}&sign=${sign}
请求包头:同上
请求方法:post
编码:utf-8

请求包体:

属性 类型 约束 说明
to String 必选 短信接收手机号码集合,用英文逗号分开,每批发送的手机号码数量不得超过100个
appId String 必选 应用id
templateId String 必选 模板id
parameters String[] 可选 内容数据,用于替换模板中的{序号}
content String 必选 短信内容
注意:
如果应用开通短信模板,templateId与parameters必选,content、smsType无效;
如果应用没开通短信模板,content与smsType必选,templateId、parameters无效。

json请求示例

POST

/sms/send?id=abcdefghijklmnopqrstuvwxyz012345&sign=C1F20E7A9733CE94F680C70A1DBABCDE= Host:192.168.0.1:9999
Accept:application/json
Content-Type:application/json;charset=utf-8;
Content=Length:256;
Authorization: ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE=
{“to”: “18402046559,18067993972,18576269752”, “appId”: “ff8080813fc70a7b013fc72312324213”, “templateId”: “1”, “parameters”: [“替换内容”, “替换内容”]}

响应:

此步响应只表明客户的短信请求发送成功,不表明短信通道已经发送短信成功。
属性 类型 约束 说明
code String 必选 响应状态码,取值200(成功)
message String 必选 响应说明
data {} 必选 响应主体
data.createAt String[] 必选 创建时间
data.orderId String 必选 短信唯一标识符
data.status Integer 必选 提交状态:0为失败,1为成功

json响应示例:

Http/1.1 200 OK
Content-Length: 256
{“code”: “200”, “message”: “短信提交成功”, data: {“createAt”: “2016-09-01 09:00:00”, “orderId”: “201609010900000160000001”, “status”: “1”}}

2.状态接口

请求地址:Base URL/sms/report/send?id=${accountKey}&sign=${sign}
请求包头:同上
请求方法:post
编码:utf-8

请求包体

属性 类型 约束 说明
pageSize Integer 可选 状态记录条数,默认为500

json请求示例

POST

/sms/send?id=abcdefghijklmnopqrstuvwxyz012345&sign=C1F20E7A9733CE94F680C70A1DBABCDE=
Host:192.168.0.1:9999
Accept:application/json
Content-Type:application/json;charset=utf-8;
Content=Length:256;
Authorization: ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE=
{“pageSize”: 500}

响应

属性 类型 约束 说明
code String 必选 响应状态码,取值200(成功)
message String 必选 响应说明
data [] 必选 响应主体
data.orderId String 必选 短信唯一标识符
data.mobile String 必选 手机号码
data.status Integer 必选 发送状态:0为失败,1为成功
data.result String 必选 返还结果
data.createAt String 必选 创建时间
data.modifyAt String 必选 发送时间

json响应示例:

Http/1.1 200 OK
Content-Length: 256
{“code”: “200”, “message”: “”, data: [{“orderId”: “201609010900000160000001”,
“mobile”: “18402046559”, “status”: “1”, “result”: “DELIVER”, “createAt”: “2016-09-01
09:00:00”, “modifyAt”: “2016-09-01 09:00:00”}, {“orderId”:
“201609010900000160000002”, “mobile”: “18067993972”, “status”: “1”, “result”:
“DELIVER”, “createAt”: “2016-09-01 09:00:00”, “modifyAt”: “2016-09-01 09:00:00”}]}

3.上行接口

请求地址:Base URL/sms/report/send?id=${accountKey}&sign=${sign}
请求包头:同上
请求方法:post
编码:utf-8

请求包体:

属性 类型 约束 说明
pageSize Integer 可选 状态记录条数,默认为500

json请求示例:

POST
/sms/reply?id=abcdefghijklmnopqrstuvwxyz012345&sign=C1F20E7A9733CE94F680C70A1DBABCDE=
Host:192.168.0.1:9999
Accept:application/json
Content-Type:application/json;charset=utf-8;
Content=Length:256;
Authorization: ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE=
{“pageSize”: 500}

响应:

属性 类型 约束 说明
code String 可选 响应状态码,取值200(成功)
message String 必选 响应说明
data [] 必选 响应主体
data.mobile String 必选 手机号码
data.content Integer 必选 回复内容
data.ext_no String 必选 返还结果
data.createAt String 必选 回复时间

json响应示例:

Http/1.1 200 OK
Content-Length: 256
{“code”: “200”, “message”: “”, data: [{“mobile”: “18402046559”, “content”:
“TD”, “createAt”: “2016-09-01 09:00:00”}, {“mobile”: “18067993972”,
“content”: “内容”, “createAt”: “2016-09-01 09:00:00”}]}

4.短信验证成功接口

请求地址:Base URL/sms/trigger/verify?id=${accountKey}&sign=${sign}
请求包头:同上
请求方法:post
编码:utf-8

属性 类型 约束 说明
to String 必选 手机号码
orderId String 必选 短信唯一标识符

json请求示例:

POST
/sms/reply?id=abcdefghijklmnopqrstuvwxyz012345&sign=C1F20E7A9733CE94F680C70A1DBABCDE=
Host:192.168.0.1:9999
Accept:application/json
Content-Type:application/json;charset=utf-8;
Content-Length:256;
Authorization: ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE=
{“to”: “18402046559”, “orderId”: “201609010900000160000001”}

响应:

属性 类型 约束 说明
code String 必选 响应状态码,取值200(成功)
message String 必选 响应说明

json响应示例:

Http/1.1 200 OK
Content-Length: 256
{“code”: “200”, “message”: “验证触发成功”}

三、流量业务:

1.套餐查询接口

请求地址:Base URL/flow/packages?id=${accountKey}&sign=${sign}
请求包头:同上
请求方法:post
编码:utf-8

属性 类型 约束 说明
mobile String 必选 手机号码

json请求示例:

POST
/flow/packages?id=abcdefghijklmnopqrstuvwxyz012345&sign=C1F20E7A9733CE94F680C70A1DBABCDE=
Host:192.168.0.1:9999
Accept:application/json
Content-Type:application/json;charset=utf-8;
Content=Length:256;
Authorization: ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE=
{“mobile”: “18402046559”}

响应:

属性 类型 约束 说明
code String 必选 响应状态码,取值200(成功)
message String 必选 响应说明
data {} 必选 响应主体
data.packageId String 必选 套餐id
data.flowCount String 必选 流量包

json响应示例:

Http/1.1 200 OK
Content-Length: 256
{“code”: “200”, “message”: “”, data: [{“packageId”: “1001”, “status”: “10”},{“packageId”: “1002”, “status”: “20”}]}

2.流量充值

请求地址:Base URL/flow/packages?id=${accountKey}&sign=${sign}
请求包头:同上
请求方法:post
编码:utf-8

请求包体:

属性 类型 约束 说明
mobile String 必选 手机号码
appId String 必选 应用id
packageId String 必选 套餐id
flowCount Integer 必选 流量包
customId String 可选 商户自定义订单id

json请求示例:

POST
/flow/recharge?id=abcdefghijklmnopqrstuvwxyz012345&sign=C1F20E7A9733CE94F680C70A1DBABCDE=
Host:192.168.0.1:9999
Accept:application/json
Content-Type:application/json;charset=utf-8;
Content-Length:256;
Authorization: ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE=
{“mobile”: “18402046559”, “appId”: “ff8080813fc70a7b013fc72312324213”, “packageId”: “1001”, “flowCount”: 10, “customId”: “”}

响应:

属性 类型 约束 说明
code String 必选 响应状态码,取值200(成功)
message String 必选 响应说明
data {} 必选 响应主体
data.createAt String 必选 创建时间
data.orderId String 必选 流量充值唯一标识符
data.customId String 可选 商户自定义订单id
data.status Integer 必选 提交状态:0为失败,1为成功

json响应示例:

Http/1.1 200 OK
Content-Length: 256
{“code”: “200”, “message”: “流量提交成功”, data: {“createAt”: “2016-09-01 09:00:00”, “orderId”: “201609010900000160000001”, “customId”: “”, “status”: “1”}}

3.状态接口

请求地址:Base URL/flow/report?id=${accountKey}&sign=${sign} 请求包头:同上 请求方法:post 编码:utf-8

请求包体:

属性 类型 约束 说明
pageSize Integer 可选 状态记录条数,默认为500

json请求示例:

POST /flow/report?id=abcdefghijklmnopqrstuvwxyz012345&sign=C1F20E7A9733CE94F680C70A1DBABCDE= Host:192.168.0.1:9999 Accept:application/json Content-Type:application/json;charset=utf-8; Content-Length:256; Authorization: ZmY4MDgwODEzYzM3ZGE1MzAxM2M4MDRmODA3MjAwN2M6MjAxMzAyMDExNTABCDE= {“appId”: “201609010900000160000001”, “customId”: “”}

响应:

属性 类型 约束 说明
code String 必选 响应状态码,取值200(成功)
message String 必选 响应说明
data [] 必选 响应主体
data.orderId String 必选 流量充值唯一标识符
data.mobile String 必选 手机号码
data.status Integer 必选 发送状态: 0为失败,1为成功
data.result String 必选 返还结果
data.createAt String 必选 创建时间
data.modifyAt String 必选 充值时间

json响应示例:

Http/1.1 200 OK
Content-Length: 256
{“code”: “200”, “message”: “”, data: [{“orderId”: “201609010900000160000001”, “mobile”: “18402046559”, “status”: “1”, “result”: “充值成功”, “createAt”: “2016-09-01 09:00:00”, “modifyAt”: “2016-09-01 09:00:00”}, {“orderId”: “201609010900000160000002”, “mobile”: “18067993972”, “status”: “1”, “result”: “充值成功”, “createAt”: “2016-09-01 09:00:00”, “modifyAt”: “2016-09-01 09:00:00”}]}

四、API开发帮助文档下载

云通讯平台为开发者提供了Api开发文档,让您可以简单轻松的接入。以下是官方提供的Api开发帮助文档。

Api- v1.0.0

API(Download .zip)

Android SDK接入文档

设置基本信息

在APP入口中或者第一个Activity(SplashActivity)的onCreate()中设置一些重要的配置信息。

示例

<meta-data
android:name="LVDOU_APPKEY"
android:value="***" />
<meta-data
android:name="LVDOU_TOKEN"
android:value="***" />
<meta-data
android:name="LVDOU_APPID"
android:value="***" />

其中LVDOU_APPKEY是您的应用在云通信中的app_key, LVDOU_TOKEN是您的应用 在云通信中的app_token, LVDOU_APPID是您的应用的app_id。

短信接口

1、发送短信请求接口

1.1、调用函数

SmsApi api = new SmsApi(this);
api.sendSMS(mobile, smsType,templateId, smsContent,content, listerner);

1.2、参数说明

参数名称 含义 说明
mobile 手机号码 发信发送的目的号码.多个号码之间用半角逗号隔开 如137****253,147****527
smsType 短信类型 “1”为通知类型,“2”为短信验证码
templateId 短信模板Id 在云通信后台设置的短信模板Id
smsContent 模板传入内容 new String[]{"**","***"…}类型,模板中的变量。
content 短信内容 需要发送给用户发送的短信内容(用户收到的短信由(templateId+smsContent)/content)决定
listerner RequestListener<SmsResult> 请求短信验证码回调

1.3、示例

api.sendSMS(phone,"1",templateId,smsContent, "",new RequestListener<SmsResult>() {

@Override
public void onSuccess(SmsResult result) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "请求成功", Toast.LENGTH_SHORT).show();
Log.i(TAG, "--------------------请求成功------------------------------");
Log.i(TAG, result.getCode());
Log.i(TAG, result.getMessage());
Log.i(TAG, result.getData().getOrderId());
Log.i(TAG, result.getData().getStatus()+"");
}
@Override
public void onRequestException(Request request, Exception exception) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, request.toString(), Toast.LENGTH_SHORT).show();
}

@Override
public void onFail(int errorCode, String errorMsg) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, errorCode+":"+errorMsg, Toast.LENGTH_SHORT).show();
}
});

1.4、返回参数说明

参数名称 含义 说明
SmsResult 放短信请求成功时返回的信息
Code 代码
Message 消息
data Result类型的对象
Result.createAt 提交的时间
Result.orderId 提交的流水号
Result.status 提交的状态 1为提交成功

2、短信发送状态报告

2.1、调用函数

api.querySMSState(statusNum, listener);

2.2、请求参数

参数名称 含义 说明
statusNum 每次取得号码数量 必须为数字
listener RequestListener<SmsReport> 短信查状态回调接口

2.3、示例

api.querySMSState(100, new RequestListener() {
@Override
public void onSuccess(SmsReport report) {
// TODO Auto-generated method stub
Log.i(TAG, "-----------------------------查询短信发送状态-------------------------------------");
Log.i(TAG, "code="+report.getCode());
for(SmsRep re:report.getData()){
Log.i(TAG, "-----------------------");
Log.i(TAG, re.getMtId()+"");
Log.i(TAG, re.getResult());
}
}
@Override
public void onRequestException(Request request, Exception exception) {
// TODO Auto-generated method stub
}
@Override
public void onFail(int errorCode, String errorMsg) {
// TODO Auto-generated method stub
Log.i(TAG, errorCode+":"+errorMsg);
}
});

2.4、返回参数说明

参数名称 含义 说明
SmsReport 短信报告成功时返回的信息
code 代码
data SmsRep类型的对象
SmsRep.orderId 提交的流水号
SmsRep.result 结果
SmsRep.status 提交的状态 1为提交成功
SmsRep.mobile 接收短信的手机号码
SmsRep.createAt 提交时间
SmsRep.modifyAt 修改时间

3、上行接口(查询用户所回复的短信)

3.1、调用方法

api.queryUserReply(listener);

3.2、请求参数

参数名称 含义 说明
listener RequestListener<SmsUserReply> 短信上行查询回调

3.3、示例

api.queryUserReply(new RequestListener<SmsUserReply>() {
@Override
public void onSuccess(SmsUserReply object) {
// TODO Auto-generated method stub
Log.i(TAG, "-------------------------------onSuccess------------------------------------------");
Log.i(TAG, object.toString());
}
@Override
public void onFail(int errorCode, String errorMsg) {
// TODO Auto-generated method stub
Log.i(TAG, "-------------------------------onFail------------------------------------------");
Log.i(TAG,errorCode+":"+errorMsg);
}
@Override
public void onRequestException(Request request, Exception exception) {
// TODO Auto-generated method stub
Log.i(TAG, "-------------------------------onRequestException------------------------------------------");
Log.i(TAG,request+":"+exception);
}
});

3.4、返回参数说明

参数名称 含义 说明
SmsUserReply 上行请求成功时返回的信息
code 代码
data List<Reply>类型
Reply.replyId 上行回复的Id
Reply.mobile
Reply.content 回复的内容
Reply.extNo 拓展号
Reply.createAt 提交时间

4、短信验证回调

4.1、调用方法

api.verifySMSTrigger(phone,orderId,listener);

4.2、请求参数

参数名称 函数 说明
phone 手机号码
orderId 短信流水号
listener RequestListener<Integer> 短信验证的回调

4.3、示例

api.verifySMSTrigger("137***527","20161**830000120",new RequestListener<Integer>() {
@Override
public void onSuccess(Integer code) {
// TODO Auto-generated method stub
Log.i(TAG, "短信验证成功");
}
@Override
public void onRequestException(Request request, Exception exception) {
// TODO Auto-generated method stub
}
@Override
public void onFail(int errorCode, String errorMsg) {
// TODO Auto-generated method stub
Log.i(TAG, errorCode+":"+errorCode);
}
});

4.4、返回参数说明

参数名称 含义 说明
Integer 验证成功返回200
errorMsg 请求失败时返回的错误信息

商户流量充值

1、获取流量包

1.1、调用方法

TrafficApi trafficAPI = new TrafficApi(this);
trafficAPI.trafficPackage(phone, listener);

1.2、请求参数

参数名称 含义 说明
phone 手机号码 0:不指定, 1:移动, 2:联通, 3:电信
listener RequestListener<Traffic> 查询流量包回调接口

1.3、示例

trafficAPI.trafficPackage("137***527", new RequestListener<Traffic>() {
@Override
public void onSuccess(Traffic t) {
// TODO Auto-generated method stub
Log.i(TAG, "-----------------------------查询短信发送状态-------------------------------------");
Log.i(TAG, t.getMno());
for(Pack p:t.getPackages()){
Log.i(TAG, "-----------------------");
Log.i(TAG, p.getPackageId()+"");
Log.i(TAG, p.getFlowCount()+"");
}
}
@Override
public void onRequestException(Request request, Exception exception) {
// TODO Auto-generated method stub
Log.i(TAG, "-----------------------------onRequestException-------------------------------------");
Log.i(TAG, request+":"+exception);
}
@Override
public void onFail(int errorCode, String errorMsg) {
// TODO Auto-generated method stub
Log.i(TAG, "-----------------------------onFail-------------------------------------");
Log.i(TAG, errorCode+":"+errorMsg);
}
});

1.4、返回参数说明

参数名称 含义 说明
Traffic 查询成功,返回的流量包信息
mno 运营商类型 移动;联通;电信
packages List<Pack>流量包 移动;联通;电信
Pack.flowCount 流量值(int)
Pack.packageId 流量包Id

2、流量充值

2.1、调用方法

trafficAPI.rechargeFlow(mobile,packageId,flowCount,listener);

2.2、请求参数

参数名称 含义 说明
mobile 手机号码(单个)
packageId 流量包Id 流量包(必须在返回流量包选择内)
flowCount 充值的流量包的值 M为单位
listener RequestListener<ReCharge> 流量充值回调接口

2.3、示例

trafficAPI.rechargeFlow(phone, "1001", 10, new RequestListener() {
@Override
public void onSuccess(ReCharge r) {
// TODO Auto-generated method stub
trafficOrderId = r.getData().getOrderId();
Log.i(TAG, "-----------------------------查询短信发送状态-------------------------------------");
Log.i(TAG, r.toString());
}
@Override
public void onRequestException(Request request, Exception exception) {
// TODO Auto-generated method stub
}
@Override
public void onFail(int errorCode, String errorMsg) {
// TODO Auto-generated method stub
Log.i(TAG, "-----------------------------查询短信发送状态-------------------------------------");
Log.i(TAG, errorCode+":"+errorMsg);
}
});

2.4、返回参数说明

参数名称 含义 说明
ReCharge 流量充值成功时返回的信息
Code 代码
Message 消息
data ReChar类型的对象
ReChar.createAt 提交的时间
ReChar.orderId 提交的流水号
ReChar.customId 提交的时间
ReChar.status 提交的状态 1为提交成功

3、获取流量充值状态(查询之后,数据就会删掉)

3.1、调用方法

trafficAPI.rechargeReport(orderId, listener);

3.2、请求参数

参数名称 含义 说明
orderId 流量充值的流水号 半角逗号(,)分割
listener RequestListener<ChargeReports> 批量查询流量充值状态回调接口

3.3、示例

trafficAPI.rechargeReport(trafficOrderId, new RequestListener<TrafficRechargeReport>() { @Override public void onSuccess(TrafficRechargeReport t) { // TODO Auto-generated method stub Log.i(TAG, "-------------------------------onSuccess------------------------------------------"); Log.i(TAG, t.toString()); } @Override public void onRequestException(Request request, Exception exception) { // TODO Auto-generated method stub Log.i(TAG, "-------------------------------onRequestException------------------------------------------"); Log.i(TAG, request+":"+exception); } @Override public void onFail(int errorCode, String errorMsg) { // TODO Auto-generated method stub Log.i(TAG, "-------------------------------onFail------------------------------------------"); Log.i(TAG, errorCode+":"+errorMsg); } });

2.4、返回参数说明

参数名称 含义 说明
TrafficRechargeReport 流量充值报告
data List<TRReport>
TRReport.orderId
TRReport.mobile
TRReport.result
TRReport.createAt 提交时间
TRReport.status
TRReport.modifyAt 状态修改时间

四、代码混淆

示例

# SDK
-libraryjars libs/lvdouSDK-1.0.jar
# gson
-libraryjars libs/gson-2.2.2.jar
-keep class sun.misc.Unsafe { *; }
-keep class com.google.**{*;}
-keep class com.lvdou.sdk.entity.* { *; }
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

五、注意事项

示例

1. 因为该SDK中已经有集成commons-codec-1.10.jar,gson-2.2.2.jar,okhttp-2.7.5.jar,okio-1.8.0.jar,所以如果您的项目中之前有导入上述的Jar包,请你先删除之前的jar,再导入SDK。

2. SDK中会有打印Log以方便开发者调试,这些都是可以设置的。如果在测试阶段,需要Log,不需要任何设置。上线版本中最好请关闭SDK中的Log的打印。关闭Log的方法为MyLog. closeLog()。

六、Demo &SDK下载

云通讯平台为开发者提供多语言Demo,让您可以轻松地选择你熟悉的编程语言来体验。以下是官方提供的Demo,这些Demo都是开源的,如果你发现错误,我们欢迎你的反馈,同时我们也鼓励开发者提供基于云通讯SDK的项目。

Android - v1.0.0

Lvdou_Android_SDK(Download .zip)

常见问题

Q:绿豆有什么业务

A:我们可以为您提供,便捷的短信业务、稳定的流量通道、优质的语音服务

Q:绿豆都有什么优势

A:一个工作日内,我们即可完成技术对接!三网合一、正规10690号段、到达率高(5秒内可到达)、即时反馈状态(实时查看短信到达情况)、多通道备份(自动切换、避免延误)、价格优惠

Q:关于绿豆云通讯价格

A:在提供优质服务同时,我们更是将价格降到冰点,短信更是低至0.04元/条!且在未开通之前,我们可以免费测试1000条!若是用量大,亦可联系商务同学,申请更低价!

Q:接入绿豆短信SDK后,客户需要做什么

A: 只需要编辑文字,点击发送即可。若出现任何问题,都可以联系客服,每一个客户,我们都有专门的客服对接