一、demo:
#include <arpa/inet.h>
#include <assert.h>
#include <errno.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#include <unistd.h>
#define SA struct sockaddr
#define MAXLINE 4096
#define MAXSUB 2000
#define MAXPARAM 2048
#define LISTENQ 1024
//线上线下接口宏开关
#define ONLINE
extern int h_errno;
int sockfd;
char *hostname = "123.59.105.84";
char *send_sms_uri = "/msg/send";
char *query_balance_uri = "/msg/balance";
/**
* * 发http post请求
* */
ssize_t http_post(char *page, char *poststr)
{
char sendline[MAXLINE + 1], recvline[MAXLINE + 1];
ssize_t n;
snprintf(sendline, MAXSUB,
"POST %s HTTP/1.0\r\n"
"Host: sms.253.com\r\n"
"Content-type: application/x-www-form-urlencoded\r\n"
"Content-length: %zu\r\n\r\n"
"%s", page, strlen(poststr), poststr);
write(sockfd, sendline, strlen(sendline));
printf("\n%s", sendline);
printf("\n--------------------------\n");
while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = '\0';
printf("%s\n", recvline);
}
return n;
}
/**
* * 查账户余额
* */
ssize_t get_balance(char *un, char *pw)
{
char params[MAXPARAM + 1];
char *cp = params;
sprintf(cp,"un=%s&pw=%s", un, pw);
return http_post(query_balance_uri, cp);
}
/**
* * 发送短信
* */
ssize_t send_sms(char *un, char *pw, char *phone, char *msg)
{
char params[MAXPARAM + 1];
char *cp = params;
sprintf(cp,"un=%s&pw=%s&phone=%s&msg=%s&rd=1", un, pw, phone, msg);
return http_post(send_sms_uri, cp);
}
int main(void)
{
struct sockaddr_in servaddr;
char str[50];
//建立socket连接
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_addr.s_addr = inet_addr(hostname);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(80);
inet_pton(AF_INET, str, &servaddr.sin_addr);
connect(sockfd, (SA *) & servaddr, sizeof(servaddr));
char *un = "账号";
char *pw = "密码";
char *phone = "手机号";
//必须带签名
char *msg = "【253云通讯】您的验证码是123400";
//get_balance(un, pw);
send_sms(un, pw, phone, msg);
close(sockfd);
exit(0);
}
二、创蓝253云通讯 paas 短信发送接口和定义说明
用户在遵循HTTP或者HTTPS协议的前提下,可通过GET和POST方式提交短信发送请求。
(1)短信提交地址:
短信可以提交不超过50000个手机号码,每个号码用英文逗号间隔。(一次提交发送超过200个手机号码,请使用POST请求)
URL地址为:
http://sms.253.com/msg/send
或 https://sms.253.com/msg/send(安全)
(2) 参数定义:
序号 参数 说明
1 un 必填参数。用户账号
2 pw 必填参数。用户密码
3 phone 必填参数。合法的手机号码,号码间用英文逗号分隔
4 msg 必填参数。短信内容,短信内容长度不能超过536个字符。使用URL方式编码为UTF-8格式。短信内容超过70个字符(企信通是60个字符)时,会被拆分成多条,然后以长短信的格式发送。
5 rd 必填参数。是否需要状态报告,0表示不需要,1表示需要
6 ex 可选参数,扩展码,用户定义扩展码,扩展码的长度将直接影响短信上行接收的接收。固需要传扩展码参数时,请提前咨询客服相关设置问题。
(3)短信提交响应:
用户短信通过http请求提交到服务器后,服务器返回响应码,响应码的格式如下:
响应时间,提交状态
messageid
A、格式说明:
短信提交响应分为两行,第一行为响应时间和提交状态,第二行为服务器给出提交messageid。无论发送的号码是多少,一个发送请求只返回一个messageid,如果响应的状态不是“0”,则没有messageid即第二行数据。(每行以换行符(0x0a,即\n)分割)
B、示例:
(4)提交成功
20161025170822,0
16102517082223817
响应时间为20161025170822,响应状态为0 表明那个成功提交到服务器;16102517082223817为返回的messageid,这个供状态报告匹配时使用。
Ø
20161025170822,101
提交失败
本示例表明用户提交失败,返回错误码为101,服务器端并未返回messageid。
C、响应状态值说明:
代码 说明
0 提交成功
101 无此用户
102 密码错
103 提交过快(提交速度超过流速限制)
104 系统忙(因平台侧原因,暂时无法处理提交的短信)
105 敏感短信(短信内容包含敏感词)
106 消息长度错(>536或<=0)
107 包含错误的手机号码
108
手机号码个数错(群发>50000或<=0)
109 无发送额度(该用户可用短信数已使用完)
110 不在发送时间内
113 extno格式错(非数字或者长度不对)
116 签名不合法或未带签名(用户必须带签名的前提下)
117 IP地址认证错,请求调用的IP地址不是系统登记的IP地址
118 用户没有相应的发送权限(账号被禁止发送)
119 用户已过期
120 违反放盗用策略(日发限制) --自定义添加
121 必填参数。是否需要状态报告,取值true或false
122 5分钟内相同账号提交相同
消息内容过多
123 发送类型错误
124 白模板匹配错误
125 匹配驳回模板,提交失败
126 审核通过模板匹配错误
128 内容解码失败,内容要保证utf-8格式的编码(例如%#+之类的特殊字符要urlencode编码)
(4)注意事项:
用户群发短信如果有审核的限制,则客户的短信必须经过管理人员的审核,审核通过后才能被提交到网关进行短信实际发送。
用户群发短信必须满足手机号码最低个数的限制,低于系统设定的群发最小手机号码数,则该提交请求会被拒绝,响应码为108。
(5)短信发送例子:【创蓝253云通讯】欢迎体验创蓝253云通讯产品,验证码是253253
http://sms.253.com/msg/send?un=N253253&pw=Bdewx3675f&phone=13482416860&msg=【创蓝253云通讯】欢迎体验创蓝253云通讯产品,验证码是253253&rd=1