# 腾讯短信验证Api

腾讯短信验证接口Api编写,后端语言PHP,使用框架ThinkPHP5.1

产品需要实现用户只能使用手机验证码登陆,并且其服务器为腾讯云,因此我们使用的是腾讯短信接口,首先我们在产品中搜索短信,然后进入以下界面:

点击接入指南,我们进入到官方文档,https://cloud.tencent.com/document/product/382/9557 ,然后按照文档所说,获取SDKAppID 和 AppKey

# 获取 SDKAppID 和 AppKey

进入短信控制台,进行应用添加,添加完应用后,点击应用即可看到SDKAppID 和 AppKey。

# 申请签名和模版

一个完整的短信由短信签名短信正文内容两部分组成,两者均需申请和审核,但只有申请完签名才能申请短信正文。

!

若产品只针对国内用户则按以下顺序进行申请即可。

申请完签名后即可申请短信正文,

其中{1},{2}这些可以在项目文件中进行配置,但数字必须按顺序来。

# 配置 SDK

按照文档进行composer或者手动下载均可。

如果是手动下载,则需要在文件中进行引用:

require(__DIR__."/../../../extend/qcloudsms/src/index.php");//注意__DIR__后一定要加/
1

然后在项目文件中按照指定的单发模板进行修改即可:

模板文件如下:

//指定模板单发短信
use Qcloud\Sms\SmsSingleSender;

try {
    $ssender = new SmsSingleSender($appid, $appkey);
    $params = ["5678"];
    $result = $ssender->sendWithParam("86", $phoneNumbers[0], $templateId,
        $params, $smsSign, "", "");  // 签名参数未提供或者为空时,会使用默认签名发送短信
    $rsp = json_decode($result);
    echo $result;
} catch(\Exception $e) {
    echo var_dump($e);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

在实际项目中需要自行修改和配置,如下为tp5.1项目中的配置:

<?php
namespace app\api\controller;
//引入腾讯云短信验证文件
require(__DIR__."/../../../extend/qcloudsms/src/index.php");
use Qcloud\Sms\SmsSingleSender;
use app\api\model\Captcha;
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept,fs-token");
header('Access-Control-Allow-Methods: GET, POST');
class Sms extends  Base
{
    // 短信应用SDK AppID
    private $appid = 1400211624; // 1400开头

        // 短信应用SDK AppKey
    private  $appkey = "429f08cab6c2544bf7ff8065ebaaf8deafafda";

        // 需要发送短信的手机号码
//    public  $phoneNumbers = ["21212313123", "12345678902", "12345678903"];

        // 短信模板ID,需要在短信应用中申请
    private  $templateId = 7839;  // NOTE: 这里的模板ID`7839`只是一个示例,真实的模板ID需要在短信控制台中申请

    private  $smsSign = "XXX"; // NOTE: 这里的签名只是示例,请使用真实的已申请的签名,签名参数使用的是`签名内容`,而不是`签名ID`
    /**
     * 短信验证码发送函数
     * @param $phone char  手机号
     * @return mixed 短信信息或错误信息
     */
    public function send($phone,$pwd){
        if(user_md5($phone)!=$pwd){
            $this->apiReturn(303,'md5验证失败');
        }
        //设置随机验证
        $captcha = mt_rand(100000,999999);
        //将验证码保存到数据库
        $sql = [
            'captcha' => $captcha,
            'phone' => $phone,
            'add_time' => time()
        ];
        //根据手机号查询验证码
        $res = Captcha::getInfoByPhone($phone);
        //如果没有数据 则插入数据  否则更新数据
        if($res){
            //根据手机号进行数据更新
            $res->save([
                'captcha' => $captcha,
                'add_time'=> time()
            ],['phone' => $phone]);
        }else{
            Captcha::create($sql);
        }
        //捕获异常
        try{
            //实例化单发短信对象
            $ssender =  new SmsSingleSender($this->appid,$this->appkey);
            //设置模板对应参数  [验证码,失效时间]
            $params = [$captcha,10];
            //发送短信 86为国家码  返回结果为json数据
            $result = $ssender->sendWithParam("86", $phone, $this->templateId,
                $params, $this->smsSign, "", "");  // 签名参数未提供或者为空时,会使用默认签名发送短信
            //反序列化数据
            $data=json_decode($result);
            //返回结果
            $this->apiReturn(200,'发送成功',$data);
        }catch (\Exception $e){
            //返回错误信息
            $error = $e->getMessage();
            $this->apiReturn(303,$error);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

短信验证接口文件:

/**
 * @title 短信验证接口
 */
class Captcha extends  Base
{
    /**
     * @title 获取短信验证码
     * @description 获取短信验证码 默认6位数,失效时间为10分钟
     * @author 开发者
     * @url /api/captcha/sendRegisterSms
     * @method POST
     * @param name:phone type:char require:1 default:null  desc:手机号
     * @param name:pwd type:char require:1 default:null  desc:验证参数(实际就是手机号)
     */
    public function sendRegisterSms()
    {
        //获得提交的手机号和密码
        $phone = input('phone');
        $pwd=user_md5(input('pwd'));
        //手机号登陆验证
        (new SmsCaptcha())->goCheck();
        //引入短信验证方法
        $sms=new Sms();
        $sms->send($phone, $pwd);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

api接口返回友好信息函数:

/**
 * api接口返回友好信息
 * @param number $code   状态
 * @param string $msg    状态描述
 * @param unknown $data  返回数据
 */
public function apiReturn( $code=200 , $msg='', $data = array() ,$Total=0 ){
    $returnData = array(
        'code' => $code,
        'msg'  => $msg?$msg:return_msg($code),
        'data' => $data,
        'Total'=>$Total
    );
    if(I('callback')){
        echo I('callback').'('.json_encode($returnData).')';die;
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

自定义非常规加密函数:

/**
 * 系统非常规MD5加密方法
 * @param  string $str 要加密的字符串
 * @param  string $auth_key 要加密的字符串
 * @return string
 * @author jry <598821125@qq.com>
 */
function user_md5($str, $auth_key = ''){
    if(!$auth_key){
        $auth_key = config('AUTH_KEY');
    }
    return '' === $str ? '' : md5(sha1($str) . $auth_key);
}
1
2
3
4
5
6
7
8
9
10
11
12
13