C++如何调用SDK发送短信验证码

135 阅读2分钟

前言

在c++ 相关的程序设计程序中,有时我们客户需求会要求添加短信提醒/短信验证等功能,然而,市场上的大部分短信平台,对c/c++支持都不算友好,查阅了诸多短信平台,发现大部分平台相关的功能都不是特别完善,就得想办法。

有人,自己用c/c++从头到尾,自己实现了一套短信的c++ sdk,但是用起来,呵呵,效果可想而知。

但是我们换个角度想一想,短信平台提供的SDK 大部分都包含 python,java,go...等等。

1、python 和 java 都是解释性语言,可以用c++调用python的c库 和jni当作解决方案。

但是这两种语言用c++调用起来很繁琐,要求稍微有些高,程序做好后,很可能短信没发出去程序先崩溃了,还有各种乱七八糟的问题,所以我选择统统pass掉。

2、go语言,译型、跨平台的,在各种平台上都是能以机器码的形式运行,用 go 版本sdk,显然会简单不少。

另外go的模块,扩展名都为 .a,与c/c++语言的静态库,存在着千丝万缕的联系,我们可以通过go的工具把go程序直接编译位静态库,供给c++调用。

具体操作如下:

1、安装go 运行环境

Windows直接下载安装包

安装包下载地址为:golang.org/dl/

如果打不开可以使用这个地址:golang.google.cn/dl/

ubuntu 18.04 : sodu apt-get install golang

2、下载依赖包

Uni Go SDK 提供 Go Module,可从公共 Github 仓库 中获得。

在项目中添加 uni-go-sdk 作为依赖:

go get github.com/apistd/uni-go-sdk

hello.go代码类似如下

package main
 
import (
        "fmt"
          "github.com/apistd/uni-go-sdk"
          "C"
  
)
 
func main() {
}
 
//export SendSms
func SendSms(phoneNumber,params string){
 
        client, err := dysmsapi.NewClientWithAccessKey("cn-hangzhou", "Unisms的accessKeyId", "accessKeySecret")
        request := dysmsapi.CreateSendSmsRequest()
        request.Scheme = "https"        
        request.PhoneNumbers = phoneNumber
        request.SignName = "XXXXX"
          request.TemplateCode = "XXXXX"
          request.TemplateParam = params
          response, err := client.SendSms(request)
        if err != nil {
                fmt.Print(err.Error())
        }
        fmt.Printf("response is %#v\n", response)
        
 
}

3、生成静态库

go build -buildmode=c-archive hello.go

执行完毕后就会生成 hello.a 和 hello.h两个文件,其中hello.a为静态库,hello.h为c++调用的头文件。

把这两个文件添加到c++ 工程,我们就会很愉快的调用函数SendSmS了。

#include <QCoreApplication>
#include <hello.h>
#include <string>
 
void __sendSmS(const std::string &phoneNumber,const std::string & params){
    GoString gphone{phoneNumber.c_str() ,static_cast<ptrdiff_t>(phoneNumber.length()) };
    GoString gparams{params.c_str(),static_cast<ptrdiff_t>(params.length())};
    SendSms(gphone,gparams);
}
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    __sendSmS("1350000000","{\"name\":\"1357656\",\"place\":\"浙江\",\"time\":\"2023-02-24\",\"type\":\"警报\"}");
 
    return a.exec();
}

此文会不定期更新、欢迎大家留言讨论和沟通相关问题!