项目地址: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算法 + ba
不知道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 '发送成功';
}
} 最佳答案