<?php
namespace app\common\controller;
class Sms
{
const ACCESS_ID = 'XXXXXXXXXX';
const ACCESS_KEY = 'XXXXXXXXXX';
const END_POINT = 'http://XXXXXXXXXX.mns.cn-shanghai.aliyuncs.com';
const RESOURCE = '/topics/sms.topic-cn-shanghai/messages';
const TEMPLATE_CODE = 'XXXXXXXXXX';
const SIGN_NAME = 'XXXXXXXXXX';
const REQUEST_TYPE = 'POST';
protected $date;
protected $cellphone;
protected $code;
//
// __construct
//
public function __construct($cellphone, $code)
{
$this->cellphone = $cellphone;
$this->code = $code;
$this->date = gmdate("D, d M Y H:i:s \\G\\M\\T");
}
//
// 设置header
//
private function setHeader()
{
return [
"authorization:MNS " . self::ACCESS_ID . ":" . $this->generateSignature(),
"content-type:text/xml",
"date:" . $this->date,
"x-mns-version:2015-06-06"
];
}
//
// 生成签名
//
private function generateSignature() {
$str = self::REQUEST_TYPE . "\n";
$str .= '' . "\n";
$str .= 'text/xml' . "\n";
$str .= $this->date . "\n";
$str .= 'x-mns-version:2015-06-06' . "\n";
$str .= self::RESOURCE;
return base64_encode(hash_hmac('sha1', $str, self::ACCESS_KEY, true));
}
//
// 生成待发送的xml
//
private function generateBody()
{
return "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<Message xmlns=\"http://mns.aliyuncs.com/doc/v1/\">
<MessageBody>yema code</MessageBody>
<MessageAttributes>
<DirectSMS>
{
\"FreeSignName\":\"".self::SIGN_NAME."\",
\"TemplateCode\":\"".self::TEMPLATE_CODE."\",
\"Type\":\"singleContent\",
\"Receiver\":\"".$this->cellphone."\",
\"SmsParams\":\"{\\\"name\\\":\\\"".$this->code."\\\"}\"
}
</DirectSMS>
</MessageAttributes>
</Message>";
}
//
// 发送短信
//
public function sendSms()
{
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => self::END_POINT . self::RESOURCE,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => self::REQUEST_TYPE,
CURLOPT_POSTFIELDS => $this->generateBody(),
CURLOPT_HTTPHEADER => $this->setHeader(),
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
return $err ? false : true;
}
}//class
最佳答案
