首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Yii 整合 smsto 簡訊 API 發送功能完整實作範例

     編輯:PHP 綜合知識

簡訊發送元件實作

<?php
namespace app\components;

use Yii;

class SmsSender {
    private $username = 'zyd';      // API 帳號
    private $password = '123456';   // API 密碼
    private $gateway = 'https://sms.zyd.com/msgsend.ashx'; // 簡訊閘道
    
    /**
     * 發送簡訊
     * @param string $mobile 手機號碼
     * @param string $message 簡訊內容
     * @return string|false 閘道回傳原始結果
     */
    public function send($mobile, $message) {
        // 內容編碼:UTF-8 → GB2312 → URLEncode
        $encodedMessage = urlencode(mb_convert_encoding($message, 'gb2312', 'utf-8'));
        
        $url = "{$this->gateway}?USERNAME={$this->username}"
             . "&PASSWORD={$this->password}"
             . "&MOBILE={$mobile}"
             . "&CONTENT={$encodedMessage}"
             . "&SEQ=1000";
        
        $result = @file_get_contents($url);
        
        if ($result === false) {
            Yii::error("簡訊發送失敗: {$mobile}", __METHOD__);
            return false;
        }
        
        Yii::info("簡訊發送結果: {$result}", __METHOD__);
        return $result;
    }
}
?>

控制器/Service 中呼叫

<?php
// 方式一:直接實例化
$sms = new \app\components\SmsSender();
$result = $sms->send('0912345678', '您的驗證碼:123456,5分鐘內有效。');

// 方式二:註冊為 Application Component (config/web.php)
/*
'components' => [
    'sms' => [
        'class' => 'app\components\SmsSender',
        'username' => 'your_api_user',
        'password' => 'your_api_pass',
    ],
],
*/
// 然後任處使用:Yii::$app->sms->send($mobile, $message);
?>

進階擴充建議

  • 多閘道支援:策略模式切換供應商,失敗自動備援
  • 非同步發送:推入隊列 (Redis/RabbitMQ) 背景處理,提升回應速度
  • 發送記錄:資料庫記錄手機、內容、狀態、回傳碼,供查核與重發
  • 頻率限制:同一手機/IP 每分鐘/小時發送上限,防濫用
  • 內容模板:預設模板 + 變數替換,審核合規
  • 狀態回調:實作閘道回調端點更新送達狀態 (DELIVRD/EXPIRED/FAILED)

常見編碼坑點

問題原因解決
中文變亂碼閘道要求 GB2312/Big5,PHP 內部 UTF-8`mb_convert_encoding($msg, 'gb2312', 'utf-8')`
特殊字元截斷URL 參數未編碼`urlencode()` 完整編碼
長簡訊分段超過 70 字 (中文) 自動分段計費預估長度、提醒用戶、記錄分段數

安全性提醒

⚠️ 範例中帳號密碼寫死於程式碼,**生產環境務必存於環境變數或加密設定檔** (如 `params-local.php` 不納入版控),並限制 API 呼叫 IP 白名單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved