百度云的sms发送更新了v3验证,但是easy-sms的还没有更新,这边急用,就自己写自定义gateways和message急用
环境:laravel7
因为懒得看百度的认证方式,就直接用百度官方提供的sms示例的 generateAuthorization 获取 header 的 Authorization
(简单暴力,但是省事)
再利用composer自动导入:
跑一下: composer dump-auto 搞定
首先是自定义gateways
MyBaiduGateWay.php
<?php
namespace App\Gateways;
use Carbon\Carbon;
use Overtrue\EasySms\Contracts\MessageInterface;
use Overtrue\EasySms\Contracts\PhoneNumberInterface;
use Overtrue\EasySms\Exceptions\GatewayErrorException;
use Overtrue\EasySms\Gateways\Gateway;
use Overtrue\EasySms\Support\Config;
use Overtrue\EasySms\Traits\HasHttpRequest;
class MyBaiduGateWay extends Gateway
{
use HasHttpRequest;
const ENDPOINT_HOST = 'smsv3.bj.baidubce.com';
const ENDPOINT_URI = '/api/v3/sendSms';
const DEFAULT_EXPIRATION_IN_SECONDS = 60; //签名有效期默认60秒
const SUCCESS_CODE = 1000; ///1000表示成功
public function send(PhoneNumberInterface $to, MessageInterface $message, Config $config)
{
$ak = $config->get('ak');
$sk = $config->get('sk');
$method = "POST";
$params = array();
// date_default_timezone_set('UTC');
// Carbon::now()->setTimezone('UTC');
$timestamp = new \DateTime('now',new \DateTimeZone('UTC'));
$expirationInSeconds = self::DEFAULT_EXPIRATION_IN_SECONDS;
$authorization = generateAuthorization($ak, $sk, $method, self::ENDPOINT_HOST, self::ENDPOINT_URI, $params, $timestamp, $expirationInSeconds);
//组装请求头
$timeStr = $timestamp->format("Y-m-d\TH:i:s\Z");
$head = array(
"Content-Type"=>"application/json",
"Authorization"=>$authorization,
"x-bce-date"=>$timeStr,
);
//请求的参数
$body = array(
"signatureId"=> $message->getSignatureId(), // 签名id
"mobile"=> $to->getNumber(), // 接收号码
"template"=> $message->getTemplate($this), // 模板id
"contentVar"=> $message->getData($this),
);
$result = $this->request($method, self::buildEndpoint($config), ['headers' => $head, 'json' => ($body)]);
if (self::SUCCESS_CODE != $result['code']) {
throw new GatewayErrorException($result['message'], $result['code'], $result);
}
return $result;
}
/**
* Build endpoint url.
*
* @param \Overtrue\EasySms\Support\Config $config
*
* @return string
*/
protected function buildEndpoint(Config $config)
{
return 'http://'.$config->get('domain', self::ENDPOINT_HOST).self::ENDPOINT_URI;
}
}
//设置完了之后是自定义消息:
MyBaiduMessage.php
<?php
namespace App\Custom\Message;
use Overtrue\EasySms\Contracts\GatewayInterface;
use Overtrue\EasySms\Message;
class MyBaiduMessage extends Message
{
/**
* @var string
*/
protected $signatureId;
/**
* 获取短信前民唯一id 例如:中资源bossedm的签名id
* @param GatewayInterface|null $gateway
* @return string
*/
public function getSignatureId(GatewayInterface $gateway = null)
{
return is_callable($this->signatureId) ? call_user_func($this->signatureId, $gateway) : $this->signatureId;
}
}
easysms.php
<?php
return [
// HTTP 请求的超时时间(秒)
'timeout' => 5.0,
// 默认发送配置
'default' => [
// 网关调用策略,默认:顺序调用
'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,
// 默认可用的发送网关,由于百度云的已经升级v3了,所以自定义一个gatways
'gateways' => [
'mybaidugateway',
],
],
// 可用的网关配置
'gateways' => [
'errorlog' => [
'file' => '/tmp/easy-sms.log',
],
'mybaidugateway' => [
'ak' => '',//自己填写相应的key
'sk' => '',//自己填写相应的key
'domain' => 'smsv3.bj.baidubce.com',
],
],
];
然后就可以愉快的玩耍了:
$easySms = new EasySms(config('easysms'));
// 注册
$easySms->extend('mybaidugateway', function ($gatewayConfig) {
// $gatewayConfig 来自配置文件里的 `gateways.mygateway`
return new MyBaiduGateWay($gatewayConfig);
});
$message_arr = [
"signatureId"=> "sms-sign-slkfaknfe",//自己去写自己的id
'template' => 'sms-tmpl-slkfaknfe',//模板
'data' => [
"msg"=> "你好,我是短信" // 模板变量
],
];
$myBaiduMessage = new MyBaiduMessage($message_arr);
$result = $easySms->send(18045338983,$myBaiduMessage );