對接阿里云V3短信簽名)
PHP (單文件)對接阿里云V3短信簽名無需引入sdk封裝單文件即可我這里用到了guzzle來發(fā)送http請求如果不需要也可以換成原生curl$data[code123456];$aliyunnewAliSms();$result$aliyun-send(1300000000,SMS_500000001,$data,測試平臺);if($resulttrue){echo驗(yàn)證碼發(fā)送成功;}else{echo驗(yàn)證碼發(fā)送失敗;}?phpdeclare(strict_types1);namespaceapp\common\util;useGuzzleHttp\Client;classAliSms{private$smsData;private$smsConfig[keyyou key,secretyou secret,hostdysmsapi.aliyuncs.com,algorithmACS3-HMAC-SHA256];// 發(fā)送消息publicfunctionsend($phone,$templateCode,$templateParams[],$templateSign阿里云){date_default_timezone_set(UTC);// 設(shè)置時區(qū)為GMT// 發(fā)短信無需body,所以這里直接寫死了bodyself::initSmsData();$query[PhoneNumbers$phone,// 手機(jī)號SignName$templateSign,// 短信簽名TemplateCode$templateCode,// 短信模板idTemplateParamjson_encode($templateParams,320),// 變量內(nèi)容];$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));}// 發(fā)送post請求privatefunctionguzzlePost($url,$data){$options[verify]false;// 去除ssl驗(yàn)證$options[timeout]3;// 設(shè)置3秒超時時間$clientnewClient([$options]);try{$response$client-post($url,$data);return[successtrue,data$response-getBody()-getContents()];}catch(\Exception$e){return[successfalse,data$e-getMessage()];}}}