业务场景:SP向用户下发一条短信,并设置需要状态回执,用户收到短信后,网关将状态报告通知给CP/SP,CP/SP收到状态报告后,在控制台中打印出来。
开发平台:Eclipse
Step1:创建工程
创建之前请确认你的Eclipse已安装了WTP插件,没有安装的请去这里下:
新建一个Dynamic Web Project ,名字ctcc。
Target Runtime 选择你所使用的服务器版本,如TOMCAT 6.0,Finish.
Step2:导入并解析WSDL
接下来需要导入相关WSDL文件,右键点击工程->Import->File System,选择WSDL地址,导入所有的WSDL:
右键点击WSDL文件(后缀为wsdl的文件),选择Web Service->Generate Java bean skeleton生成接口代码框架。
成功后运行服务器,在IE中输入http://localhost:8080/ctcc/services应该会出现如下页面,显示现有的WEBSERVICE:
Step3:实现SendSms接口及SmsNotification接口
找到cn.com.chinatelecom.www.wsdl.ctcc.sms.send.v2_1.service.SendSmsBindingStub
类(请耐心寻找—。—),在createCall()开始加入下面语句:
org.apache.axis.client.Call _call = (org.apache.axis.client.Call) super.service.createCall();
//设置下行soap头
String fileName = System.getProperty("user.dir")+"//conf//downsoap.properties";
RouteSoapHeader rs = new RouteSoapHeader(fileName,0);
rs.setDownSoapHeader(_call);
其中downsoap.properties是下行SOAPHEADER的配置文件,读出REQUESTSOAPHEADER的各项属性;RouteSoapHeader是SoapHeader的封装解析类,与上下行SOAPHEADER,MD5加密类和上面的WSDL一样由电信提供。
找到cn.com.chinatelecom.www.wsdl.ctcc.sms.notification.v2_1.service.SmsNotificationBindingImpl
类,在notifySmsDeliveryReceipt中添加如下通知代码:
System.out.println("=========调用notifySmsDeliveryStatus接口=========");
System.out.println("correlator:" + correlator);
System.out.println("Address:" + deliveryStatus.getAddress());
System.out.println("DeliveryStatus:" + deliveryStatus.getDeliveryStatus());
Step4:编写主程序
创建一个Test类,代码:
import cn.com.chinatelecom.www.wsdl.ctcc.sms.send.v2_1.service.SendSmsServiceLocator;
import cn.com.chinatelecom.www.wsdl.ctcc.sms.send.v2_1._interface.SendSms;
import cn.com.chinatelecom.www.schema.ctcc.common.v2_1.ChargingInformation;
import cn.com.chinatelecom.www.schema.ctcc.common.v2_1.SimpleReference;
import org.apache.axis.types.URI;
import java.net.URL;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
try {
//网关的url地址,该地址提供短信下发能力
URL url = new URL("http://localhost:8080/ctcc/services/SendSms");
SendSmsServiceLocator ssl = new SendSmsServiceLocator();
SendSms service = ssl.getSendSms(url);
//部分业务逻辑处理在此省略...
URI uri[] = new URI[1];
//手机号码 一般跟SOAP头中的OA一致,都需要以tel:开头
uri[0] = new URI("tel:16989095686"); //终端号码
String message = "你好,短信测试"; //短信内容
String senderName = "1062895932"; //接入码,终端收到短信后显示的主叫
//ChargingInformation 目前暂不处理,但需要填写,变量值值可随意填写
ChargingInformation charging = new ChargingInformation();
charging.setAmount(new java.math.BigDecimal(new java.math.BigInteger("0")));
charging.setCode("123");
charging.setCurrency("456");
charging.setDescription("nihao");
//receiptRequest作用是,当不为空时,则要求网关返回状态报告
SimpleReference receiptRequest = new SimpleReference();
/*
* Correlator
* 该标识唯一,相当于该次下发流程的流水号,由SP生成,
* 将在状态报告接口notifySmsDeliveryReceipt中原样返回给SP,不超30位
* Endpoint InterfaceName目前这两个变量暂时不处理,可任意填写
*/
receiptRequest.setCorrelator("354347657534345");
receiptRequest.setEndpoint(new URI("tel:123"));
receiptRequest.setInterfaceName("sendSms");
//reqId 在请求下发成功后,网关会返回一个唯一标识
String reqId = service.sendSms(uri,senderName,charging,message,receiptRequest);
System.out.println("reqId:" + reqId);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
Step5:运行
cn.com.chinatelecom.www.wsdl.ctcc.sms.notification.v2_1.service.SmsNotificationBindingImpl
类接到通知信息后就会调用notifySmsDeliveryReceipt方法(第三步已写好),输出Dilivery Statu等信息。