更新时间:2024-06-21 GMT+08:00

PHP

样例

发送短信发送分批短信

接收状态报告

环境要求

php-7.4.33-Win32-vc15-x64

IntelliJ IDEA 2021.1.3安装PHP插件(Oro PHPStorm Plugin)

参考API签名SDK与demo,点击下载其中的SDK与Demo。将下列代码样例替换index.php文件内容即可。

  • 发送短信为单模板群发短信示例,发送分批短信为多模板群发短信示例。
  • 本文档所述Demo在提供服务的过程中,可能会涉及个人数据的使用,建议您遵从国家的相关法律采取足够的措施,以确保用户的个人数据受到充分的保护。
  • 本文档所述Demo仅用于功能演示,不允许客户直接进行商业使用。
  • 本文档信息仅供参考,不构成任何要约或承诺。

发送短信示例

 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
<html>
<head>
    <title>Send SMS test</title>
</head>
<body>
<pre>
    <?php
    require 'signer.php';
    $signer = new Signer();
    // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    $signer->Key = 'c8RWg3ggEcyd4D3p94bf3Y7x1Ile';      // app key
    $signer->Secret = "q4Ii87Bh************80SfD7Al";   // app secret
    $req = new Request('POST', 'https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendSms/v1');
    //Add header parameters
    $req->headers = array(
        'content-type' => 'application/x-www-form-urlencoded',
    );
    $req->body = 'from=csms12345678&to=%2B8615112346788&templateId=8ff55eac1d0b478ab3c06c3c6a492300&templateParas=["1"]&statusCallback=https://your.server.com/rest/callback/statusReport';
    $curl = $signer->Sign($req);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    var_dump($req->headers);
    var_dump($req);
    echo "--------------\n";
    $response = curl_exec($curl);
    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if ($status == 0) {
        echo curl_error($curl);
    } else {
        echo $status . "\n";
        echo $response;
    }
    curl_close($curl);
    ?>
</pre>
</body>
</html>

发送分批短信示例

 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
<html>
<head>
    <title>Send Diff SMS test</title>
</head>
<body>
<pre>
    <?php
    require 'signer.php';

    //必填,请参考"开发准备"获取如下数据,替换为实际值
    $url = 'https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendDiffSms/v1'; //APP接入地址(在控制台"应用管理"页面获取)+接口访问URI
    // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    $APP_KEY = 'c8RWg3ggEcyd4D3p94bf3Y7x1Ile'; //APP_Key
    $APP_SECRET = 'q4Ii87Bh************80SfD7Al'; //APP_Secret
    $sender = 'csms12345678'; //中国大陆短信签名通道号或全球短信通道号
    $TEMPLATE_ID_1 = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID1
    $TEMPLATE_ID_2 = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID2

    //条件必填,中国大陆短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称
    //全球短信不用关注该参数
    $signature_1 = "华为云短信测试"; //签名名称1
    $signature_2 = "华为云短信测试"; //签名名称2

    //必填,全局号码格式(包含国家码),示例:+86151****6789,多个号码之间用英文逗号分隔
    $receiver_1 = ['+86151****6789', '+86152****7890']; //模板1的接收号码
    $receiver_2 = ['+86151****6789', '+86152****7890']; //模板2的接收号码

    //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告
    $statusCallback = '';

    /**
     * 选填,使用无变量模板时请赋空值 $TEMPLATE_PARAS = [];
     * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,$TEMPLATE_PARAS可填写为['369751']
     * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,$TEMPLATE_PARAS可填写为['3','人民公园正门']
     * 查看更多模板和变量规范:产品介绍>模板和变量规范
     */
    $TEMPLATE_PARAS_1 = ['123456']; //模板1变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。
    $TEMPLATE_PARAS_2 = ['234567']; //模板2变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。

    //请求Body
    $data = json_encode([
        'from' => $sender,
        'statusCallback' => $statusCallback,
        'smsContent' => [ //必填,请根据模板ID数量灵活增减
            //smsContent,不携带签名名称时,signature请填''
            initDiffSms($receiver_1, $TEMPLATE_ID_1, $TEMPLATE_PARAS_1, $signature_1),
            initDiffSms($receiver_2, $TEMPLATE_ID_2, $TEMPLATE_PARAS_2, $signature_2)
        ]
    ]);

    $signer = new Signer();
    $signer->Key = $APP_KEY;      // app key
    $signer->Secret = $APP_SECRET;   // app secret

    $req = new Request('POST', $url);
    //Add header parameters
    $req->headers = array(
        'content-type' => 'application/json',
    );
    $req->body = $data;
    $curl = $signer->Sign($req);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    var_dump($req->headers);
    var_dump($req);
    echo "--------------\n";
    $response = curl_exec($curl);
    $status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if ($status == 0) {
        echo curl_error($curl);
    } else {
        echo $status . "\n";
        echo $response;
    }
    curl_close($curl);

    /**
     * 构造smsContent参数值
     * @param array $receiver
     * @param string $templateId
     * @param array $templateParas
     * @param string $signature | 签名名称,使用中国大陆短信通用模板时填写
     * @return string[]
     */
    function initDiffSms(array $receiver, string $templateId, array $templateParas, string $signature)
    {
        if (null != $signature && strlen($signature) > 0) {
            return ['to' => $receiver, 'templateId' => $templateId, 'templateParas' => $templateParas, 'signature' => $signature];
        }
        return ['to' => $receiver, 'templateId' => $templateId, 'templateParas' => $templateParas];
    }

    ?>
</pre>
</body>
</html>

接收状态报告

 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
<?php
// 短信平台上报状态报告数据样例(urlencode)
// $success_body = 'sequence=1&total=1&updateTime=2018-10-31T08%3A43%3A41Z&source=2&smsMsgId=2ea20735-f856-4376-afbf-570bd70a46ee_11840135&status=DELIVRD';
$failed_body = 'orgCode=E200027&sequence=1&total=1&updateTime=2018-10-31T08%3A43%3A41Z&source=2&smsMsgId=2ea20735-f856-4376-afbf-570bd70a46ee_11840135&status=RTE_ERR';

// onSmsStatusReport($success_body);
onSmsStatusReport($failed_body);

/**
 * 解析状态报告数据
 *
 * @param string $data 短信平台上报的状态报告数据
 */
function onSmsStatusReport(string $data)
{
    $keyValues = [];
    parse_str(urldecode($data), $keyValues); //解析状态报告数据

    /**
     * Example: 此处已解析status为例,请按需解析所需参数并自行实现相关处理
     *
     * 'smsMsgId': 短信唯一标识
     * 'total': 长短信拆分条数
     * 'sequence': 拆分后短信序号
     * 'source': 状态报告来源
     * 'updateTime': 资源更新时间
     * 'status': 状态报告枚举值
     * 'orgCode': 状态码
     */
    $status = $keyValues['status']; // 状态报告枚举值
    // 通过status判断短信是否发送成功
    if ('DELIVRD' === strtoupper($status)) {
        print 'Send sms success. smsMsgId: ' . $keyValues['smsMsgId'] . PHP_EOL;
    } else {
        // 发送失败,打印status和orgCode
        print 'Send sms failed. smsMsgId: ' . $keyValues['smsMsgId'] . PHP_EOL;
        print 'Failed status: ' . $status . PHP_EOL;
        print 'Failed orgCode: ' . $keyValues['orgCode'] . PHP_EOL;
    }
}
?>