按照步骤100%发送短信成功。如有疑问:请联系QQ254079335
源代码地址:点击获取源代码
1、 到https://www.yunpian.com/entry/register注册用户名
2、 充值
3、 新增签名
4、 新增短信模板
至此所有的准备工作做好了,开始编程了!
5、 新建mfc程序, (我这里用的是VS2013)
6、 添加一个类ChttpClient,专门用于处理建立http链接,用于和云片通信以及在通信的过程中会遇到的各种格式之间的转换。参考代码:
https://blog.csdn.net/maxwoods/article/details/40422387
需注意:
(1) 其思路为:HttpPost(LPCTSTR strUrl, char * strPostData, string &strResponse)、函数调用ExecuteRequest(L"POST", strUrl, strPostData, strResponse);而ExecuteRequest(L"POST", strUrl, strPostData, strResponse)调用m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : strlen(strPostData));
(2) 这里尤其要注意的是:网页给的参考代码要post的内容是用Cstring类型。但是云片短信平台不支持Cstring类型,支持的是char *类型。因此要将网页中的HttpPost函数和ExecuteRequest函数对应的LPCTSTR strPostData修改成char ;同时最后一项也要修改成char strPostData的长度。及将下面的代码:
m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : _tcslen(strPostData))
修改成:
m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strPostData, strPostData == NULL ? 0 : strlen(strPostData));
这里忙乎了我一上午短信都没有发送成功,最后才发现是云片网不支持访问内容不支持Cstring 类型
(3) HttpPost(LPCTSTR strUrl, char * strPostData, string &strResponse)用法:
strUrl网址,strPostData要传输的内容 ,strResponse网页访问返回的结果,可以从返回的结果得到我们要的值,如剩余多少钱,发送是否成功等等。其中strResponse在ExecuteRequest函数体中已经做了utf8转Unicode转换,可以直接用messagebox显示出来,用于调试时直接读取。
7、 发送信息过程:
(1) 因为发送给云片服务器的信息需要采用UTF8方式传输,而这里调用EncodeToUTF8(const char mbcsStr);形参参数类型是const char mbcsStr,故需要先将Csting类型转成char *类型
USES_CONVERSION;
char *name = T2A(name1);//将CString类型转换成const char *型,要和上句几何使用
char *classNO = T2A(classNO1);
char *date = T2A(date1);
char *course = T2A(course1);
char *mobile = T2A(mobile1);
(2) 将要传递的姓名,班级等信息调用EncodeToUTF8(const char* mbcsStr)函数完成Unicode转UTF8的转换,并依照云片自己定义的模板样式,将模板定义的class、name等和实际的class、name用=号对应起来。这里要注意包括模板中定义的#class#、#name#等都需要用url编码转换(调用UrlEncode函数)。得到的结果为:
tpl_value “%23class%23=1921301&%23name%23=%E7%8E%8B%E7%82%B3%E8%B1%AA&%23date%23=2021%2F1%2F31&%23course%23=%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90”
接下来要将tpl_value的内容再次和apikey,mobile打包在一起,形成http访问网页的参数。
(3) 采用ostringstream的方式(替代sprinf,ostringstream使用更方便)将tpl_value的内容和apikey,mobile的内容按照*第二步:按照云片的参数要求,组合成按照模块要发送的内容,注意:每一个参数用url编码方式。而且注意即使tpl_value的值上面经过了一次url转换,这里仍然需要将其再次进行url转换。因为上面的url转换只是将class,name等内容进行了url编码,但是上面tpl_value中还包含“=”号没有进行转换。故这里要再次转换。下面的tpl_value值和post_data值可以明显看到:“=”被“3D” 代替了
tpl_value “%23class%23=1921301&%23name%23=%E7%8E%8B%E7%82%B3%E8%B1%AA&%23date%23=2021%2F1%2F31&%23course%23=%E7%94%B5%E8%B7%AF%E5%88%86%E6%9E%90” std::basic_string<char,std::char_traits,std::allocator >
post_data “tpl_id=4268968&tpl_value=%2523class%2523%3D1921301%26%2523name%2523%3D%25E7%258E%258B%25E7%2582%25B3%25E8%25B1%25AA%26%2523date%2523%3D2021%252F1%252F31%26%2523course%2523%3D%25E7%2594%25B5%25E8%25B7%… std::basic_string<char,std::char_traits,std::allocator >
8、 将post_data由string型转换成char *postdata,因为int HttpPost(LPCTSTR strUrl, char * strPostData, string &strResponse);需要char *参数
9、 调用PostYunpian.HttpPost(url_tpl_sms, postdata, response);函数将postdata推送至云片服务商,发出短信。其中云片返回的内容放置在response中。
10、 用以下代码去判断发送是否成功?
int found = Cresponse.Find(L”“code”:0");
if (found != -1)
{
AfxMessageBox(L"发送成功!");
}
else {
// 失败
AfxMessageBox(L"发送失败!");
}
11、 后来又在程序的后面加入了读取短信记录的代码。过程类似
12、 将访问云片网页返回的内容写入文件,加入以下语句即可:
static const char *pagefilename = “respone.txt”;
//static const char *pagefilename = “.\x64\Release\respone.txt”;//注意即使是在win32console中也要用双\号才能正确表示路径!
//static const char *pagefilename = “E:\东华理工大学\课件\移动物联网\云片示例\读取状态报告写入文件\x64\Release\respone.txt”;
FILE *pagefile;
//写入到文件
bool sucess = fopen_s(&pagefile, pagefilename, "wb");//打开response.txt文件(如果没有会建立)
if (sucess == 0)
{
MessageBox(L"打开或者建立respone.txt成功!");
}
if (pagefile)
{
fputs(RecordResponse.c_str(), pagefile);//将string转化为const char*后写入response文本。
//对response文本进行操作。当遇到"}"时自动换行
fclose(pagefile);
}
13、 修改存入文本后看上去乱:思路,找到}项,在}项的后面第二个字符插入换行符/n.代码见下:
unsigned int i = 0;//因为 RecordResponse.size()返回的是无符号整形,所有这里i的定义也要为无符号整形,否则定义成int型会报错。
unsigned int iSize = RecordResponse.size();
for (i = 0; i < iSize; i++)
{
if (RecordResponse[i] == '}')
{
RecordResponse.insert(i + 2, "\n");//因为}后还有逗号,故要在i+2的位置插入。
i++; //因为插入了一个符号,因此可以通过i++加快插入过程
}
14、 至此,大告成功!
本文介绍了如何通过HTTP(S)协议使用云片服务发送短信,从注册、充值、设置签名和模板,到在VS2013中创建MFC程序,处理HTTP请求和响应,包括数据的URL编码转换,最终实现短信发送和接收状态报告的过程。
4920

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



