服务器之家

服务器之家 > 正文

php与阿里云短信接口接入操作案例分析

时间:2021-10-15 14:51     来源/作者:下页、再停留

本文实例讲述了php与阿里云短信接口接入操作。分享给大家供大家参考,具体如下:

使用阿里云短信API,需要在控制台获取以下必要参数,其中需要自己手机验证+官方审核多次,尤其审核需要保持耐心。

1. accessKeyId  相当于你的个人账户密钥;

2. accessKeySecret 与上是成对的;

3. SignName  个人签名,在发出去的短信中,这个签名会显示在开头,类似 【签名】亲爱的用户...... 这种格式,SignName需要通过提交审核;

4.TemplateCode  模板代码,阿里云短信是无法完全自定义短信的,需要通过审核的模板,然后自己再替换掉模板中的变量,如模板:“您的验证码是$[code]” ,code就是变量,使用时需设置变量值{"code":"12345"}(设置变量值的过程在demo中实现),短信发出去后变成:“您的验证码是12345”,每个通过审核的模板会提供一个模板代码;

最新的阿里云短信接口,适用于阿里大于搬家以后的情况。

之前一直用阿里大于的短信接口,最近上项目时发现阿里大于悄悄地搬家到了阿里云!阿里云的SDK文件繁多,看得一头雾水!下面代码是最新的可适用于阿里云短信服务的类,亲测成功!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
<?php
/**
 * 阿里云短信验证码发送类
 * @author Administrator
 *
 */
class Sms {
 
  // 保存错误信息
 
  public $error;
 
  // Access Key ID
 
  private $accessKeyId = '';
 
  // Access Access Key Secret
 
  private $accessKeySecret = '';
 
  // 签名
 
  private $signName = '';
 
  // 模版ID
 
  private $templateCode = '';
 
  public function __construct($cofig = array()) {
 
    $cofig = array (
 
        'accessKeyId' => 'xxxxxxxxxxx',
 
        'accessKeySecret' => 'xxxxxxxxxx',
 
        'signName' => '你的签名',
 
        'templateCode' => 'SMS_76510109'
 
    );
 
    // 配置参数
 
    $this->accessKeyId = $cofig ['accessKeyId'];
 
    $this->accessKeySecret = $cofig ['accessKeySecret'];
 
    $this->signName = $cofig ['signName'];
 
    $this->templateCode = $cofig ['templateCode'];
 
  }
 
  private function percentEncode($string) {
 
    $string = urlencode ( $string );
 
    $string = preg_replace ( '/\+/', '%20', $string );
 
    $string = preg_replace ( '/\*/', '%2A', $string );
 
    $string = preg_replace ( '/%7E/', '~', $string );
 
    return $string;
 
  }
 
  /**
   * 签名
   *
   * @param unknown $parameters     
   * @param unknown $accessKeySecret     
   * @return string
   */
 
  private function computeSignature($parameters, $accessKeySecret) {
 
    ksort ( $parameters );
 
    $canonicalizedQueryString = '';
 
    foreach ( $parameters as $key => $value ) {
 
      $canonicalizedQueryString .= '&' . $this->percentEncode ( $key ) . '=' . $this->percentEncode ( $value );
 
    }
 
    $stringToSign = 'GET&%2F&' . $this->percentencode ( substr ( $canonicalizedQueryString, 1 ) );
 
    $signature = base64_encode ( hash_hmac ( 'sha1', $stringToSign, $accessKeySecret . '&', true ) );
 
    return $signature;
 
  }
 
  /**
   * @param unknown $mobile     
   * @param unknown $verify_code     
   *
   */
 
  public function send_verify($mobile, $verify_code) {
 
    $params = array //此处作了修改
 
        'SignName' => $this->signName,
 
        'Format' => 'JSON',
 
        'Version' => '2017-05-25',
 
        'AccessKeyId' => $this->accessKeyId,
 
        'SignatureVersion' => '1.0',
 
        'SignatureMethod' => 'HMAC-SHA1',
 
        'SignatureNonce' => uniqid (),
 
        'Timestamp' => gmdate ( 'Y-m-d\TH:i:s\Z' ),
 
        'Action' => 'SendSms',
 
        'TemplateCode' => $this->templateCode,
 
        'PhoneNumbers' => $mobile,
 
        //'TemplateParam' => '{"code":"' . $verify_code . '"}'
 
        'TemplateParam' => '{"time":"1234"}'  //更换为自己的实际模版
 
    );
 
    //var_dump($params);die;
 
    // 计算签名并把签名结果加入请求参数
 
    $params ['Signature'] = $this->computeSignature ( $params, $this->accessKeySecret );
 
    // 发送请求(此处作了修改)
 
    //$url = 'https://sms.aliyuncs.com/?' . http_build_query ( $params );
 
    $url = 'http://dysmsapi.aliyuncs.com/?' . http_build_query ( $params );
 
    $ch = curl_init ();
 
    curl_setopt ( $ch, CURLOPT_URL, $url );
 
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
 
    curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
 
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
 
    curl_setopt ( $ch, CURLOPT_TIMEOUT, 10 );
 
    $result = curl_exec ( $ch );
 
    curl_close ( $ch );
 
    $result = json_decode ( $result, true );
 
    //var_dump($result);die;
 
    if (isset ( $result ['Code'] )) {
 
      $this->error = $this->getErrorMessage ( $result ['Code'] );
 
      return false;
 
    }
 
    return true;
 
  }
 
  /**
   * 获取详细错误信息
   *
   * @param unknown $status     
   */
 
  public function getErrorMessage($status) {
 
    // 阿里云的短信 乱八七糟的(其实是用的阿里大于)
 
    // https://api.alidayu.com/doc2/apiDetail?spm=a3142.7629140.1.19.SmdYoA&apiId=25450
 
    $message = array (
 
        'InvalidDayuStatus.Malformed' => '账户短信开通状态不正确',
 
        'InvalidSignName.Malformed' => '短信签名不正确或签名状态不正确',
 
        'InvalidTemplateCode.MalFormed' => '短信模板Code不正确或者模板状态不正确',
 
        'InvalidRecNum.Malformed' => '目标手机号不正确,单次发送数量不能超过100',
 
        'InvalidParamString.MalFormed' => '短信模板中变量不是json格式',
 
        'InvalidParamStringTemplate.Malformed' => '短信模板中变量与模板内容不匹配',
 
        'InvalidSendSms' => '触发业务流控',
 
        'InvalidDayu.Malformed' => '变量不能是url,可以将变量固化在模板中'
 
    );
 
    if (isset ( $message [$status] )) {
 
      return $message [$status];
 
    }
 
    return $status;
 
  }
 
}

调用方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
//生成验证码
$mobile = 'xxxxxxx';
$code = rand ( 1000, 9999 );
//发送短信
$sms = new Sms();
 
//测试模式
$status = $sms->send_verify($mobile, $code);
if (!$status) {
 echo $sms->error;
 
}

希望本文所述对大家PHP程序设计有所帮助。

原文链接:https://www.cnblogs.com/zxf100/p/11473662.html

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部