ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルに実装された IMEI 制限付きの SMS 検証コード送信クラス
phpで実装したIMEI制限付きSMS認証コード送信クラス
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
クラスApi_Sms{ const EXPIRE_SEC = 1800 // 有効期限の間隔 ;const RESEND_SEC = 60 // 再送信間隔 ;const ONE_DAY_FREQ = 5; // 同じ携帯電話番号にテキスト メッセージを送信する 1 日の回数 const ONE_DAY_IMEI_COUNT = 3 // 毎日同じ携帯電話番号に送信される IMEI の数 ;
パブリック $error = array();
/** *指定された携帯電話番号に認証コードを送信します * @param $mobile * @param $imei * @return bool */ パブリック関数 sendVerifyCode($mobile, $imei) { if(!$this->isMobile($mobile)) { $this->error = array('code' => -1, 'msg' => 'この携帯電話番号は非常に奇妙です、正しく入力してもう一度お試しください'); false を返す; }
$redis = Api_Common::redis(); $vcKey = 'VC_'.$mobile; $limitKey = 'VC_LIMIT_'.$mobile;
//認証コード再送信制限 $data = json_decode($redis->get($vcKey), true); if($data && time() < $data['resend_expire']) { $this->error = array('code' => -1, 'msg' => 'メッセージは 1 分以内に送信されました。しばらくお待ちください'); false を返す; }
//携帯電話番号とIMEIの制限 $sendCnt = $redis->zScore($limitKey, $imei); if($sendCnt && $sendCnt >= self::ONE_DAY_FREQ) { $this->error = array('code' => -1, 'msg' => 'テキスト メッセージを受信しませんでしたか? しばらく待つか、テキスト メッセージがブロックされているかどうかを確認してください'); false を返す; } $imeiCnt = $redis->zCard($limitKey); if($imeiCnt >= self::ONE_DAY_IMEI_COUNT && !$sendCnt) { $this->error = array('code' => -1, 'msg' => '認証コード送信デバイスの制限を超えました'); false を返す; }
//確認コードを取得します if(!$data) { $vc = strval(rand(100000, 999999)); $data = array('vc' => $vc, 'resend_expire' => 0); $redis->set($vcKey, json_encode($data)); $redis->expire($vcKey, self::EXPIRE_SEC) //確認コードの有効期限を設定します } $vc = $data['vc'];
$content = 'セキュリティ確認コード:'.$vc; $result = $this->send($mobile, $content); if($result) { //再送信時間制限をリセット $data['resend_expire'] = time() + self::RESEND_SEC; $ttl = $redis->ttl($vcKey); $redis->set($vcKey, json_encode($data)); $redis->expire($vcKey, $ttl);
//携帯電話番号とIMEI制限を設定します $redis->zIncrBy($limitKey, 1, $imei); $redis->expireAt($limitKey, strtotime(date('Y-m-d',strtotime('+1 day')))); } $result を返す; }
/** * 指定した携帯電話番号にSMSを送信します * @param $mobile * @param $content * @return bool */ パブリック関数 send($mobile, $content){ //TODO 特定のサービスプロバイダー API を呼び出す true を返す; }
/** * 合法的な携帯電話番号であるかどうかを確認してください * @param $mobile * @return bool */ プライベート関数 isMobile($mobile) { if(preg_match('/^1d{10}$/', $mobile)) true を返す; false を返す; }
/** * SMS 認証コードを確認します * @param $mobile * @param $vc * @return bool */ パブリック関数 checkVerifyCode($mobile, $vc) { $vcKey = 'VC_'.$mobile; $vcData = json_decode(Api_Common::redis()->get($vcKey), true); if($vcData && $vcData['vc'] === $vc) { true を返す; } false を返す; }
/** * 確認コードをクリアします * @param $mobile */ パブリック関数 cleanVerifyCode($mobile) { $redis = Api_Common::redis(); $vcKey = 'VC_'.$mobile; $limitKey = 'VC_LIMIT_'.$mobile; $redis->del($vcKey); $redis->del($limitKey); } } |
他のネチズンが実装した追加のSMS認証コードを支払う
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
/*-------------------------------- 機能: テキストメッセージを送信するための中国SMSネットワークPHP HTTPインターフェース 更新日: 2009-04-08 手順: http://http.c123.com/tx/?uid=ユーザーアカウント&pwd=MD5桁32のパスワード&mobile=番号&content=content ステータス: 100 件が正常に送信されました 101 検証に失敗しました 102 SMS が足りません 103 操作が失敗しました 104 個の不正な文字 105 コンテンツが多すぎます 106 数字が多すぎます 107の周波数は速すぎます 108番号の内容は空です 109アカウントが凍結されました 110 単一メッセージの頻繁な送信は禁止されています 111 システムは暫定的に送信をスケジュールしています 112番号は間違っています 120システムアップグレード --------------------------------*/ $uid = '9999' //ユーザーアカウント ;$pwd = '9999' //パスワード ;$mobile = '13912341234,13312341234,13512341234,02122334444' //番号 $content = '中国 SMS ネットワーク PHP HTTP インターフェイス' //コンテンツ //すぐに送信 $res = sendSMS($uid,$pwd,$mobile,$content); エコー$res;
//定期的に送信します /* $time = '2010-05-27 12:11'; $res = sendSMS($uid,$pwd,$mobile,$content,$time); エコー$res; */ 関数 sendSMS($uid,$pwd,$mobile,$content,$time='',$mid='') { $http = 'http://http.c123.com/tx/'; $data = 配列 ( 'uid'=>$uid, //ユーザーアカウント 'pwd'=>strto lower(md5($pwd)), //MD5 桁 32 のパスワード 'mobile'=>$mobile, //番号 'content'=>$content, //コンテンツ 'time'=>$time, //定期的に送信します 'mid'=>$mid //サブ内線番号 ); $re= postSMS($http,$data) //POST 経由で送信 if( トリム($re) == '100' ) { return "正常に送信されました!"; } その他 { return "送信に失敗しました! ステータス:".$re; } }
関数postSMS($url,$data='') { $row = parse_url($url); $host = $row['ホスト']; $ポート = $row['ポート'] ? $row['ポート']:80; $file = $row['パス']; while (list($k,$v) = each($data)) { $post .= rawurlencode($k)."=".rawurlencode($v)."&"; //转URL标標準码 } $post = substr( $post , 0 , -1 ); $len = strlen($post); $fp = @fsockopen( $host ,$port, $errno, $errstr, 10); if (!$fp) { return "$errstr ($errno)n"; } 他 { $受信 = ''; $out = "POST $file HTTP/1.1rn"; $out .= "ホスト: $hostrn"; $out .= "コンテンツタイプ: application/x-www-form-urlencodedrn"; $out .= "接続: 閉じる"; $out .= "コンテンツの長さ: $lenrnrn"; $out .= $post; fwrite($fp, $out); ながら (!feof($fp)) { $receive .= fgets($fp, 128); } fclose($fp); $receive =explode("rnrn",$receive); unset($receive[0]); return implode("",$receive); } } ?> |
以上記載は本文の全内容です、大家様に喜んでいただければ幸いです。
http://www.bkjia.com/PHPjc/994740.html