如何用webservice实现短信发送

zwh3824 2010-08-06 12:49:32
WebService接口
当前版本V1.2
Web Service地址: GB2312网关 http://gateway.woxp.cn:6630/gb2312/ws_api/WebSMS.asmx
UTF-8 网关 http://gateway.woxp.cn:6630/utf8/ws_api/WebSMS.asmx

公共参数说明
string eid_pwd_gateId
详细说明
用户身份标识串,由【企业ID号-会员账号-密码MD5-通道ID】组成。中间用"-"分隔开.
例如10002-admin-87373df3f89fa9932a9c6c58cc75e309-100(通道是可选值,不提供该值,系统使用默认通道),MD5不区分大小写
该值可通过GetIdentityMark函数获取.

获取网关身份识别字符串,供网关功能调用前的验证
public string GetIdentityMark(int Eid, string uid, string pwd, int gateId)
参数名称 参数说明
Eid 企业ID代码,个人用户为0
uid 注册时的账号
pwd 登陆密码.
gateId 短信通道ID,详细请参考通道说明

返回值说明
返回用户身份标识字符串

根据错误ID号,返回详细错误描述
public string GetErrorHint(int ErrorId)
参数名称 参数说明
ErrorId 错误的ID号。操作失败后的ID号

返回值说明
返回错误ID号的中文描述

获取指定通道的关键字屏蔽字符串
public string GetBadKeyWords(string eid_pwd_gateId)
参数名称 参数说明
eid_pwd_gateId 用户标识字符串,设定通道ID号

返回值说明
执行成功,返回指定通道的关键字屏蔽字符串,之间用'|'分开。

快速发送短信,直接提交到网关。
public SendResult FastSend(string eid_pwd_gateId,string No_List, string Memo, string SendTime,string strSubId)
参数名称 参数说明
TargetNo 发送对方的手机号码,多个用','分开。每次最多提交100条.是否支持移动还是联通或者小灵通请参考通道说明
MsgContent 发送短信内容,长度要求请参考通道说明
DateTime 定时发送时间,必须大于当前时间.空代表立即发送
strSubId 如果通道支持子号码扩展,值为子号码.否则使用空值

返回值说明
返回SendResult类型。显示发送详细状态
/// <summary>
/// 返回发送状态,大于0代表成功
/// </summary>
属性名: RetCode

/// 被屏蔽的关键字
/// </summary>
属性名: BlackWords

/// <summary>
/// 发送失败号的码列表,","分开
/// </summary>
属性名: FailNo

/// <summary>
/// 被屏蔽的号码列表,","分开
/// </summary>
属性名: ShieldNo

/// <summary>
/// 错误的描述
/// </summary>
属性名:ErrorDesc

长短信格式发送,最大支持300字,64字计费,建议短信内容控制在130字以内
public SendResult FastSendLongSMS(string eid_pwd_gateId, string TargetNo, string MsgContent, string SendTime, string strSubId)
参数名称 参数说明
TargetNo 发送对方的手机号码,多个用','分开。每次最多提交100条.是否支持移动还是联通或者小灵通请参考通道说明
MsgContent 发送短信内容,长度要求请参考通道说明
DateTime 定时发送时间,必须大于当前时间.空代表立即发送
strSubId 如果通道支持子号码扩展,值为子号码.否则使用空值

返回值说明
返回SendResult类型。显示发送详细状态
/// <summary>
/// 返回发送状态,大于0代表成功.返回短信计费总条数
/// </summary>
属性名: RetCode

/// 被屏蔽的关键字
/// </summary>
属性名: BlackWords

/// <summary>
/// 发送失败号的码列表,","分开
/// </summary>
属性名: FailNo

/// <summary>
/// 被屏蔽的号码列表,","分开
/// </summary>
属性名: ShieldNo

/// <summary>
/// 错误的描述
/// </summary>
属性名:ErrorDesc

快速安全发送短信,直接提交到网关。参数需要加密
public SendResult FastSend_Safe(int nKeyId,string eid_pwd_gateId, string TargetNo, string MsgContent, string SendTime, string strSubId)
参数名称 参数说明
nKeyId 密钥的ID,由客服人员提供
eid_pwd_gateId 需要加密.同上
TargetNo 需要加密,同上
MsgContent 需要加密,同上
DateTime 可选参数 需要加密,同上
strSubId 可选参数 需要加密,同上

返回值说明
返回SendResult类型。显示发送详细状态
/// <summary>
/// 返回发送状态,大于0代表成功
/// </summary>
属性名: RetCode

/// 被屏蔽的关键字
/// </summary>
属性名: BlackWords

/// <summary>
/// 发送失败号的码列表,","分开
/// </summary>
属性名: FailNo

/// <summary>
/// 被屏蔽的号码列表,","分开
/// </summary>
属性名: ShieldNo

/// <summary>
/// 错误的描述
/// </summary>
属性名:ErrorDesc

主动接收回复的短信(需被动接收短信请联系客服人员)
public string ReadXml(string eid_pwd_gateId)
返回值说明
<ReadSMS> <!--收到短信开始-->
<Item><!--如果有多条循环此节-->
<Id>10254</Id> <!-- 编号,唯一值-->
<SenderNo>13405886058</SenderNo><!--回复者号码-->
<MsgContent>星信:我时工作顺利用这</MsgContent><!--回复短信内容-->
<SendTime>2008-03-14 23:07:39</SendTime><!--回复时间-->
<SP_PID>1065810889988</SP_PID> <!-回复到SP号的号码-->
<subNo>101</subNo> <!--客户扩展子号码-->
</Item>
</ReadSMS>

查询当前账户余额
public double GetMoney(string eid_pwd_md5)
参数名称 参数说明
eid_pwd_md5 用户身份标识串,不需要通道ID号

返回值说明
返回当前用户金额,-1代表操作失败

查询当前账户条数
public int GetBalanceCount(string eid_pwd_md5)
参数名称 参数说明
eid_pwd_md5 用户身份标识串,不需要通道ID号

返回值说明
返回当前用户剩余短信条数,-1代表操作失败

用户修改登陆密码
public int EditPWD(string eid_pwd_md5,string newPwd)
参数名称 参数说明
eid_pwd_md5 用户身份标识串,不需要通道ID号
newPwd 新密码

返回值说明
1执行成功,其它值请调用错误函数获取详细信息


------------------------------------------------------------------------
以上是webservice接口,不知道如何用java实现“短信发送”这一功能,下面代码是
java调用webservice接口方法

文章分类:Java编程
webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使用的接口。今天搜索到了非常好的 webservice provider列表

http://www.webservicex.net/WCF/default.aspx

这上面列出了70多个包括很多方面的free webservice provider,utilities->global weather就可以获取全球的天气预报。

下面我们来看Java如何通过WSDL文件来调用这些web service:

注意,以下的代码并没有经过真正的测试,只是说明这些情况,不同版本的Axis相差很大,大家最好以apache网站上的例子为准,这里仅仅用于说明其基本用法。

1,直接AXIS调用远程的web service

我觉得这种方法比较适合那些高手,他们能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是专门搞这行的,即使一段时间看懂,后来也就忘记了。直接调用模式如下:

import java.util.Date;

import java.text.DateFormat;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import javax.xml.namespace.QName;

import java.lang.Integer;

import javax.xml.rpc.ParameterMode;



public class caClient {



public static void main(String[] args) {



try {

String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";

//直接引用远程的wsdl文件

//以下都是套路
Service service = new Service();

Call call = (Call) service.createCall();

call.setTargetEndpointAddress(endpoint);

call.setOperationName("addUser");//WSDL里面描述的接口名称

call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,

javax.xml.rpc.ParameterMode.IN);//接口的参数

call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型


String temp = "测试人员";

String result = (String)call.invoke(new Object[]{temp});

//给方法传递参数,并且调用方法

System.out.println("result is "+result);

}

catch (Exception e) {

System.err.println(e.toString());

}

}

}

2,直接SOAP调用远程的webservice

这种模式我从来没有见过,也没有试过,但是网络上有人贴出来,我也转过来

import org.apache.soap.util.xml.*;

import org.apache.soap.*;

import org.apache.soap.rpc.*;



import java.io.*;

import java.net.*;

import java.util.Vector;



public class caService{

public static String getService(String user) {

URL url = null;

try {

url=new URL("http://192.168.0.100:8080/ca3/services/caSynrochnized");

} catch (MalformedURLException mue) {

return mue.getMessage();

}

// This is the main SOAP object

Call soapCall = new Call();

// Use SOAP encoding

soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

// This is the remote object we're asking for the price

soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");

// This is the name of the method on the above object

soapCall.setMethodName("getUser");

// We need to send the ISBN number as an input parameter to the method

Vector soapParams = new Vector();



// name, type, value, encoding style

Parameter isbnParam = new Parameter("userName", String.class, user, null);

soapParams.addElement(isbnParam);

soapCall.setParams(soapParams);

try {

// Invoke the remote method on the object

Response soapResponse = soapCall.invoke(url,"");

// Check to see if there is an error, return "N/A"

if (soapResponse.generatedFault()) {

Fault fault = soapResponse.getFault();

String f = fault.getFaultString();

return f;

} else {

// read result

Parameter soapResult = soapResponse.getReturnValue ();

// get a string from the result

return soapResult.getValue().toString();

}

} catch (SOAPException se) {

return se.getMessage();

}

}

}

3,使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用,即可。

这是像我这种懒人最喜欢的方式,仍然以前面的global weather report为例。

首先 java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/globalweather.asmx.WSDL

原本的网址是http://www.webservicex.net/globalweather.asmx?WSDL,中间个各问号,但是Linux下面它不能解析,所以去掉问号,改为点号。

那么就会出现4个文件:

GlobalWeather.java GlobalWeatherLocator.java GlobalWeatherSoap.java GlobalWeatherSoapStub.java
其中GlobalWeatherSoap.java是我们最为关心的接口文件,如果你对RMI等SOAP实现的具体细节不感兴趣,那么你只需要看接口文件即可,在使用的时候,引入这个接口即可,就好像使用本地类一样。

希望有高手帮忙!


...全文
1340 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
HuiTouKeDuanXin 2012-12-03
  • 打赏
  • 举报
回复
我这也有个演示代码 $mobile = "13600000000,18600000000"; // 多个号码可用逗号分隔,最多200个 $content = "test"; // 发送内容,不建议太长 $encode = "gb2312"; // 字符编码,可选参数 //可传 notify 或 ad , adcard,adfangchan,dxztd 五参数, notify: 表示通知类, ad: 表示106通道广告类,adcard: 表示卡发通道广告类, adfangchan:表示106房产专用通道,dxztd:表示低限制通道, $smstype = 'ad'; $url= "http://6506-3abfb.sms-api.63810.com/api/sms_send?"; //接口地址,到 http://www.htkdx.com/api/doc ;获取 $url.= "user=985985&";//用户名,到http://www.htkdx.com/api/doc获取 $url.= "hash=ef38ed03c66603421ba24c52e20efcb7&";//用户名HASH值,到http://www.htkdx.com/api/doc获取 $url.= "encode=$encode&"; $url.= "smstype=$smstype&"; $url.= "mobile=".urlencode($mobile)."&content=".urlencode($content).""; $ctx = stream_context_create(array( 'http' => array( 'timeout' => 30, 'header' => "User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;YNSMS API v1.0;)" ) ) ); $r = file_get_contents($url, 0, $ctx); $rs = json_decode($r, true); if ( !$rs['result'] ) { echo "失败原因:错误代码:".$rs['errcode'].',中文:'.$rs['msg']; //file_put_contents ('./sms_log.txt',"短信发送失败:失败原因:错误代码".$rs['errcode'].',中文:'.$rs['msg'],FILE_APPEND); }else{ echo "发送成功了!"; }
时空琴弦 2011-11-19
  • 打赏
  • 举报
回复
辛苦了!
zwh3824 2010-08-17
  • 打赏
  • 举报
回复
这个问题,我已经解决了。还是不是很难。。。
mrshelly 2010-08-06
  • 打赏
  • 举报
回复
没兴趣..

可以找联通要企信通..

直接 socket 发送...

24,923

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Apache
社区管理员
  • Apache
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧