服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - PHP教程 - php与阿里云短信接口接入操作案例分析

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

2021-10-15 14:51下页、再停留 PHP教程

这篇文章主要介绍了php与阿里云短信接口接入操作,结合具体实例形式分析了php与阿里云短信接口接入的具体操作步骤、原理、实现方法与注意事项,需要的朋友可以参考下

本文实例讲述了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

延伸 · 阅读

精彩推荐