更新时间:2024-06-21 GMT+08:00
PHP
样例 |
|
---|---|
环境要求 |
基于PHP 7.2.9版本,要求PHP 7.0及以上版本。 |
依赖配置 |
Composer、Guzzle(仅示例1依赖)
|
- 发送短信为单模板群发短信示例,发送分批短信为多模板群发短信示例。
- 本文档所述Demo在提供服务的过程中,可能会涉及个人数据的使用,建议您遵从国家的相关法律采取足够的措施,以确保用户的个人数据受到充分的保护。
- 本文档所述Demo仅用于功能演示,不允许客户直接进行商业使用。
- 本文档信息仅供参考,不构成任何要约或承诺。
发送短信(示例1)
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 |
<?php require 'vendor/autoload.php'; //执行composer install时自动生成 use GuzzleHttp\Psr7; use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; //必填,请参考"开发准备"获取如下数据,替换为实际值 $url = 'https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendSms/v1'; //APP接入地址+接口访问URI // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; $APP_KEY = 'c8RWg3ggEcyd4D3p94bf3Y7x1Ile'; //Application Key $APP_SECRET = 'q4Ii87Bh************80SfD7Al'; //Application Secret $sender = 'csms12345678'; //中国大陆短信签名通道号或全球短信通道号 $TEMPLATE_ID = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID //条件必填,中国大陆短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 //全球短信不用关注该参数 $signature = "华为云短信测试"; //签名名称 //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔 $receiver = '+8615123456789,+8615234567890'; //短信接收人号码 //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 $statusCallback = ''; /** * 选填,使用无变量模板时请赋空值 $TEMPLATE_PARAS = ''; * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,$TEMPLATE_PARAS可填写为 '["369751"]' * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,$TEMPLATE_PARAS可填写为'["3","人民公园正门"]' * 查看更多模板和变量规范 * @var string $TEMPLATE_PARAS */ $TEMPLATE_PARAS = '["369751"]'; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 $client = new Client(); try { $response = $client->request('POST', $url, [ 'form_params' => [ 'from' => $sender, 'to' => $receiver, 'templateId' => $TEMPLATE_ID, 'templateParas' => $TEMPLATE_PARAS, 'statusCallback' => $statusCallback, // 'signature' => $signature //使用中国大陆短信通用模板时,必须填写签名名称 ], 'headers' => [ 'Authorization' => 'WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE' => buildWsseHeader($APP_KEY, $APP_SECRET) ], 'verify' => false //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 ]); echo Psr7\str($response); //打印响应信息 } catch (RequestException $e) { echo $e; echo Psr7\str($e->getRequest()), "\n"; if ($e->hasResponse()) { echo Psr7\str($e->getResponse()); } } /** * 构造X-WSSE参数值 * @param string $appKey * @param string $appSecret * @return string */ function buildWsseHeader(string $appKey, string $appSecret){ $now = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce $base64 = base64_encode(hash('sha256', ($nonce . $now . $appSecret))); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $appKey, $base64, $nonce, $now); } ?> |
发送短信(示例2)
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 |
<?php //必填,请参考"开发准备"获取如下数据,替换为实际值 $url = 'https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendSms/v1'; //APP接入地址+接口访问URI // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; $APP_KEY = 'c8RWg3ggEcyd4D3p94bf3Y7x1Ile'; //Application Key $APP_SECRET = 'q4Ii87Bh************80SfD7Al'; //Application Secret $sender = 'csms12345678'; //中国大陆短信签名通道号或全球短信通道号 $TEMPLATE_ID = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID //条件必填,中国大陆短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 //全球短信不用关注该参数 $signature = '华为云短信测试'; //签名名称 //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔 $receiver = '+8615123456789,+8615234567890'; //短信接收人号码 //选填,短信状态报告接收地址,推荐使用域名,为空或者不填表示不接收状态报告 $statusCallback = ''; /** * 选填,使用无变量模板时请赋空值 $TEMPLATE_PARAS = ''; * 单变量模板示例:模板内容为"您的验证码是${NUM_6}"时,$TEMPLATE_PARAS可填写为'["369751"]' * 双变量模板示例:模板内容为"您有${NUM_2}件快递请到${TXT_20}领取"时,$TEMPLATE_PARAS可填写为'["3","人民公园正门"]' * 查看更多模板和变量规范 * @var string $TEMPLATE_PARAS */ $TEMPLATE_PARAS = '["369751"]'; //模板变量,此处以单变量验证码短信为例,请客户自行生成6位验证码,并定义为字符串类型,以杜绝首位0丢失的问题(例如:002569变成了2569)。 //请求Headers $headers = [ 'Content-Type: application/x-www-form-urlencoded', 'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE: ' . buildWsseHeader($APP_KEY, $APP_SECRET) ]; //请求Body $data = http_build_query([ 'from' => $sender, 'to' => $receiver, 'templateId' => $TEMPLATE_ID, 'templateParas' => $TEMPLATE_PARAS, 'statusCallback' => $statusCallback, // 'signature' => $signature //使用中国大陆短信通用模板时,必须填写签名名称 ]); $context_options = [ 'http' => ['method' => 'POST', 'header'=> $headers, 'content' => $data, 'ignore_errors' => true], 'ssl' => ['verify_peer' => false, 'verify_peer_name' => false] //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 ]; print_r($context_options) . PHP_EOL; //打印请求信息 $response = file_get_contents($url, false, stream_context_create($context_options)); print_r($response) . PHP_EOL; //打印响应信息 /** * 构造X-WSSE参数值 * @param string $appKey * @param string $appSecret * @return string */ function buildWsseHeader(string $appKey, string $appSecret){ date_default_timezone_set('Asia/Shanghai'); $now = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce $base64 = base64_encode(hash('sha256', ($nonce . $now . $appSecret))); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $appKey, $base64, $nonce, $now); } ?> |
发送分批短信(示例1)
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 |
<?php require 'vendor/autoload.php'; //执行composer install时自动生成 use GuzzleHttp\Psr7; use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; //必填,请参考"开发准备"获取如下数据,替换为实际值 $url = 'https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendDiffSms/v1'; //APP接入地址+接口访问URI // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; $APP_KEY = 'c8RWg3ggEcyd4D3p94bf3Y7x1Ile'; //Application Key $APP_SECRET = 'q4Ii87Bh************80SfD7Al'; //Application Secret $sender = 'csms12345678'; //中国大陆短信签名通道号或全球短信通道号 $TEMPLATE_ID_1 = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID1 $TEMPLATE_ID_2 = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID2 //条件必填,中国大陆短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 //全球短信不用关注该参数 $signature_1 = "华为云短信测试"; //签名名称1 $signature_2 = "华为云短信测试"; //签名名称2 //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔 $receiver_1 = ['+8615123456789', '+8615234567890']; //模板1的接收号码 $receiver_2 = ['+8615123456789', '+8615234567890']; //模板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)。 //必填,请根据模板ID数量灵活增减 $smsContent = [ //smsContent,不携带签名名称时,signature请填'' initDiffSms($receiver_1, $TEMPLATE_ID_1, $TEMPLATE_PARAS_1, $signature_1), initDiffSms($receiver_2, $TEMPLATE_ID_2, $TEMPLATE_PARAS_2, $signature_2) ]; $client = new Client(); try { $response = $client->request('POST', $url, [ 'body' => json_encode([ 'from' => $sender, 'statusCallback' => $statusCallback, 'smsContent' => $smsContent ]), 'headers' => [ 'Authorization' => 'WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE' => buildWsseHeader($APP_KEY, $APP_SECRET), 'Content-Type' => 'application/json' ], 'verify' => false //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 ]); echo Psr7\str($response); //打印响应信息 } catch (RequestException $e) { echo $e; echo Psr7\str($e->getRequest()), "\n"; if ($e->hasResponse()) { echo Psr7\str($e->getResponse()); } } /** * 构造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]; } /** * 构造X-WSSE参数值 * @param string $appKey * @param string $appSecret * @return string */ function buildWsseHeader(string $appKey, string $appSecret){ $now = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce $base64 = base64_encode(hash('sha256', ($nonce . $now . $appSecret))); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $appKey, $base64, $nonce, $now); } ?> |
发送分批短信(示例2)
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 |
<?php //必填,请参考"开发准备"获取如下数据,替换为实际值 $url = 'https://smsapi.ap-southeast-1.myhuaweicloud.com:443/sms/batchSendDiffSms/v1'; //APP接入地址+接口访问URI $APP_KEY = 'c8RWg3ggEcyd4D3p94bf3Y7x1Ile'; //Application Key // 认证用的appKey和appSecret硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; $APP_SECRET = 'q4Ii87Bh************80SfD7Al'; //Application Secret $sender = 'csms12345678'; //中国大陆短信签名通道号或全球短信通道号 $TEMPLATE_ID_1 = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID1 $TEMPLATE_ID_2 = '8ff55eac1d0b478ab3c06c3c6a492300'; //模板ID2 //条件必填,中国大陆短信关注,当templateId指定的模板类型为通用模板时生效且必填,必须是已审核通过的,与模板类型一致的签名名称 //全球短信不用关注该参数 $signature_1 = "华为云短信测试"; //签名名称1 $signature_2 = "华为云短信测试"; //签名名称2 //必填,全局号码格式(包含国家码),示例:+8615123456789,多个号码之间用英文逗号分隔 $receiver_1 = ['+8615123456789', '+8615234567890']; //模板1的接收号码 $receiver_2 = ['+8615123456789', '+8615234567890']; //模板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)。 //请求Headers $headers = [ 'Content-Type: application/json', 'Authorization: WSSE realm="SDP",profile="UsernameToken",type="Appkey"', 'X-WSSE: ' . buildWsseHeader($APP_KEY, $APP_SECRET) ]; //请求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) ] ]); $context_options = [ 'http' => ['method' => 'POST', 'header'=> $headers, 'content' => $data, 'ignore_errors' => true], 'ssl' => ['verify_peer' => false, 'verify_peer_name' => false] //为防止因HTTPS证书认证失败造成API调用失败,需要先忽略证书信任问题 ]; print_r($context_options) . PHP_EOL; //打印请求信息 $response = file_get_contents($url, false, stream_context_create($context_options)); print_r($response) . PHP_EOL; //打印响应信息 /** * 构造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]; } /** * 构造X-WSSE参数值 * @param string $appKey * @param string $appSecret * @return string */ function buildWsseHeader(string $appKey, string $appSecret){ date_default_timezone_set('Asia/Shanghai'); $now = date('Y-m-d\TH:i:s\Z'); //Created $nonce = uniqid(); //Nonce $base64 = base64_encode(hash('sha256', ($nonce . $now . $appSecret))); //PasswordDigest return sprintf("UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"", $appKey, $base64, $nonce, $now); } ?> |
接收状态报告
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; } } ?> |
父主题: X-WSSE认证