C#短信接口开发经验及具体开发实现

2023-11-20

一、配置文件app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="Functions.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <applicationSettings>
        <Functions.Properties.Settings>
            <setting name="Functions_sdk_WebService" serializeAs="String">
                <value>http://sdk.leiyusoft.com:8060/webservice.asmx</value>
            </setting>
        </Functions.Properties.Settings>
    </applicationSettings>
</configuration>


二、WebService功能函数

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;

namespace Functions
{
    public class Function
    {
        static sdk.WebService sms = new sdk.WebService();

        /// <summary>
        /// 普通群发短信mt方法
        /// </summary>
        /// <param name="sn">序列号</param>
        /// <param name="pwd">密码要MD5(SN+PWD)加密,取32位大写</param>
        /// <param name="mobiles">手机号列表</param>
        /// <param name="content">短信内容</param>
        /// <param name="ext">扩展码</param>
        /// <param name="stime">定时时间</param>
        /// <param name="rrid">流水号</param>
        /// <returns>发送结果</returns>
        public static string Mt(string sn, string pwd, string mobiles, string content, string ext, string stime, string rrid)
        {
            string result = sms.mt(sn, pwd, mobiles, content, ext, stime, rrid);
            return CheckResult(result);
        }

        /// <summary>
        /// 个性群发短信gxmt方法
        /// </summary>
        /// <param name="sn">序列号</param>
        /// <param name="pwd">密码要MD5(SN+PWD)加密,取32位大写</param>
        /// <param name="mobiles">手机号列表</param>
        /// <param name="content">短信内容,要经过URLgb2312编码和手机号对应好</param>
        /// <param name="ext">扩展码</param>
        /// <param name="stime">定时时间</param>
        /// <param name="rrid">流水号</param>
        /// <returns>发送结果</returns>
        public static string Gxmt(string sn, string pwd, string mobiles, string content, string ext, string stime, string rrid)
        {
            string result = sms.gxmt(sn, pwd, mobiles, content, ext, stime, rrid);
            return CheckResult(result);
        }

        /// <summary>
        /// 普通群发短信mdSmsSend_u方法
        /// </summary>
        /// <param name="sn">序列号</param>
        /// <param name="pwd">密码要MD5(SN+PWD)加密,取32位大写</param>
        /// <param name="mobiles">手机号列表</param>
        /// <param name="content">短信内容,要经过URLutf-8编码</param>
        /// <param name="ext">扩展码</param>
        /// <param name="stime">定时时间</param>
        /// <param name="rrid">流水号</param>
        /// <returns>发送结果</returns>
        public static string MdSmsSend_u(string sn, string pwd, string mobiles, string content, string ext, string stime, string rrid)
        {
            string result = sms.mdSmsSend_u(sn, pwd, mobiles, content, ext, stime, rrid);
            return CheckResult(result);
        }

        /// <summary>
        /// 查询短信剩余条数
        /// </summary>
        /// <param name="sn">序列号</param>
        /// <param name="pwd">密码要MD5(SN+PWD)加密,取32位大写</param>
        /// <returns>短信剩余条数</returns>
        public static string Balance(string sn, string pwd)
        {
            string result = sms.balance(sn, pwd);
            if (result.StartsWith("-"))
            {
                return "发送失败!" + GetWhy(result) + "。返回值是:" + result;
            }
            return "余额是:" + result;
        }

        static string CheckResult(string result)
        {
            if (result.StartsWith("-"))
            {
                return "发送失败!" + GetWhy(result) + "。返回值是:" + result;
            }
            else
            {
                return "发送成功。流水号是:" + result;
            }
        }

        static string GetWhy(string code)
        {
            switch (code)
            {
                case "-2":
                    return "序列号未注册或加密不对";

                case "-4":
                    return "余额不足";
                case "-6":
                    return "参数错误,请检测所有参数";
                case "-7":

                    return "权限受限";

                case "-9":

                    return "扩展码权限错误";
                case "-10":

                    return "内容过长,短信不得超过500个字符";
                case "-20":

                    return "相同手机号,相同内容重复提交";
                case "-22":

                    return "Ip鉴权失败";

                default:
                    return "错误,请调试程序";
            }
        }
    }
}


 

三、获取短信账户余额

 

参数名称

说明

备注

Sn

软件序列号

格式XXX-XXX-XXX-XXXXX

Pwd

密码

md5(sn+password) 32位大写 密文 +表示连接

函数返回值:String(余额)

接口地址:http://sdk.leiyusoft.com:8060/webservice.asmx?op=balance

示例:序列号SDK-SSD-010-00001 密码 xxxxxx

参数输入:

SN= SDK-SSD-010-00001

PWD= 3B5D3C427365F40C1D27682D78BB31E0

示例返回结果: 余额79109条短信

XML格式:

具体函数C#实现:

    /// <summary>
        /// 获取余额
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_getbalance_Click(object sender, EventArgs e)
        {
         
            sn = tex_sn.Text.Trim();
            password = tex_pwd.Text.Trim();
            string pwd = getMD5(sn + password);
            rich_output.Text=  Function.Balance(sn, pwd);
        }


 

四、普通群发短信

 

参数名称

说明

是否必须   

备注

Sn

软件序列号

格式XXX-XXX-XXX-XXXXX

Pwd

密码

md5(sn+password) 32位大写密文

Mobile

手机号

必填(支持10000个手机号,建议<=5000)多个英文逗号隔开

Content

内容

支持长短信(详细请看长短信扣费说明)

Ext

扩展码

例如:123(默认置空)

stime

定时时间

例如:2010-12-29 16:27:03(非定时置空)

Rrid

唯一标识

最长18位,只能是数字或者 字母 或者数字+字母的组合

函数返回值:String(唯一标识,即当前发送短信批次的唯一标识,和rrid对应,如为空则返回系统生成的rrid),此方法推荐用于大量群发.内容相同手机号多个的情况。

接口地址:http://sdk.leiyusoft.com:8060/webservice.asmx?op=mt

示例1

SN= SDK-SSD-010-00001

PWD=3B5D3C427365F40C1D27682D78BB31E0

Mobile:139***404,138***213…………….

Content:测试

Ext: ""

Stime: ""

Rrid: ""

输出结果:

XML格式:

具体函数C#实现:

   /// <summary>
        /// 发送短信
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_send_Click(object sender, EventArgs e)
        {      
            //获取参数
            getValues();
            //MD5加密密码
            string pwd = getMD5(sn + password);
            rich_output.Text = Function.Mt(sn, pwd, mobile, cont, subcode, stime, "");         
        }


 

五、个性群发短信

 

参数名称

说明

是否必须   

备注

Sn

软件序列号

格式XXX-XXX-XXX-XXXXX

Pwd

密码

md5(sn+password)32位大写密文

Mobile

手机号

必填(建议一次最多提交1000个)

Content

内容

支持长短信(详细请看长短信扣费说明)

Ext

扩展码

例如:123(默认置空)

Stime

定时时间

例如: 2010-12-30 9:23:20(非定时置空)

Rrid

唯一标识

最长18位

函数返回值:String (唯一标识,即当前发送短信批次的唯一标识,和rrid对应,如为空则返回系统生成的rrid,此处的rrid和mt发送的rrid用法相同,此方法用于发送多条内容不相同手机号多个的情况)

接口地址:http://sdk.leiyusoft.com:8060/webservice.asmx?op=gxmt

需要注意:

1、手机号以英文逗号隔开

2、发送内容若含有小逗号,整条内容URLGB2312编码后,以英文逗号隔开,个数和手机号个数一致

3、扩展码可以为空,单个,或多个(以英文逗号隔开,个数和手机号个数一致)

4、定时时间可以为空,单个,或多个(以英文逗号隔开,个数和手机号个数一致)

返回结果:

XML格式:

示例1:

输入参数:

SN= SDK-SSD-010-00001

PWD=3B5D3C427365F40C1D27682D78BB31E0

Mobile:139***404,138***213

Content: %B2%E2%CA%D41, %B2%E2%CA%D42

Ext:(默认,请置空)

Stime: (如果不需要定时,请置空)

Rrid:此处为空(如果填写则系统返回填写内容)

输出结果:

XML格式:

具体函数C#实现:

 private void button3_Click(object sender, EventArgs e)
        {
            string pwd=getMD5(sn+password);
            string mobiles = "18636800125,13817885229";
            string content1 = "张三您好,您本月实发工资3999元。[雷雨科技]";
            content1=    HttpUtility.UrlEncode(content1, Encoding.GetEncoding("gb2312"));
            string content2 = "李四您好,您本月实发工资4999元。[雷雨科技]";
            content2 = HttpUtility.UrlEncode(content2, Encoding.GetEncoding("gb2312"));
            string con = content1 + "," + content2;//短信内容里的逗号要和手机号列表里的个数保持一致
            rich_output.Text =Function.Gxmt(sn, pwd, mobiles, con, subcode, stime, "");
        }


 

六、webservice返回集合对照表:

 

返回值

返回值说明

问题描述

-2 

帐号/密码不正确

1.序列号未注册2.密码加密不正确3.密码已被修改4.序列号已注销

-4

余额不足支持本次发送(或者修改密码长度不正确)

余额不足(或者修改密码长度不在6位到10位之间)

-5

数据格式错误

只能自行调试了。或与技术支持联系

-6

参数有误

看参数传的是否均正常,请调试程序查看各参数

-7

权限受限

该序列号是否已经开通了调用该方法的权限

-8

流量控制错误

-9

扩展码权限错误

该序列号是否已经开通了扩展子号的权限,把ext这个参数置空。

-10

内容长度长

单字节不能超过1000个字符,双字节不能超过500个字符

-11

内部数据库错误

-12

序列号状态错误

序列号是否被禁用

-14

服务器写文件失败

-17

没有权限

如发送彩信仅限于SDK3

-19

禁止同时使用多个接口地址

每个序列号提交只能使用一个接口地址

-20

相同手机号,相同内容重复提交

-22

Ip鉴权失败

提交的IP不是所绑定的IP

-23

缓存无此序列号信息

-601

序列号为空,参数错误

-602

序列号格式错误,参数错误

-603

密码为空,参数错误

-604

手机号码为空,参数错误

-605

内容为空,参数错误

-606

ext长度大于9,参数错误

-607

参数错误 扩展码非数字 

-608

参数错误 定时时间非日期格式

-609

rrid长度大于18,参数错误 

-610

参数错误 rrid非数字

-611

参数错误 内容编码不符合规范

-623

手机个数与内容个数不匹配

-624

扩展个数与手机个数数

-644 

rrid个数与手机个数不一致

注:以上返回值针对个别方法.请具体参看每个用到方法的详细说明。

七、附加说明:

1.接口地址:

常用接口地址:http://sdk.leiyusoft.com:8060/webservice.asmx (一般调用)

多线程接口地址:http://sdk.leiyusoft.com:8061/webservice.asmx (java、andriod使用)

2.其它说明:

(1)开发使用的帐号必须为SDK开头,如SDK-SSD-010-00001,帐号第一次需要调用Register方法注册一次.仅需注册一次即可,信息必须真实

(2)UnRegister与Register配合使用, 连续使用不得超过10次/天;

(3)群发推荐使用接口方法 mt或者mdSmsSend (仅方法名不同);

3. 郑重声明:

(1)禁止相同的内容多个手机号连续一条一条提交. 否则禁用帐号,由此带来损失由客户自行负责.

(2)请客户提供外网服务器IP以便于绑定IP发送,提高账号的安全性!

(3)在程序里最好有配置文件,程序自动判断当某个接口连接超时提交速度变慢时.程序可以自动切换其它的接口以下是推荐的几个服务器,仅接口地址不同而已.方法全部相同;

地址1:http://sdk.leiyusoft.com:8060/webservice.asmx

地址2:http://sdk2.leiyusoft.com:8060/webservice.asmx

这些地址都是标准的webservice地址,C#,Java客户可以按照自己熟悉的方式去解析String   

或者

地址1:http://sdk.leiyusoft.com:8060/webservice.asmx?wsdl

地址2:http://sdk2.leiyusoft.com:8060/webservice.asmx?wsdl

八、示例Demo源代码下载:

DEMO SDK通用版接口文档  所有下载

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#短信接口开发经验及具体开发实现 的相关文章

  • 如何以编程方式将访问键(快捷方式)添加到 WPF ContextMenu?

    我已经有以下内容 var myContextMenu new System Windows Controls ContextMenu var exitItem new MenuItem exitItem Header E xit exitI
  • 如何将这段 javascript 代码重写为 C++11?

    这是我在 Javascript Definitive Guide 中看到的 javascript 闭包代码 我想把它写成C 11 var uniqueID1 function var id 0 return function return
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 无法将参数从 `const char *` 转换为 `char *`

    鉴于此代码 void group build int size std string ips Build the LL after receiving the member list from bootstrap head new memb
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • FluentAssertions ShouldNotThrow 无法识别异步方法/Func

    我正在尝试检查异步方法是否抛出具体异常 为此 我使用 MSTEST 和 FluentAssertions 2 0 1 我已经检查过这个关于 Codeplex 的讨论 http fluentassertions codeplex com wo
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • asp.net core http 如果没有内容类型标头,则删除 `FromBody` 忽略

    我在 http 中使用 bodyDELETE要求 我知道目前删除主体是非标准的 但是允许的 使用时出现问题HttpClient它不允许删除请求的正文 我知道我可以使用SendAsync 但我宁愿让我的 API 更加灵活 我希望这个机构是可选
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • 在 C# .NET 中对非 ASCII 字符进行编码

    我想向我的应用程序发送的电子邮件添加自定义标头 标头名称只能包含 ASCII 字符 但对于值和用户可能会输入 UTF 8 字符 我必须对它们进行 Base64 编码 此外 我还必须将它们解码回 UTF 8 以便在 UI 中向用户显示它们 最
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 展开 std::reference_wrapper 的成本

    Given include
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 如何根据当前日期时间发现财政年度?

    我需要基于当前或今天的日期时间的财政年度 假设我们认为今天的日期是10 April 2011 那么我需要输出为Financial Year 2012在某些情况下 我需要以短格式显示相同的输出FY12 我想以两种方式显示 在我们的要求中 考虑

随机推荐

  • ec6110刷linux系统,华为DIIEC6110M_VER_C主板救砖纯净系统烧录固件包下载

    大家好今天小编跟大家分享关于华为DIIEC6110M VER C主板 强制升级 但是无反应强刷不起作用或短接后只亮一个绿灯 由于盒子厂商系统升级后 屏蔽了强刷模式导致无法使用 短接方式进行强刷 此时短接强刷这条路行不通的时候 需要使用线刷进
  • 2023年4月23日--4月30日(pbr为主,有时间就看看Ue视频教程,50小时,合计2039小时,剩余7961小时)

    按照规划 本周结合工作内容 以Pbr为主 可以从Ue的材质编辑器获取材质参数 写到glsl或者filament引擎 目前 ue视频教程进行到了智 慧 城 市 3 13 mysql 7 1 tf1 4 11 蓝图反射 1 9 moba 1 5
  • mysql 索引类型详解

    索引的类型和存储引擎有关 每种存储引擎所支持的索引类型不一定完全相同 MySQL 索引可以从存储方式 逻辑角度和实际使用的角度来进行分类 存储方式区分 根据存储方式的不同 MySQL 中常用的索引在物理上分为 B 树索引和 HASH 索引两
  • Downie 4 4.6.12 MAC上最好的一款视频下载工具

    Downie for Mac 简介 Downie是Mac下一个简单的下载管理器 可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们 Downie 4 Downie 4 for Mac Downie
  • 编写代码常用快捷键

    编写代码常用快捷键 shift 或 逐个选中字符 ctrl 或 逐词移动光标 ctrl shift 或 逐词选中字符 常用 Home键 将光标移动到行开头 End键 将光标移动到到行结尾 常用 配合shift 或 Shift Home 从光
  • 华为云,站在数字化背后

    一场新的中国数字化战斗 正在被缓缓拉开帷幕 作者 裴一多 出品 产业家 如果说最近的讨论热点是什么 那无疑是互联网云 在数字化进入纵深的当下 一种市面上的观点是互联网的云业务由于盈利等问题 正在成为 被抛弃 的一方 互联网公司开始重新回归T
  • Spyder入门使用教程

    Spyder入门使用教程 Spyder汉化 Spyder汉化博客 创建项目 首先介绍Spyder布局 主要分上面的功能栏和下方的三个区块 点击创建新的项目 选择项目存放的目录 输入项目名 完成项目创建 创建新的文件 按Ctrl S 保存文件
  • Docker 资源汇总

    Docker 资源汇总 转载来源 http codecloud net docker resource 6090 html Menu Main Resources Books Websites Documents Archives Comm
  • Anaconda配置

    Anaconda配置 创建环境 conda create n 环境名 python 3 8 移除环境 conda remove n 环境名 all 查看所有环境 conda env list 激活环境 conda activate 环境名
  • 华为OD机试 - 组装最大可靠性设备(Java )

    题目描述 一个设备由N种类型元器件组成 每种类型元器件只需要一个 类型type编号从0 N 1 每个元器件均有可靠性属性reliability 可靠性越高的器件其价格price越贵 而设备的可靠性由组成设备的所有器件中可靠性最低的器件决定
  • wxwidgets编写多线程程序--wxThread

    细节描述 线程基本上来说是应用程序中一条单独执行的路径 线程有时被称为轻量级进程 但线程与进程的根本不同之处在于不同进程存储空间是相互独立的 而同一进程里的所有线程共享同一地址空间 尽管这使得它更容易共享几个线程间的普通数据 但这也使得它有
  • 企业微信群:机器人实现定时提醒功能

    如果每天都需要 或者经常需要提醒企业微信群里面的人做某一件事情的话 靠人力去实现比较费力 而且偶尔忘记 正好 企业微信群有一个机器人 正可以实现这一功能 1 首先 在企业微信群 添加一个机器人 2 根据企业微信机器人的配置说明 编写程序 这
  • NOSuchKeys: com.aliyun.oss.OSSException: The specified key does not exist.

    出现这个原因就是在指定位置没有找到你想要获取的文件 1 检查你的文件名是否正确 2 你存文件是否带了文件夹 如果带了文件夹 检查文件夹是否正确 本文仅作为笔记
  • List集合的加减操作

    文章目录 一 对List本身有改变 二 对List本身无改变 参考资料 一 对List本身有改变 概述 List1 addAll List2 List1与List2两个集合相加 返回boolean值 原有List1值有变化 List2不变
  • 1-9 人机交互的角度

    操作系统的人机交互部分 OS改善人机界面 为用户使用计算机提供良好的环境 人机交互设备包括传统的终端设备和新型的模式识别设备 OS的人机交互部分用于控制有关设备运行和理解执行设备传来的命令 人机交互功能是决定计算机系统友善性的重要因素 是当
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • "无法找到“XXX.exe”的调试信息,或者调试信息不匹配

    今天调试一C 程序 按下F5 老是弹出一对话框显示信息 debugging information for myproject exe cannot be found or does not match No symbols loaded
  • ros_control学习

    前言 ROS中提供了丰富的机器人应用 SLAM 导航 MoveIt 但是你可能一直有一个疑问 这些功能包到底应该怎么样用到我们的机器人上 也就是说在应用和实际机器人或者机器人仿真器之间 缺少一个连接两者的东西 ros control就是RO
  • MySQL之数据类型

    目录 一 MySQL数据类型分类 二 数值类型 1 整数类型 2 bit类型 3 小数类型 三 字符串类型 1 char 2 varchar 3 char和varchar比较 四 日期和时间类型 五 enum和set 一 MySQL数据类型
  • C#短信接口开发经验及具体开发实现

    一 配置文件app config