PHP(单文件)对接阿里云V3短信签名

PHP(单文件)对接阿里云V3短信签名 PHP (单文件)对接阿里云V3短信签名无需引入sdk封装单文件即可我这里用到了guzzle来发送http请求如果不需要也可以换成原生curl$data[code123456];$aliyunnewAliSms();$result$aliyun-send(1300000000,SMS_500000001,$data,测试平台);if($resulttrue){echo验证码发送成功;}else{echo验证码发送失败;}?phpdeclare(strict_types1);namespaceapp\common\util;useGuzzleHttp\Client;classAliSms{private$smsData;private$smsConfig[keyyou key,secretyou secret,hostdysmsapi.aliyuncs.com,algorithmACS3-HMAC-SHA256];// 发送消息publicfunctionsend($phone,$templateCode,$templateParams[],$templateSign阿里云){date_default_timezone_set(UTC);// 设置时区为GMT// 发短信无需body,所以这里直接写死了bodyself::initSmsData();$query[PhoneNumbers$phone,// 手机号SignName$templateSign,// 短信签名TemplateCode$templateCode,// 短信模板idTemplateParamjson_encode($templateParams,320),// 变量内容];$this-smsData[headers][Authorization]$this-makeSign($query);$httpUrlhttps://.$this-smsConfig[host]./?.http_build_query($query);$result$this-guzzlePost($httpUrl,$this-smsData);// 这里可以用记录请求日志if($result[success]){$aliResultjson_decode($result[data],true);if($aliResult[code]OK){returntrue;}}returnfalse;}// 初始化smsDataprotectedfunctioninitSmsData($post_body){$this-smsData[headers[host$this-smsConfig[host],x-acs-actionSendSms,x-acs-version2017-05-25,x-acs-dategmdate(Y-m-d\TH:i:s\Z),x-acs-signature-noncebin2hex(random_bytes(16)),x-acs-content-sha256hash(sha256,$post_body),]];}// 获得签名protectedfunctionmakeSign($query){// 获得query待签名字符串$queryString$this-getQueryString($query);// 获得headers待签名字符串$headerString$this-getHeaderString();// 获得参与sign签名的key$signHeaderString$this-getSignHeaderString();$canonicalRequestimplode(\n,[POST,/,$queryString,$headerString,$signHeaderString,$this-smsData[headers][x-acs-content-sha256]]);$stringToSign$this-smsConfig[algorithm].\n.hash(sha256,$canonicalRequest);$signaturestrtolower(bin2hex(hash_hmac(sha256,$stringToSign,$this-smsConfig[secret],true)));return$this-smsConfig[algorithm]. Credential.$this-smsConfig[key].,SignedHeaders.$signHeaderString.,Signature.$signature;}// 获得query待签名字符串privatefunctiongetQueryString($query){ksort($query);$params[];foreach($queryas$key$value){if(null$key){continue;}$strrawurlencode($key);if(!$valuenull!$value){$str..rawurlencode($value);}else{$str.;}$params[]$str;}returnimplode(,$params);}// 获得headers待签名字符串privatefunctiongetHeaderString(){uksort($this-smsData[headers],strcasecmp);$headers;foreach($this-smsData[headers]as$key$value){$headers.strtolower($key).:.trim($value).\n;}return$headers;}// 获得参与sign签名的key,以;分隔privatefunctiongetSignHeaderString(){$signedHeadersarray_keys($this-smsData[headers]);sort($signedHeaders,SORT_STRING|SORT_FLAG_CASE);returnimplode(;,array_map(strtolower,$signedHeaders));}// 发送post请求privatefunctionguzzlePost($url,$data){$options[verify]false;// 去除ssl验证$options[timeout]3;// 设置3秒超时时间$clientnewClient([$options]);try{$response$client-post($url,$data);return[successtrue,data$response-getBody()-getContents()];}catch(\Exception$e){return[successfalse,data$e-getMessage()];}}}