事情变化太快,上线还不到一个月的注册短信验证功能就遇到了平台搬家的尴尬。阿里云发了一个邮件通知。原淘宝短信和阿里云市场短信将迁移到云通信平台,自2018年1月22日期,原平台将被停用,这之前是平台迁移期,需要用户抓紧迁移。也就是阿里云给大家留了一个月的窗口期。
具体接入操作,根据阿里提供的demo接入还是很方便快捷的。
登录云通信平台控制台申请AccessKey,并添加短信签名和短信模版。关于短信签名和短信模版在上一篇文章中已经提到过,就不赘述了。(https://www.anji66.net/article/id/37.html)AccessKey建议使用子账号。根据平台提示操作即可。
解压后我们需要的文件如图:
1、将两个文件放入到thinkPHP建议的第三方扩展extend
目录下。建立一个为Aliyun的目录,将Api和Core放入。
2、命名空间的问题,如果你是采用跟我一样的目录形式,那么Api和Core内文件的命名空间就不用调整了,默认就是写好的,如果自定义了其它目录名称,请修改响应的命名空间。
3、引入文件并载入短信平台节点。
use Aliyun\Core\Config; use Aliyun\Core\Profile\DefaultProfile; use Aliyun\Core\DefaultAcsClient; use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest; use Aliyun\Api\Sms\Request\V20170525\QuerySendDetailsRequest; Config::load();
4、拷贝demo文件(SmsDdemo.php)中的静态方法(getAcsClient)
public static function getAcsClient() { //产品名称:云通信流量服务API产品,开发者无需替换 $product = "Dysmsapi"; //产品域名,开发者无需替换 $domain = "dysmsapi.aliyuncs.com"; // TODO 此处需要替换成开发者自己的AK (https://ak-console.aliyun.com/) $accessKeyId = "yourAccessKeyId"; // 这里填你申请的AccessKeyID $accessKeySecret = "yourAccessKeySecret"; // 这里填你申请的AccessKeySecret // 暂时不支持多Region $region = "cn-hangzhou"; // 服务结点 $endPointName = "cn-hangzhou"; if(static::$acsClient == null) { //初始化acsClient,暂不支持region化 $profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret); // 增加服务结点 DefaultProfile::addEndpoint($endPointName, $region, $product, $domain); // 初始化AcsClient用于发起请求 static::$acsClient = new DefaultAcsClient($profile); } return static::$acsClient; }
5、开发自身应用的方法。
public function setcode() { $mobiphone=input('mobiphone');//接收的用户手机号 $num=rand(100000,999999);//生成六位随机数 session('code',$num);//将随机数写入session session('mobiphone',$mobiphone);//写入获取的手机号 session('codetime',time());//写入当前时间 //忽略下面这行,这个是上一版中使用urlencode转字符操作的,这版中采用的是json格式 //$ParamString=urlencode('{'."code".':'."$num".'}'); $request = new SendSmsRequest; //实例化 $request->setPhoneNumbers($mobiphone);//必填-短信接收号码 $request->setSignName("西枫里博客");//设置签名名称 //必填-短信模板Code $request->setTemplateCode("你自己的模版code"); //选填-假如模板中存在变量需要替换则为必填(JSON格式) $request->setTemplateParam(json_encode(array( // 短信模板中字段的值 "code"=>$num ), JSON_UNESCAPED_UNICODE)); //选填-发送短信流水号(业务逻辑没有相关功能就注释掉) //$request->setOutId("1234"); //发起访问请求 $acsResponse = static::getAcsClient()->getAcsResponse($request); //通过调用acsResponse的成员属性code判断是否发送成功。 if ($acsResponse && $acsResponse->Code == 'OK') { return 1;//成功 } else { return 2;//失败 } }
这样就完成了整个短信平台的接入。如果存在比较难的地方,那相信是很多人没理解命名空间的问题。