网易云信已经出来很久,一直想试试。最近也有机会,放弃了之前使用的短信服务商,觉得不是很好用,想试试网易云信怎么样。

云信最近貌似降价了...

w1.jpg

短信接入本来就比较简单,不过云信的的开发手册里面有些东西还是需要靠自己弄清楚(没有PHP的代码示例)。

废话不多说,先上手册地址

下面两个手册一个是短信的,第二个是关于APP和APP.SECRET的验证的

一、获得APPKEY、APPsecret

这个自己申请就OK,免费20条短信。

同样server端保存咯..

w2.jpg

二、APP Checksum

网易云信的checksum使用的也是sha1计算并转成小写

  • 手册说16进制字符串,恰巧PHP sha1()计算返回的默认就是16进制,具体的可以看看PHP手册

Checksum的构建:

1、组成

构建checksum有三部分,分别如下

  1. CurTime : 当前时间戳,直接time()生成即可

    • 需要注意的是,服务器时间应当是正常的时间,否则会认为失效。
  2. Nonce : 一个不超过128字符的随机数,直接rand()生成即可

    • 这个随机数是随便的,只是多一个验证而已
  3. APP secret :获得的APP secret

2、组合顺序

    sha1(APP_SECRET.$nonce.$curtime);

3、使用示例

因为后面要设置HTTP CURL的HEADER,因此建议写成一个函数

网易云信的服务Checksum的校验全部放在请求的Header中,这是非常关键的一点。而请求头包括的内容包括AppKey , Nonce , CurTime , CheckSum , Content-Type , 其中Content-Type是固定的,其他的由自己生成,而且建议每次生成新的checksum,因此一个header函数显得非常重要。

  /**
     * 得到头信息
     * @param  none
     * @return array $header - 头信息数组
     */
    public function getHeader(){
        // 构建checksum
        $curtime=time();
        $nonce=rand();
        $checksum=strtolower(sha1(Config::get('wangyi.appsecret').$nonce.$curtime));
        // 构建header
        $header=array(
            'AppKey:'.Config::get('wangyi.appkey'),
            'CurTime:'.$curtime,
            'CheckSum:'.$checksum,
            'Nonce:'.$nonce,
            'Content-Type: application/x-www-form-urlencoded;charset=utf-8',
        );
        return $header;
    }

三、发送CURL请求

PHP 肯定是使用CURL发送是最好的,因此这里是我珍藏的一个发送curl POST请求的函数。

而且能够设置HTTP CURL请求的请求头以及响应头等,关于查看请求头和响应头,可以下面链接:

/**
 * 发送数据
 * @param String $url     请求的地址
 * @param array  $header  自定义的header数据
 * @param array  $content POST的数据
 * @return String
 */
function curl_post($url, $header, $content){
    $ch = curl_init();
    if(substr($url,0,5)=='https'){
        // 跳过证书检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        // 从证书中检查SSL加密算法是否存在
        // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    // 设置允许查看请求头信息
    // curl_setopt($ch,CURLINFO_HEADER_OUT,true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($content));
    $response = curl_exec($ch);
    // 查看请求头信息
    // dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
    if($error=curl_error($ch)){
        curl_close($ch);
        return $error;
    }else{
        curl_close($ch);
        return $response;
    }
}

四、发送验证码校验验证码

上面工作做好之后,就可以发送短信验证码或者校验了。

一个参考的示例如下:

  • curl_post为发送curl post请求的函数
  • getHeader()为获得头部数组信息的函数
   public function message(){
        $header=$this->getHeader();
        // 构建data
        $data=array(
            'mobile'=>'138xxxxxxx'
        );
        // URL
        $url='https://api.netease.im/sms/sendcode.action';
        // 发送短信验证码
        $res=curl_post($url,$header,$data);
        dump($res);
        return '';
    }

五、错误说明

如果返回414错误,一定是因为头信息设置错误的问题,或者是checksum有问题(checksum一般不会有问题)。

说说我的错误:

  1. 我一开始设置头信息的时候,Nonce:12345677 这里冒号(:)两边留了空格,结果就错误!!切记。

需要说明的部分:

  1. 上述代码中只有curl_post()可以直接复制,而Config::get('wangyi.appkey')是thinkphp5框架获取配置信息的函数,请自动替换成自己的APPkey或者是APP secret的函数.