业务场景: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:运行
打开服务器并运行,程序会往http://localhost:8080/ctcc/services/SendSms发送短信,发送完毕后返回ReqId,手机收到短信后网关会通知http://localhost:8080/ctcc/services/SmsNotification,
cn.com.chinatelecom.www.wsdl.ctcc.sms.notification.v2_1.service.SmsNotificationBindingImpl
类接到通知信息后就会调用notifySmsDeliveryReceipt方法(第三步已写好),输出Dilivery Statu等信息。

673

被折叠的 条评论
为什么被折叠?



