百度云短信对接,参数配置实例

感觉百度云短信用的人不多,网上也都没什么教程,虽然百度那边有人员对接,但是不是直接对接技术人员,这次我花了一天时间也没搞定。后来感觉应该是参数问题,和他们确定之后,确实是。我直接把代码贴上来,给大家参考。

下面是百度那边给的案例,我把走通的配置标注在代码里了,在框架中只要稍微改下就行,就不贴代码啦。

核心代码sendMessage.php:

<?php

require "auth.php";

// 第一步:生成认证字符串

$ak = "xxxxxx";  // AccessKeyId
$sk = "xxxxxx";  // SecretAccessKey

$method = "POST";

$host = "smsv3.bj.baidubce.com";//每个账号可能不同
$uri = "/api/v3/sendSms";
$url = "http://".$host.$uri;
$params = array();

date_default_timezone_set('UTC');
$timestamp = new \DateTime();
$expirationInSeconds = 3600;

$authorization = generateAuthorization($ak, $sk, $method, $host, $uri, $params, $timestamp, $expirationInSeconds);
print("authorization: {$authorization}\n");

// 第二步:构造HTTP请求的header、body等信息

$timeStr = $timestamp->format("Y-m-d\TH:i:s\Z");
$head =  array(
    "Content-Type:application/json",
    "Authorization:{$authorization}",
    "host:{$host}",
    "x-bce-date:{$timeStr}"
    );
//重要*****
$body = array(
    "mobile" => "13612341234",
    "sign" => "xxxx",//签名内容,也可能是签名id
    "type" => "normal",
    "custom" => "",//随便写123都可以
    "template" => "sms-tmpl-EFKqOl65111"//模板,我之前用smstpl:sms-tmpl-EFKqOl65111,这个不行
     "contentVar" => array("content" => "12345")
    );
$bodyStr = json_encode($body);

// 第三步:发送HTTP请求,并输出响应信息。

$curlp = curl_init();
curl_setopt($curlp, CURLOPT_POST, 1);
curl_setopt($curlp, CURLOPT_URL, $url);
curl_setopt($curlp, CURLOPT_HTTPHEADER, $head);
curl_setopt($curlp, CURLOPT_POSTFIELDS, $bodyStr);

curl_setopt($curlp, CURLINFO_HEADER_OUT, 1);
curl_setopt($curlp, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($curlp);
$request = curl_getinfo($curlp, CURLINFO_HEADER_OUT);
$status = curl_getinfo($curlp, CURLINFO_HTTP_CODE);
curl_close($curlp);

print("request: {$request}\n");
print("request body: {$bodyStr}\n");
print("status: {$status}\n");
print("response: {$response}\n");

?>

这是一个工具类auth.php

<?php
class HttpUtil
{
    // 根据RFC 3986,除了:
    //   1.大小写英文字符
    //   2.阿拉伯数字
    //   3.点'.'、波浪线'~'、减号'-'以及下划线'_'
    // 以外都要编码
    public static $PERCENT_ENCODED_STRINGS;

    //填充编码数组
    public static function __init()
    {
        HttpUtil::$PERCENT_ENCODED_STRINGS = array();
        for ($i = 0; $i < 256; ++$i) {
            HttpUtil::$PERCENT_ENCODED_STRINGS[$i] = sprintf("%%%02X", $i);
        }

        //a-z不编码
        foreach (range('a', 'z') as $ch) {
            HttpUtil::$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
        }

        //A-Z不编码
        foreach (range('A', 'Z') as $ch) {
            HttpUtil::$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
        }

        //0-9不编码
        foreach (range('0', '9') as $ch) {
            HttpUtil::$PERCENT_ENCODED_STRINGS[ord($ch)] = $ch;
        }

        //以下4个字符不编码
        HttpUtil::$PERCENT_ENCODED_STRINGS[ord('-')] = '-';
        HttpUtil::$PERCENT_ENCODED_STRINGS[ord('.')] = '.';
        HttpUtil::$PERCENT_ENCODED_STRINGS[ord('_')] = '_';
        HttpUtil::$PERCENT_ENCODED_STRINGS[ord('~')] = '~';
    }

    /**
    * 在uri编码中不能对'/'编码
    * @param string
    * @return string
    */
    public static function urlEncodeExceptSlash($path) {
        return str_replace("%2F", "/", HttpUtil::urlEncode($path));
    }

    /**
    * 使用编码数组编码
    * @param string
    * @return string
    */
    public static function urlEncode($value)
    {
        $result = '';
        for ($i = 0; $i < strlen($value); ++$i) {
            $result .= HttpUtil::$PERCENT_ENCODED_STRINGS[ord($value[$i])];
        }
        return $result;
    }

    /**
    * 生成标准化QueryString
    * @param array
    * @return string
    */
    public static function getCanonicalQueryString(array $parameters)
    {
        //没有参数,直接返回空串
        if (count($parameters) == 0) {
            return '';
        }

        $parameterStrings = array();
        foreach ($parameters as $k => $v) {
            //跳过Authorization字段
            if (strcasecmp('Authorization', $k) == 0) {
                continue;
            }
            if (!isset($k)) {
                throw new \InvalidArgumentException(
                    "parameter key should not be null"
                    );
            }
            if (isset($v)) {
                //对于有值的,编码后放在=号两边
                $parameterStrings[] = HttpUtil::urlEncode($k)
                . '=' . HttpUtil::urlEncode((string) $v);
            } else {
                //对于没有值的,只将key编码后放在=号的左边,右边留空
                $parameterStrings[] = HttpUtil::urlEncode($k) . '=';
            }
        }
        //按照字典序排序
        sort($parameterStrings);

        //使用'&'符号连接它们
        return implode('&', $parameterStrings);
    }

    /**
    * 生成标准化uri
    * @param string
    * @return string
    */
    public static function getCanonicalURIPath($path)
    {
        //空路径设置为'/'
        if (empty($path)) {
            return '/';
        } else {
            //所有的uri必须以'/'开头
            if ($path[0] == '/') {
                return HttpUtil::urlEncodeExceptSlash($path);
            } else {
                return '/' . HttpUtil::urlEncodeExceptSlash($path);
            }
        }
    }
    /**
    * 生成标准化http请求头串
    * @param array
    * @return string
    */
    public static function getCanonicalHeaders($headers)
    {
        //如果没有headers,则返回空串
        if (count($headers) == 0) {
            return '';
        }

        $headerStrings = array();
        foreach ($headers as $k => $v) {
            //跳过key为null的
            if ($k === null) {
                continue;
            }
            //如果value为null,则赋值为空串
            if ($v === null) {
                $v = '';
            }
            //trim后再encode,之后使用':'号连接起来
            $headerStrings[] = HttpUtil::urlEncode(strtolower(trim($k))) . ':' . HttpUtil::urlEncode(trim($v));
        }
        //字典序排序
        sort($headerStrings);

        //用'\n'把它们连接起来
        return implode("\n", $headerStrings);
    }
}
HttpUtil::__init();

    /**
    * 生成标准化http请求头串
    * @param string
    * @return string
    */
function generateAuthorization($ak, $sk, $method, $host, $uri, $params, $timestamp, $expirationInSeconds) {
    $timeStr = $timestamp->format("Y-m-d\TH:i:s\Z");

    $authStringPrefix = "bce-auth-v1/{$ak}/{$timeStr}/{$expirationInSeconds}";
    $signingKey = hash_hmac('SHA256', $authStringPrefix, $sk);
    $canonicalHeader1 = "host;x-bce-date";
    $canonicalHeader2 = "host:{$host}\n" . "x-bce-date:" . urlencode($timeStr);

    $httpUtil = new HttpUtil();
    $canonicalString = $httpUtil->getCanonicalQueryString($params);
    $canonicalUri = $httpUtil->getCanonicalURIPath($uri);
    $method = strtoupper($method);
    $canonicalRequest = "{$method}\n{$canonicalUri}\n{$canonicalString}\n{$canonicalHeader2}";

    $signature = hash_hmac('SHA256', $canonicalRequest, $signingKey);
    $authorization = "bce-auth-v1/{$ak}/{$timeStr}/{$expirationInSeconds}/{$canonicalHeader1}/{$signature}";
    return $authorization;
}

?>

有问题可以给我留言哦

林明潭blog
请先登录后发表评论
  • latest comments
  • 总共0条评论