PHP 阿里云OpenAPI签名[RPC 调用机制]·一键登录取号[云通信号码认证服务]

什么是RPC调用机制,我理解为 可以用 http https 访问的接口。

官方文档:RPC 调用机制 - 阿里云SDK - 阿里云https://help.aliyun.com/document_detail/315526.html#sectiondiv-qq5-utu-r7a

怎么说,今天想用阿里云的手机号一键登录。

官方文档:

阿里云 OpenAPI 开发者门户https://next.api.alibabacloud.com/api/Dypnsapi/2017-05-25/VerifyMobile?params=%7B%7D&tab=DEMO&lang=PHP

发现需要 composer require alibabacloud/dypnsapi-20170525 1.0.7

PHP 阿里云OpenAPI签名[RPC 调用机制]·一键登录取号[云通信号码认证服务]_第1张图片

怎么说 这个 composer 呢,一个依赖管理工具,我也不知道该怎么叙述。按照字面理解应该是服务端用来管理 依赖 的东西,可是我本身php就依赖于服务器而存在的,你再来个东西挂我php身上,大家稳住,我要变身了。有好有坏吧,安装也不难,运行安装命令也不难,没弄过的百度一天也能搞定这个东东。问题是我没有权限啊,没服务器权限。。。求人?不存在的,开放的第三方,肯定要给软件或者硬件的接口,软件的 绝大部分都是TCP协议,常用的也就http和https,也就是签名的方式和验签的方式不一样而已。

重点来了,直接上代码:


 * 2022-05-20
 */
class Ali {

    public $data;
    public $accessKeyId = ''; //阿里后台拿
    public $accessKeySecret = ''; //阿里后台拿
    public $url = 'https://dypnsapi.aliyuncs.com?'; //依据服务器那个快拿哪个,这个杭州的

    /**
     * new 的时候初始化参数
     * @param ary $actionArray     要调用的开放接口参数 数组,可以去除公共参数,后续如果有公共参数,自行添加在数组中或者 该类中都行
     * @param str $url             访问的服务器地址,看下自己服务器离哪个区域近拿哪个
     */
    public function __construct($actionArray, $url='https://dypnsapi.aliyuncs.com?') {
        $this->url = $url;
//        date_default_timezone_set("GTM");
        date_default_timezone_set("UTC");
//        date_default_timezone_set('Asia/Shanghai');
        $this->data = array(
            // 公共参数
            'Format' => 'JSON',//返回参数格式
            'Version' => '2017-05-25',//版本
            'AccessKeyId' => $this->accessKeyId,
            'SignatureVersion' => '1.0',//加餐版本
            'SignatureMethod' => 'HMAC-SHA1',//加餐方式,参数加密方式
            'SignatureNonce' => uniqid(),//访问唯一标识,防止重复
            'Timestamp' => date('Y-m-d') . 'T' . date('H:i:s') . 'Z',
            'SignatureVersion' => '1.0',
        );
        //判断输入的参数是否为数组
        if (is_array($actionArray)) {
            $this->data = array_merge($this->data, $actionArray);//数组合并
        }
    }

    /**
     * 传递参数处理
     * 按理中间3行要加上的,我这边报警告,就直接注释了
     * @param str $str  传递参数值
     * @return str     处理结果参数
     */
    public function percentEncode($str) {
        // 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
        $res = urlencode($str);
//        $res = preg_replace('/+/', '%20', $res);
//        $res = preg_replace('/*/', '%2A', $res);
//        $res = preg_replace('/%7E/', '~', $res);
        return $res;
    }
    
    /**
     * 加密
     * @param ary $parameters          加密参数
     * @param str $accessKeySecret     秘钥,第三方可以拿到
     * @return str                     返回签名
     */
    public function computeSignature($parameters, $accessKeySecret) {
        // 将参数Key按字典顺序排序
        ksort($parameters);
        // 生成规范化请求字符串
        $canonicalizedQueryString = '';
        foreach ($parameters as $key => $value) {
            $canonicalizedQueryString .= '&' . $this->percentEncode($key)
                    . '=' . $this->percentEncode($value);
        }
        // 生成用于计算签名的字符串 stringToSign
        $stringToSign = 'POST&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
        // 计算签名,注意accessKeySecret后面要加上字符'&'
        $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
        return $signature;
    }
    /**
     * 使用阿里签名访问openapi接口
     * @return 结果
     */
    public function callInterface() {
        // 计算签名并把签名结果加入请求参数
        $this->data['Signature'] = $this->computeSignature($this->data, $this->accessKeySecret);
//        return $this->data;
        // 发送请求
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type:application/x-www-form-urlencoded']);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https请求 不验证证书和hosts
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 不从证书中检查SSL加密算法是否存在
        curl_setopt($ch, CURLOPT_URL, $this->url . http_build_query($this->data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($ch);
        $res = json_decode($res, true);
        return $res;
    }

    /**
     * 测试
     */
    function test() {
        $accesstoken = 'eyJjIjoiTEJGdUN3dng3TmY1bFFjWEhVdVwvdlJpcVdKMnZNTDBDQ1ZUeXpraXBSclNFNEdJNEFNN29zbjJXOTloVXRIdlwvdXV5TXo3MkN0OFNSXG5TdzJQem1EMjN3YWVSd2o1Q0ExUlwvZzVXN3hpaXR4UkFONCtiRWc1dVhreE5lUmVyTHJUdWR1a0lOdDZQNEt5QWwwalZwbnFSNmFZRFxuUEdBNlFpdmtrM1pKekRLckZmT0t6SVVja203TmNGOHMzVW93NFBFMWltMERRUjNObnhxSzVRRzVveXhKNFBYWXV5QzdJYUVYXC8rZGtcbmwwRHpFUXZyR3NqeE9WMkVwSlgrb1ZVWmNHeFVEOEN0dk9uMm54eWVSdjFTNTByZitIdDNBRHQwSWRoa05iYTZTNVwvaDN2SzFuOTVZXG5VK3ArSWtpOStYZUVSWjB4amw5QmU3QjFtbmtEUXNzQVZcL08xYjZDYzlOZDZWT3VNcXg5aUcxOXdNVUxNWHNFbXBrc3pMVVFMQ1g0MFxubUNMdXlHXC9MWXFTUXV4cFBtYW40aFVkRVd4THEzeVwvY2N6UEVPcklobUlob0wxa3Q4Unh1M21qVm03czM2RGNsQ1JucHlUaU9PSTFSXG5aM1lqbnVLdzZ1RTh2dUhhaUtEYlV4MGh6VlF4OVl3Yzl2K0FCTGpYZmc4ZnRwajduOStpc29FdnBWMnY3Y2VPWnplVEs3d2hNN3pBXG5EcUp4NUxmVmdyVmV4TW4rTllvZnhOZktERmlOUTlXeXlMNDZIOXc4cVg5YzBtbWRnNFlVeGh1eHUxWUlQeWhDV3BuaFI3K0RYcTFwXG5jN1ltbWMxYlo0UjlXY1JrMzQzQ0dseGZOZnA1a21ITHY4VTM4OHhDb0wyMk9jNXQ1K3NHVDFncFU5U2ZmamFwMk96TXAwVmRcL1pFPVxuIiwiayI6Iks1Vllqb2NMc0NLOHdFNVFBaVgrSE5VblwvMVVPekZ5a0JoOVhaeitsK1NGTkVUV1I1aVJWYVNZYWlGbHpoUUZ0RDB1bjJTdlZCNzB4VDJJV0pRY2lSaEM2SXVHUVQxU1pkQytnYTlkM2dMS0EwNnhUWHhLVFN1VFRzeWlRS0ZZdzlwXC96OTVcL3E5ak9uaVgybSt6Tm9yamRkdVlJXC9sNWR0VjlLVldBQlpNXC93ZGVIc25KbVJGZ2dUc2F1cmk1Z2k3TUk2WXpmcTlGRWpGMlhZb3I2TVVEbVFpSlpjSlNkNnQwdTZFbkZOckRMOFNBeU4xQTY1VVJJTm81XC9xWTVvYjdYZ0tXQ2Z4cDQ5QmQwcVhcL3NJUndKMHZlTjFaa2wwUUxSSDlqRjF0UGNxdG5CTlZqK1wvRGVETmwwK1l5QlFvT21BcEFTUDhXVEpFNjA1Q2NVMXhSU0hBPT0iLCJvIjoiQW5kcm9pZCJ9';
        $arr = [
            "Action" => "GetMobile",
            "AccessToken" => $accesstoken,
        ];
        $obj = new Ali($arr);
        $data = $obj->callInterface();
        var_dump($data);
    }

}

结束语:愿君深造,为国效力。

你可能感兴趣的:(PHP,第三方,Ali,阿里云一键取号,阿里云openapi签名,php)