1、定义短信相关配置 scheme * * The scheme value include: * 1. weight (must be a positive integer) * 2. 'backup' (ignore upper/lower case) * * supported agents: * 'Log', 'SmsBao', 'Luosimao', 'YunTongXun', 'YunPian', 'SubMail', 'Ucpaas', 'JuHe', 'Alidayu', 'SendCloud', 'ChanzorSMS' */ 'scheme' => [ //被使用的概率,30为3/3,20为2/3 'Chanzor' => [ //【注意】:如果有了agentClass 其他配置都需要關閉 'agentClass' => 'App\Jobs\Wechat\Chanzor', ] ], /* * agents config * ------------------------------------------------------------------- * Note: agent name must be string. * */ 'agents' => [ /* * ----------------------------------- * Chanzor * 畅卓 * ----------------------------------- * website:http://www.chanzor.com/ * support template sms. */ 'Chanzor' => [ //APP_ID 'appId' => env('SMS_APP_ID', 'your app id'), // APP_KEY 'appKey' => env('SMS_APP_KEY', 'your app key'), //请求地址 'sendUrl' => env('SMS_APP_URL', 'your app key'), ], /* * ----------------------------------- * YunPian * 云片代理器 * ----------------------------------- * website:http://www.yunpian.com * support content sms. */ 'YunPian' => [ //用户唯一标识,必须 'apikey' => 'your api key', ], /* * ----------------------------------- * YunTongXun * 云通讯代理器 * ----------------------------------- * website:http://www.yuntongxun.com/ * support template sms. */ 'YunTongXun' => [ //主帐号,对应开官网发者主账号下的 ACCOUNT SID 'accountSid' => 'your account sid', //主帐号令牌,对应官网开发者主账号下的 AUTH TOKEN 'accountToken' => 'your account token', //应用Id,在官网应用列表中点击应用,对应应用详情中的APP ID //在开发调试的时候,可以使用官网自动为您分配的测试Demo的APP ID 'appId' => 'your app id', //请求地址 //沙盒环境(用于应用开发调试):sandboxapp.cloopen.com //生产环境(用户应用上线使用):app.cloopen.com 'serverIP' => 'app.cloopen.com', //请求端口,生产环境和沙盒环境一致 'serverPort' => '8883', //被叫号显 'displayNum' => null, //语音验证码使用的语言类型 'voiceLang' => 'zh', //语音验证码播放次数 'playTimes' => 3, ], /* * ----------------------------------- * SubMail * ----------------------------------- * website:http://submail.cn/ * support template sms. */ 'SubMail' => [ 'appid' => 'your app id', 'signature' => 'your app key', ], /* * ----------------------------------- * luosimao * ----------------------------------- * website:http://luosimao.com * support content sms. */ 'Luosimao' => [ //短信 API key //在管理中心->短信->触发发送下查看 'apikey' => 'your api key', //语言验证 API key //在管理中心->语音->语音验证下查看 'voiceApikey' => 'your voice api key', ], /* * ----------------------------------- * ucpaas * ----------------------------------- * website:http://ucpaas.com * support template sms. */ 'Ucpaas' => [ //主帐号,对应开官网发者主账号下的 ACCOUNT SID 'accountSid' => 'your account sid', //主帐号令牌,对应官网开发者主账号下的 AUTH TOKEN 'accountToken' => 'your account token', //应用Id,在官网应用列表中点击应用,对应应用详情中的APP ID //在开发调试的时候,可以使用官网自动为您分配的测试Demo的APP ID 'appId' => 'your app id', ], /* * ----------------------------------- * JuHe * 聚合数据 * ----------------------------------- * website:https://www.juhe.cn * support template sms. */ 'JuHe' => [ //应用App Key 'key' => 'your key', //语音验证码播放次数 'times' => 3, ], /* * ----------------------------------- * Alidayu * 阿里大鱼代理器 * ----------------------------------- * website:http://www.alidayu.com * support template sms. */ 'Alidayu' => [ //请求地址 'sendUrl' => 'http://gw.api.taobao.com/router/rest', //淘宝开放平台中,对应阿里大鱼短信应用的App Key 'appKey' => 'your app key', //淘宝开放平台中,对应阿里大鱼短信应用的App Secret 'secretKey' => 'your secret key', //短信签名,传入的短信签名必须是在阿里大鱼“管理中心-短信签名管理”中的可用签名 'smsFreeSignName' => 'your sms free sign name', //被叫号显(用于语音通知),传入的显示号码必须是阿里大鱼“管理中心-号码管理”中申请或购买的号码 'calledShowNum' => null, ], /* * ----------------------------------- * SendCloud * ----------------------------------- * website: http://sendcloud.sohu.com/sms/ * support template sms. */ 'SendCloud' => [ //SMS_USER 'smsUser' => 'your SMS_USER', //SMS_KEY 'smsKey' => 'your SMS_KEY', ], /* * ----------------------------------- * SmsBao * ----------------------------------- * website: http://www.smsbao.com * not support template sms. * 不支持模板变量短信 * support content sms. * 支持内容短信 * support voice sms. * 支持语音验证码 * 支持自定义短信签名 * 最低消费5元(50条) 最低消费单价0.04元(100万条) */ 'SmsBao' => [ //username 'username' => 'your username', //password 'password' => 'your password', ], //短信通知 'ChangTZ' => [ 'sendUrl' => env('SMS_NOTICE_APP_URL', 'http://api.chanzor.com/'), 'appId' => env('SMS_NOTICE_APP_ID', '设置分配的appId'), 'appKey' => env('SMS_NOTICE_APP_KEY', '设置分配的appKey'), ] ], ];
2、进行方法封装 在 App\Jobs\Wechat;
'发送成功', '-101' => '账户为空', '-102' => '密码为空', '-103' => '发送时间参数错误', '-113' => '账户余额不足', '-118' => '短信内容有误,一般是签名有问题', '-121' => '限制发送,一般是应用被冻结的情况', ]; public function __construct(array $config = []) { if(empty($config)) $config = config('phpsms.agents.ChangTZ'); parent::__construct($config); $this->url = $config['sendUrl']; $this->account = $config['appId']; $this->password = $config['appKey']; } public function sendContentSms($to, $content, $sendTime = NULL) { $url = $this->url . 'send'; $params = [ 'account' => $this->account, 'password' => md5($this->password), 'mobile' => $to, 'content' => $content, ]; if ($sendTime) { $params['sendTime'] = $sendTime; } Log::debug($url, $params); $result = $this->curlGet($url, $params); $this->setResult($result); return $result; } public function getDrSms($to, $content) { $url = $this->url . 'dr'; $params = [ 'account' => $this->username, 'password' => md5($this->password), 'mobile' => $to, 'content' => $content, ]; $result = $this->curlPost($url, $params); $this->setResult($result); } public function getDrSmsTask($taskId = null, $statusNum = null) { $url = $this->url . 'dr'; $params = [ 'account' => $this->account, 'password' => md5($this->password), ]; $taskId && $params['taskId'] = $taskId; $statusNum && $params['statusNum'] = $statusNum; $result = $this->curlPost($url, $params); $this->setResult($result); return $result; } public function getMoSms($to, $content) { $url = $this->url . 'mo'; $params = [ 'account' => $this->username, 'password' => md5($this->password), 'mobile' => $to, 'content' => $content, ]; $result = $this->curlPost($url, $params); $this->setResult($result); } public function voiceVerify($to, $code, $tempId, array $tempData) { $url = $this->url . 'voice'; $params = [ 'account' => $this->username, 'password' => md5($this->password), 'mobile' => $to, 'content' => $code, ]; $result = $this->curlPost($url, $params); $this->setResult($result); } protected function setResult($result) { if ($result['request']) { Log::info(json_encode($result)); $result = json_decode($result['response'], true); $msg = array_key_exists($result['status'], $this->resultArr) ? $this->resultArr[$result['status']] : 'unknown error'; if ($result['status'] === 0) { $this->result(Agent::SUCCESS, true); } else { $this->result(Agent::SUCCESS, false); } $this->result(Agent::INFO, $result['desc']); $this->result(Agent::CODE, $result['status']); } else { $this->result(Agent::INFO, 'request failed'); } } }
3、进行发送验证码 这里在获取验证码时 进行手机号+当前时间的加密,防止验证码盗刷
public function sApplets(Request $request)
{
$tel = $request->input('phone');//要发信息的手机号码
$type = $request->input('type');
$rsa_type = $request->input('rsa_type', 1);
$rsa = $request->input('rsa', '');
$rsa_path = config('rsa_path.666')??'';
if( empty($rsa_path) ) return response_json(333, '参数不正确');
$rsa_path = storage_path($rsa_path);
if (!$tel || !$type) return parent::_jsonMsg(4001, Config::get('code.4001'));
if( !in_array($type, [34]) ) return parent::_jsonMsg(5007, Config::get('code.5007'));
if ( !self::verifyRsaPri($tel,$rsa, $rsa_path) ) return parent::_jsonMsg(5007, Config::get('code.5007'));
if(AuthCodeRepository::verify_phone($tel, 34)) return parent::_jsonMsg(5006, Config::get('code.5006'));//有验证码可用的手机号注册时不再重复发送
$today = $this->authcode->Today($tel, $type);//判断每天发短息条数
if (!$today) return parent::_jsonMsg(12009, Config::get('code.12009'));
$num = rand(1000, 9999);
$overtime = time() + 900;
Authcode::deleteByPhpone($tel, $type);
$CreateCode = $this->authcode->CreateCode($tel, $num, $type, $overtime);//验证码插入数据库
if (!$CreateCode) return parent::_jsonMsg(5001, Config::get('code.5001'));
(new Chanzor(config('phpsms.agents.ChangTZ')))->sendContentSms($tel,"【好玩 哒哒哒】您本次的验证码为{$num},感谢您的支持!");
return response_json(200, '发送成功');
}
最后、解密rsa就不贴了,以上就是大概接入验证码的一个流程,注意发送内容的模板,和第三方平台定义的要一致哦 不然可能会报 短信签名错误