首頁 >後端開發 >PHP問題 >php 實作自動發送簡訊

php 實作自動發送簡訊

PHPz
PHPz原創
2023-05-06 11:03:07857瀏覽

隨著網路的發展,簡訊已經成為我們生活中不可或缺的一部分。在現代化的商業領域中,簡訊也變得越來越重要,因為它是一種快速、方便、低成本的通訊方式,能夠讓企業與客戶進行即時溝通。但是,隨著企業規模的逐漸擴大,手動發送簡訊已經無法滿足需求,因此,實現自動發送簡訊的功能變得越來越重要。

PHP是一種流行的伺服器端腳本語言,它非常適合用於處理web請求。本文將介紹如何使用PHP來自動發送簡訊。

首先,我們需要了解一些自動發送簡訊的基本原理和流程。在實現自動發送簡訊的過程中,我們需要以下三個基本的元素:簡訊網關、簡訊介面和簡訊內容。

  1. 簡訊網關

在自動發送簡訊的過程中,簡訊網關是不可或缺的一部分。簡訊網關是一種連接簡訊發送者和接收者的中間件,它實現了簡訊的發送和接收。在選擇簡訊網關時,我們應該注意以下幾個因素:簡訊發送的速度、相容性、價格、安全性和穩定性。

  1. 簡訊介面

簡訊介面是伺服器與簡訊閘道之間的通訊介面。它負責將伺服器上的指令和短信網關之間進行通信,並將短信發送到正確的接收者。簡訊介面通常分為兩類:HTTP介面和SDK介面。 HTTP介面具有相容性強、使用簡單、穩定性高等優點,適合用於小型的業務場景;SDK介面則更靈活、安全性高,適合用於大型、複雜的業務場景。

  1. 簡訊內容

簡訊內容是指要傳送的簡訊文字。在撰寫簡訊內容時,應該注意以下幾個方面:一個好的簡訊內容應該能夠吸引用戶的注意力,在簡短的文字中傳遞出正確的訊息。

在了解了基本的元素之後,我們可以開始編寫PHP程式碼來實現自動發送簡訊。

首先,我們需要選擇一條簡訊網關和簡訊介面。這裡我們以阿里雲簡訊服務為例,使用阿里雲簡訊服務的HTTP介面進行實現,具體的步驟如下:

  1. 註冊阿里雲帳號,進入簡訊服務控制台,建立一個Access Key 。
  2. 阿里雲簡訊服務提供了一套完整的API接口,我們可以透過呼叫該接口來實現自動發送簡訊的功能。具體可參考阿里雲簡訊服務API文件。
  3. 編寫PHP程式碼進行呼叫。具體的程式碼如下:

// 以下變數為必填項,請登入阿里雲取得
$accessKeyId = "XXXXXXXXXXX";
$accessKeySecret = "XXXXXXXXXX";
$signName = "XXXXXXXXXX";
$templateCode = "XXXXXXXXXXX";

$phoneNumbers = "XXXXXXXXXXX"; // 接收簡訊的手機號碼
$templateParam = array (

"code" => mt_rand(100000, 999999)  // 短信模板中的替换参数,这里使用PHP内置函数mt_rand()生成一个6位验证码</p>
<p>);</p>
<p>// 發送簡訊介面<br>function sendSms($accessKeyId, $accessKeySecret, $phoneNumbers, $signName, $templateCode, $templateParam)<br> {</p>
<pre class="brush:php;toolbar:false">$params = array ();

// *** 需用户填写部分 ***
// fixme 必填: 短信接收号码
$params["PhoneNumbers"] = $phoneNumbers;
// fixme 必填: 短信签名-可在短信控制台中找到
$params["SignName"] = $signName;
// fixme 必填: 短信模板-可在短信控制台中找到
$params["TemplateCode"] = $templateCode;
// fixme 可选: 模板中的变量替换JSON串
if ($templateParam) {
    $params["TemplateParam"] = json_encode($templateParam);
}

// *** 需用户填写部分结束, 以下代码若无必要无需更改 ***
if (!empty($params["TemplateParam"]) && is_array($params["TemplateParam"])) {
    $params["TemplateParam"] = json_encode($params["TemplateParam"], JSON_UNESCAPED_UNICODE);
}

// 初始化SignatureHelper实例用于设置参数,签名以及发送请求
$helper = new SignatureHelper();

try {
    $content = $helper->request(
                    $accessKeyId,
                    $accessKeySecret,
                    "dysmsapi.aliyuncs.com",
                    array_merge($params, array(
                        "RegionId" => "cn-hangzhou",
                        "Action" => "SendSms",
                        "Version" => "2017-05-25",
                    ))
                );
    return $content;
} catch (Exception $e) {
    return false;
}

}

// 簽名類別
class SignatureHelper {

/**
 * 生成签名并发起请求
 *
 * @param string $accessKeyId
 *            您的Access Key ID
 * @param string $accessKeySecret
 *            您的Access Key Secret
 * @param string $domain
 *            API接口所在域名
 * @param array $params
 *            参数结构
 * @param string $method
 *            请求方式,GET或POST
 * @return bool|\mixed 服务器返回的数据,失败返回false
 */
public function request($accessKeyId, $accessKeySecret, $domain, $params, $method = 'POST')
{
    $apiParams = array ();
    foreach ($params as $key => $value) {
        $apiParams[$key] = $value;
    }

    // 添加公共请求参数
    $apiParams["SignatureMethod"] = "HMAC-SHA1";
    $apiParams["SignatureNonce"] = uniqid(mt_rand(0, 0xffff), true);
    $apiParams["SignatureVersion"] = "1.0";
    $apiParams["AccessKeyId"] = $accessKeyId;
    $apiParams["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");
    $apiParams["Format"] = "JSON";

    // 计算签名并拼接请求参数
    ksort($apiParams);
    $canonicalizedQueryString = '';
    foreach ($apiParams as $key => $value) {
        $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value);
    }
    $stringToSign = $method . '&%2F&' . $this->percentEncode(substr($canonicalizedQueryString, 1));
    $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
    $apiParams["Signature"] = $signature;

    // 发送请求
    $url = 'http://' . $domain . '/?' . http_build_query($apiParams);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}

/**
 * 生成规范化请求字符串
 *
 * @param array $params
 *            请求参数
 * @return string
 */
private function getCanonicalizedQueryString(array $params)
{
    ksort($params);

    $canonicalizedQueryString = '';
    foreach ($params as $key => $value) {
        $canonicalizedQueryString .= '&' . $this->percentEncode($key) . '=' . $this->percentEncode($value);
    }

    return substr($canonicalizedQueryString, 1);
}

/**
 * 生成规范化请求
 *
 * @param array $params
 *            请求参数
 * @return string
 */
private function getCanonicalizedHeaders(array $params)
{
    ksort($params);

    $canonicalizedHeaders = '';
    foreach ($params as $key => $value) {
        $canonicalizedHeaders .= $key . ':' . $value . "\n";
    }

    return $canonicalizedHeaders;
}

/**
 * 获取content-Md5值
 *
 * @param string $content
 *            请求内容
 * @return string
 */
private function getContentMd5($content)
{
    return base64_encode(md5($content, true));
}

/**
 * 特殊字符编码
 *
 * @param string $value
 *            需要编码的字符串
 * @return string
 */
private function percentEncode($value)
{
    $value = urlencode($value);
    $value = preg_replace('/\+/', '%20', $value);
    $value = preg_replace('/\*/', '%2A', $value);
    $value = preg_replace('/%7E/', '~', $value);

    return $value;
}

}

// 呼叫發送簡訊介面
$result = sendSms($accessKeyId, $accessKeySecret, $phoneNumbers, $signName, $templateCode, $templateParam);
if ($result !== false) {

echo "验证码已发送成功";

} else {

echo "验证码发送失败";

#}

以上PHP程式碼實作了使用阿里雲簡訊服務的HTTP介面發送簡訊的功能。我們可以根據需要進行適當的調整和修改,以滿足具體的業務需求。

總之,實現自動發送簡訊的功能是非常有用的。透過學習本文介紹的相關知識和技術,我們可以輕鬆實現自動發送簡訊的功能,提高我們的工作效率和業務水平。

以上是php 實作自動發送簡訊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn