|
|
@@ -4,6 +4,7 @@ namespace app\api\controller;
|
|
|
|
|
|
use app\common\controller\Api;
|
|
|
use app\common\library\Sms as Smslib;
|
|
|
+use app\common\model\Sms AS SmsModel;
|
|
|
use app\common\model\User;
|
|
|
use think\Hook;
|
|
|
use fast\Random;
|
|
|
@@ -11,6 +12,7 @@ use Exception;
|
|
|
use think\Cache;
|
|
|
use think\exception\PDOException;
|
|
|
use think\exception\ValidateException;
|
|
|
+use think\Log;
|
|
|
|
|
|
|
|
|
/**
|
|
|
@@ -20,6 +22,17 @@ class Sms extends Api
|
|
|
{
|
|
|
protected $noNeedLogin = '*';
|
|
|
protected $noNeedRight = '*';
|
|
|
+ /**
|
|
|
+ * 验证码有效时长
|
|
|
+ * @var int
|
|
|
+ */
|
|
|
+ protected static $expire = 120;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 最大允许检测的次数
|
|
|
+ * @var int
|
|
|
+ */
|
|
|
+ protected static $maxCheckNums = 10;
|
|
|
|
|
|
/**
|
|
|
* 发送验证码
|
|
|
@@ -70,62 +83,99 @@ class Sms extends Api
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 检测验证码
|
|
|
- *
|
|
|
- * @ApiMethod (POST)
|
|
|
- * @param string $mobile 手机号
|
|
|
- * @param string $event 事件名称
|
|
|
- * @param string $captcha 验证码
|
|
|
+ * 向国际手机号码发放短信
|
|
|
+ * @return void
|
|
|
+ * @throws \think\Exception
|
|
|
*/
|
|
|
- public function check()
|
|
|
+ public function send_international_sms($country_code, $mobile, $event = '')
|
|
|
{
|
|
|
- $mobile = $this->request->post("mobile");
|
|
|
- $event = $this->request->post("event");
|
|
|
- $event = $event ? $event : 'register';
|
|
|
- $captcha = $this->request->post("captcha");
|
|
|
+ $last = SmsModel::where(['country_code' => $country_code, 'mobile' => $mobile, 'event' => $event])
|
|
|
+ ->order('id', 'DESC')
|
|
|
+ ->find();
|
|
|
+ if ($last && time() - $last['create_time'] < 60) {
|
|
|
+ $this->error(__('发送频繁'));
|
|
|
+ }
|
|
|
|
|
|
- if (!$mobile || !\think\Validate::regex($mobile, "^1\d{10}$")) {
|
|
|
- $this->error(__('手机号不正确'));
|
|
|
+ $ipSendTotal = SmsModel::where(['ip' => $this->request->ip()])->whereTime('create_time', '-1 hours')->count();
|
|
|
+ if ($ipSendTotal >= 5) {
|
|
|
+ $this->error(__('发送频繁'));
|
|
|
}
|
|
|
- if ($event) {
|
|
|
- $userinfo = User::getByMobile($mobile);
|
|
|
- if ($event == 'register' && $userinfo) {
|
|
|
+
|
|
|
+ if ($event == 'register') {
|
|
|
+ $userinfo = User::getByCodeAndMobile($country_code, $mobile);
|
|
|
+ if (!empty($userinfo)) {
|
|
|
//已被注册
|
|
|
$this->error(__('已被注册'));
|
|
|
- } elseif (in_array($event, ['changemobile']) && $userinfo) {
|
|
|
- //被占用
|
|
|
- $this->error(__('已被占用'));
|
|
|
- } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
|
|
|
- //未注册
|
|
|
- $this->error(__('未注册'));
|
|
|
}
|
|
|
+// elseif (in_array($event, ['changemobile']) && $userinfo) {
|
|
|
+// //被占用
|
|
|
+// $this->error(__('已被占用'));
|
|
|
+// } elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) {
|
|
|
+// //未注册
|
|
|
+// $this->error(__('未注册'));
|
|
|
+// }
|
|
|
}
|
|
|
- $ret = Smslib::check($mobile, $captcha, $event);
|
|
|
- if ($ret) {
|
|
|
- $this->success(__('成功'));
|
|
|
+
|
|
|
+// if (!Hook::get('sms_send')) {
|
|
|
+// $this->error(__('请在后台插件管理安装短信验证插件'));
|
|
|
+// }
|
|
|
+
|
|
|
+ $code = Random::numeric();//验证码
|
|
|
+
|
|
|
+ $ret = $this->send_sms_unisms($country_code, $mobile, $code, $event);
|
|
|
+ if ($ret['code']) {
|
|
|
+ $time = time();
|
|
|
+ $ip = request()->ip();
|
|
|
+ $sms = SmsModel::create([
|
|
|
+ 'country_code' => $country_code,
|
|
|
+ 'event' => $event,
|
|
|
+ 'mobile' => $mobile,
|
|
|
+ 'code' => $code,
|
|
|
+ 'ip' => $ip,
|
|
|
+ ]);
|
|
|
+ $this->success(__('发送成功') . '-' . $code);
|
|
|
} else {
|
|
|
- $this->error(__('验证码不正确'));
|
|
|
+ Log::notice('短信发送失败');
|
|
|
+ Log::error($ret['msg']);
|
|
|
+ $this->error(__('发送失败,请检查短信配置是否正确'));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/**
|
|
|
- * 发送短信验证码
|
|
|
+ * 检测验证码
|
|
|
*
|
|
|
- * @ApiMethod (POST)
|
|
|
- * @param string $phone 手机号
|
|
|
- * @param string $scene 事件名称
|
|
|
- * @param string $countryCode 区号
|
|
|
- * @param string $len 验证码长度
|
|
|
*/
|
|
|
- public function sendCodeSMS($phone, $scene = 'verify',$countryCode = '86', $len = '')
|
|
|
+ public function check($country_code, $mobile, $code, $event = 'verify'): bool
|
|
|
{
|
|
|
+ $time = time() - self::$expire;
|
|
|
+ $sms = SmsModel::where(['country_code' => $country_code, 'mobile' => $mobile, 'event' => $event])
|
|
|
+ ->order('id', 'DESC')
|
|
|
+ ->find();
|
|
|
+ if ($sms) {
|
|
|
+ if ($sms['create_time'] > $time && $sms['times'] <= self::$maxCheckNums) {
|
|
|
+ $correct = $code == $sms['code'];
|
|
|
+ if (!$correct) {
|
|
|
+ $sms->times = $sms->times + 1;
|
|
|
+ $sms->save();
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ //$result = Hook::listen('sms_check', $sms, null, true);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
- $key = $countryCode.$scene . ':' . $phone;
|
|
|
- $code = Random::numeric($len);
|
|
|
- //$content = $content == '' ? sprintf(SMSTemplates($scene,$countryCode),$code) : sprintf($content,$code);
|
|
|
- //$phone = $countryCode . $phone;
|
|
|
- $phone = '+' . $countryCode . $phone;//拼接国际区号
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送短信验证码
|
|
|
+ * 短信平台:https://unisms.apistd.com/
|
|
|
+ */
|
|
|
+ public function send_sms_unisms($country_code, $phone, $code, $event = 'verify')
|
|
|
+ {
|
|
|
+ return _success();
|
|
|
+ $phone = '+' . $country_code . $phone;//拼接国际区号
|
|
|
try {
|
|
|
$url1 = "https://uni.apistd.com";
|
|
|
$query = [
|
|
|
@@ -134,32 +184,22 @@ class Sms extends Api
|
|
|
];
|
|
|
$url = $url1.'/?'.http_build_query($query);
|
|
|
$data = [
|
|
|
- 'signature'=>'AEXBTC',
|
|
|
- 'to'=>$phone,
|
|
|
+ 'signature' => 'AEXBTC',
|
|
|
+ 'to' => $phone,
|
|
|
//'content'=>$content,
|
|
|
- 'templateId' => 'd33f1f90',
|
|
|
- 'templateData' => ['code' => $code]
|
|
|
+ 'templateId' => 'd33f1f90',
|
|
|
+ 'templateData' => ['code' => $code]
|
|
|
];
|
|
|
$result = xcurl($url,$data);
|
|
|
$result = json_decode($result, true);
|
|
|
- // var_dump($result);
|
|
|
-
|
|
|
- // if($result['code'] == 0){
|
|
|
- // $result = 1;
|
|
|
- // }else {
|
|
|
- // $result = 0;
|
|
|
- // }
|
|
|
} catch (ValidateException|PDOException|Exception $e){
|
|
|
- $this->error($e->getMessage());
|
|
|
+ return _error($e->getMessage());
|
|
|
}
|
|
|
if ($result['code'] == 0){
|
|
|
- Cache::set($key, $code,300);
|
|
|
- return true;
|
|
|
+ //Cache::set($key, $code,300);
|
|
|
+ return _success();
|
|
|
}else{
|
|
|
- return $result['message'];
|
|
|
+ return _error($result['message']);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|