Sms.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace app\common\model\base\msg;
  3. use app\common\model\Common;
  4. use app\common\model\base\user\User;
  5. use think\facade\Db;
  6. class Sms extends Common
  7. {
  8. protected $name = "system_sms";
  9. protected $pk = 'id';
  10. protected $deleteTime = null;
  11. protected $autoWriteTimestamp = 'int';
  12. protected $createTime = 'createtime';
  13. // protected $updateTime = 'createtime';
  14. //发送短信验证码
  15. static public function send($mobile)
  16. {
  17. if(11!=strlen($mobile)){
  18. return Result(1,"请输入正确的手机号");
  19. }
  20. $user = User::where('phone',$mobile)->find();
  21. if(empty($user)){
  22. return Result(1,"未找到此用户");
  23. }
  24. $code = self::createcode();
  25. $info = self::where('mobile',$mobile)->find();
  26. self::startTrans();
  27. try{
  28. if(!empty($info)){
  29. $s = strtotime($info->createtime) + 30 - time();//0.5分钟内不能重复发送
  30. if($s>0){
  31. return Result(0,"请".$s."秒后再尝试发送验证码");
  32. }
  33. $info->code = $code;
  34. $info->timeout = time() + 600;
  35. $info->createtime = date('Y-m-d H:i:s');
  36. $res = $info->save();
  37. }else{
  38. $data = [
  39. 'mobile' => $mobile,
  40. 'code' => $code,
  41. 'timeout' => time() + 600,
  42. 'createtime'=> date('Y-m-d H:i:s')
  43. ];
  44. (new self)->replace()->save($data);
  45. }
  46. $provider = sysconfig('sms.provider');
  47. // 腾讯短信
  48. if(1==$provider){
  49. $sms = new \tencent\Sms;
  50. $res = $sms->SendSms($mobile,[$code],771289);//腾讯短信验证码模板
  51. if(isset($res['errmsg']) && $res['errmsg']=='OK'){
  52. self::commit();
  53. return Result(1,"发送成功");
  54. }else{
  55. self::rollback();
  56. return Result(0,"发送失败");
  57. }
  58. }
  59. // 联通短信
  60. elseif(2==$provider){
  61. $sms = new \ums\Sms;
  62. $content = "您的帐号正在进行找回密码操作,本次操作验证码为$code,请在10分钟内使用,如非本人操作,请忽略.";
  63. $res = $sms->SendSms($mobile,$content,'2431012229821');//联通短信验证码模板
  64. if(0==$res['result']){
  65. self::commit();
  66. WLog('Sms',json_encode($res,JSON_UNESCAPED_UNICODE));
  67. return Result(1,"短信发送成功",$res);
  68. }else{
  69. self::rollback();
  70. return Result(0,$res['description'],$res);
  71. }
  72. }
  73. }catch(\Exception $e){
  74. self::rollback();
  75. return Result(0,$e->getMessage());
  76. }
  77. }
  78. //检查验证码是否正确
  79. static public function check($mobile,$code)
  80. {
  81. $where = [];
  82. $where[] = ['mobile','=',$mobile];
  83. $where[] = ['code','=',$code];
  84. $where[] = ['timeout','>=',time()];
  85. $info = self::where($where)->find();
  86. //验证码仅使用一次,使用过后就删除
  87. if($info){
  88. $info->delete();
  89. }
  90. return !empty($info);
  91. }
  92. //生成短信验证码
  93. static public function createcode()
  94. {
  95. return mt_rand(1000,9999);
  96. }
  97. }