時間: 2019-04-01 來源: 華興軟通 本文鏈接:http://www.teamonsters.com.cn/news_jishufangan1.html
在我們的工作生活中,使用各類網站、APP時,無論注冊、支付,還是修改密碼等情境下,都被要求獲取短信驗證碼進行驗證,那么驗證碼是如何發送的呢?接下來小編以華興云短信為例,為大家詳細介紹一下php發送短信驗證碼的實現過程(同時實現防刷短信驗證碼機制,加密通信)。
一、實現思路
二、實現流程
1、注冊賬號
注冊華興云短信賬號,填寫基本信息,會有專人聯系開戶,并預送少量短信供測試使用。
2、下載接口
點擊“產品中心”,進入產品頁,選擇對應的php安全云短信接口及HTTPS版云短信接口文檔下載;下載完畢文檔如下:
3、配置參數變量
配置demo_https.php文件:
(1)將demo_https.php文件中的curlPost,curlGet,sendSMS三個方法拷貝到項目中相應的位置,如果有需求獲取余額的,同時拷貝getBalance方法。
(2)將sendSMS方法中的注冊碼($reg_code),密碼($reg_pw),簽名($signature),短信內容($content )修改成自己的信息。注意:短信內容可能需要報備。
(3)將目標手機號和內容根據代碼里面的注釋規則修改,在需要發送短信的地方調用sendSMS這個方法就可以了。
4、報備短信模板
將待發內容提交至華興客服工作人員,由工作人員進行黑名單、敏感詞等檢查,完成報備工作。
5、調用接口測試短信
完成前期的一系列準備工作,實際測試調用php云短信接口的短信發送情況。
三、運行代碼
查看HTTPS版云短信接口文檔查看接口地址,參數說明及示例,調用下圖代碼配置好參數后,調用該方法測試發送短信,打印返回值,可查看文檔中錯誤碼
image_captcha.php生成圖片驗證碼(防刷機制)
<?php
/**
* 字母+數字的驗證碼生成
*/
// 開啟session
session_start();
//1.創建黑色畫布
$image = imagecreatetruecolor(100, 30);
//2.為畫布定義(背景)顏色
$bgcolor = imagecolorallocate($image, 255, 255, 255);
//3.填充顏色
imagefill($image, 0, 0, $bgcolor);
// 4.設置驗證碼內容
//4.1 定義驗證碼的內容
$content = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
//4.1 創建一個變量存儲產生的驗證碼數據,便于用戶提交核對
$captcha = "";
for ($i = 0; $i < 4; $i++) {
// 字體大小
$fontsize = 10;
// 字體顏色
$fontcolor = imagecolorallocate($image, mt_rand(0, 120), mt_rand(0, 120), mt_rand(0, 120));
// 設置字體內容
$fontcontent = substr($content, mt_rand(0, strlen($content)), 1);
$captcha .= $fontcontent;
// 顯示的坐標
$x = ($i * 100 / 4) + mt_rand(5, 10);
$y = mt_rand(5, 10);
// 填充內容到畫布中
imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);
}
$_SESSION["captcha"] = $captcha;
//4.3 設置背景干擾元素
for ($$i = 0; $i < 200; $i++) {
$pointcolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
imagesetpixel($image, mt_rand(1, 99), mt_rand(1, 29), $pointcolor);
}
//4.4 設置干擾線
for ($i = 0; $i < 3; $i++) {
$linecolor = imagecolorallocate($image, mt_rand(50, 200), mt_rand(50, 200), mt_rand(50, 200));
imageline($image, mt_rand(1, 99), mt_rand(1, 29), mt_rand(1, 99), mt_rand(1, 29), $linecolor);
}
//5.向瀏覽器輸出圖片頭信息
header('content-type:image/png');
//6.輸出圖片到瀏覽器
imagepng($image);
//7.銷毀圖片
//imagedestroy($image);
index.html前端代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>短信驗證碼</title>
</head>
<body>
<form action="./sendsms.php" method="post">
<div>
手機號:<input id="phone" type="text" name="phone" value="" />
</div>
<div>驗證碼: <input type="text" name="captcha" placeholder="請輸入圖片中的驗證碼">
<img src="image_captcha.php" onclick="this.src='image_captcha.php?'+new Date().getTime();" width="100" height="100"><br/></div>
<div> <input type="submit" value="驗證"></div>
</form>
</body>
</html>
sendsms.php后端運行代碼:
<?php
/**
* 接受用戶登陸時提交的驗證碼
*/
session_start();
//1. 獲取到用戶提交的驗證碼、手機號
$phone = $_POST['phone'];//手機號
$captcha = $_POST["captcha"];
//2. 將session中的驗證碼和用戶提交的驗證碼進行核對,當成功時提示驗證碼正確,并銷毀之前的session值,不成功則重新提交
if(strtolower($_SESSION["captcha"]) == strtolower($captcha)){
echo $_POST["captcha"]."驗證碼正確!";
$_SESSION["captcha"] = "";
if(preg_match_all("/^1[34578]\d{9}$/", $phone)) {
//得到手機號
$url = 'https://www.stongnet.com/sdkhttp/sendsms.aspx';
$reg_code = '101100-WEB-HUAX-111111'; //華興軟通注冊碼,請在這里填寫您從客服那得到的注冊碼
$reg_pw = '11111111'; //華興軟通注冊碼對應的密碼,請在這里填寫您從客服那得到的密碼
$source_add = ''; //子通道號(最長10位,可為空
//$phone = '15891234567'; //手機號碼(最多1000個),多個用英文逗號(,)隔開,不可為空
$content = '華興軟通驗證碼:' . range(1000,9999);; //短信內容(含有中文,特殊符號等非ASCII碼的字符,用戶必須保證其為UTF-8編碼格式)
$param_arry = array();
$param_arry['reg'] = $reg_code;
$param_arry['pwd'] = $reg_pw;
$param_arry['sourceadd'] = $source_add;
$param_arry['phone'] = $phone;
$param_arry['content'] = $content;
$ca_info = dirname(__FILE__) . '/cacert.pem'; //根證書文件路徑,相對路徑和絕對路徑均可,推薦使用絕對路徑;demo里文件和源碼放在一起了,為了安全證書文件最好不要和應用代碼放在一起
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($param_array));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); //驗證交換證書
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //檢查SSL證書公用名是否存在,并且是否與提供的主機名匹配
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); //設置實現協議為TLS1.0版本
curl_setopt($ch, CURLOPT_CAINFO, $ca_info);
$data = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);
if(!empty($error)){ //curl有錯誤
echo $error;
}else{ //輸出請求結果
echo $data;
}
}else{echo "請輸入正確手機號";}
}else{
echo "驗證碼提交不正確!";
}
按照示例可使用客服提供的注冊號密碼進行手機號短信驗證碼的發送測試,根據接口返回碼和文檔按自己的要求做進一步的功能開發。