TP5之独立封装阿里大于

浏览:1160 发布日期:2017/12/01 分类:ThinkPHP5专区 关键字: TP5 阿里大于
先附上个人博客:http://www.hanjiaxin.com
项目地址:https://github.com/Han-MeiM/hjx-Hold-all
这里主要是讲如何不使用阿里大于官方SDK的情况下。
通过http接口进行调用验证码。
官方文档https://help.aliyun.com/document_detail/56189.html?spm=5176.doc55284.6.577.l4UcSK
该项目中的 accessKeyId 以及 accessSecret 是如何获取的,就请自行百度吧,此处跳过500字。
一、拼接请求参数
先根据官方文档的说明。
凑齐所需的七龙珠(请求参数)。
/application/extra/Alicode.php
这是TP5中的扩展配置文件。<?php
return [
    'AccessKeyId'              => '', // 访问密钥,在阿里云的密钥管理页面创建
    'TemplateCode'             => '', // 短信模板ID
    'AccessSecret'             => '', // 访问密钥,在阿里云的密钥管理页面创建
];
$request_paras         =  array(
            'RegionId'         => 'cn-hangzhou', // API支持的RegionID,如短信API的值为:cn-hangzhou
            'AccessKeyId'      => config('alicode.AccessKeyId'), // 访问密钥,在阿里云的密钥管理页面创建
            "Format"           => 'JSON', // 返回值类型,没传默认为JSON,可选填值:XML
            "SignatureMethod"  => 'HMAC-SHA1', // 编码(固定值不用改)
            "SignatureVersion" => '1.0', // 版本(固定值不用改)
            'SignatureNonce'   => uniqid(mt_rand(0, 0xffff), true), // 用于请求的防重放攻击的唯一加密盐
            'Timestamp'        => date('Y-m-d\TH:i:s\Z'), // 格式为:yyyy-MM-dd’T’HH:mm:ss’Z’;时区为:GMT
            'Action'           => 'SendSms', // API的命名,固定值,如发送短信API的值为:SendSms
            'Version'          => "2017-05-25", // API的版本,固定值,如短信API的值为:2017-05-25
            'PhoneNumbers'     => $phoneNumArg, // 短信接收号码
            'SignName'         => '测试', // 短信签名
            'TemplateCode'     => config('alicode.TemplateCode'), // 短信模板ID
            'TemplateParam'    => json_encode([ // 短信模板变量替换JSON串
                "code"         => $codeArg
            ]),
        );
        // 按键值排序
        ksort($request_paras);
二、签名public function sign($url)
{
    $url = urlencode($url);
    str_replace("+","%20",$url);
    str_replace("*","%2A",$url);
    str_replace("%7E","~",$url);
    return $url;
}
三、构造待签名的请求串
/extend/dysms/Dysms.php
通过官方文档特殊的URL编码。
生成待签名的请求串
第1步:先将请求参数拼接成串。$requestUrl = "";
foreach ($request_paras as $apiParamKey => $apiParamValue) {
    $requestUrl .= "$apiParamKey=" . urlencode($apiParamValue) . "&";
}
// 清除最后一个&
$requestUrl = substr($requestUrl, 0, -1);
第2步:按POP的签名规则拼接成最终的待签名串。$requestUrl = sign('GET&/&' . $requestUrl);四、签名
根据官方文档说明。
签名采用HmacSHA1算法 + base64,编码采用:UTF-8。
不知道HmacSHA1算法是什么的同学。
请参考hash_hmac函数。$sign = sign(base64_encode(hash_hmac('sha1', $requestUrl , $app_secret . '&', true)));五、发送请求
最后就拼接下get请求参数。
发送验证码了哦$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_URL, $request_host . '?' . $requestUrl . '&Signature=' . $sign);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($ch);
$info = curl_getinfo($ch);

curl_close($ch);
return $ret;
六、调用实例
/application/smscode/controller/Smscode.php/**
 * 阿里大于发送短信
 */
 public function ali_smscode(){
     $phone = 18000000000;
     $code = mt_rand(1000,9999);
     // 实例化类
     $wxpay = new \alicode\Dysms();
     $result = $wxpay->send($phone,$code);
     if ($result['Code'] == 'OK')
     {
        echo '发送成功';
     }
}
最佳答案
评论() 相关
后面还有条评论,点击查看>>