對接電信發簡訊介面

洋蔥土豆隨心匠發表於2016-09-22
<?php
namespace Com\CTCC;

/**
 * 模板簡訊傳送類
 * @author yangchaochao
 *
 */
class SendTemplateMessage
{
    const OAUTH_URL = 'https://oauth.api.189.cn';
    const API_URL = 'http://api.189.cn';
    const OAUTH_ACCESS_TOKEN = '/emp/oauth2/v3/access_token';
    const SEND_TEMPLATE_MESSAGE = '/v2/emp/templateSms/sendSms';
    
    private $app_id = '';
    private $app_secret = '';
    private $grant_type = '';
    private $access_token = '';
	public $errCode = 40001;
	public $errMsg = "no access";
    
    public function __construct($options)
    {
        $this->app_id = isset($options['app_id']) ? $options['app_id'] : '';
        $this->app_secret = isset($options['app_secret']) ? $options['app_secret'] : '';
        $this->grant_type = isset($options['grant_type']) ? $options['grant_type'] : '';
        $this->access_token = isset($options['access_token']) ? $options['access_token'] : '';
    }
    
    /**
     * 獲取access_token
     * @param string $app_id
     * @param string $app_secret
     * @param string $access_token
     * @return Ambigous <string, unknown, mixed, object>
     */
    public function getAccessToken($app_id = '', $app_secret = '', $grant_type = '', $access_token = '')
    {
        if (!$app_id || !$app_secret || !$grant_type){
            $app_id = $this->app_id;
            $app_secret = $this->app_secret;
            $grant_type = $this->grant_type;
        }
        
        if ($access_token){
            $this->access_token = $access_token;
            return $this->access_token;
        }
        
        $cache_name = 'sendtemplatemessage_access_token' . $app_id;
        if ($rs = S($cache_name)){
            $this->access_token = $rs;
            return $this->access_token;
        }

        $post_param = array(
            'grant_type' => $grant_type
            ,'app_id' => $app_id
            ,'app_secret' => $app_secret
        );
        
        
        $access_token_url = self::OAUTH_URL . self::OAUTH_ACCESS_TOKEN;
        $http_result = $this->http_post($access_token_url, $post_param);
        
        if ($http_result){
            $json = json_decode($http_result);
            if (!$json || $json->res_code != 0){
                $this->errCode = isset($json->res_code) ? $json->res_code : "-1";
                $this->errMsg = isset($json->res_message) ? $json->res_message : 'json解析失敗';
                return false;
            }else{
                $this->access_token = $json->access_token;
                $expire = $json->expires_in ? intval($json->expires_in)-100 : 3600;
    			S($cache_name,$this->access_token,$expire);
    			
    			return $this->access_token;
            }
        }
        return false;
    }
    
    /**
     * 傳送模板簡訊
     * @param unknown $acceptor_tel
     * @param unknown $template_id
     * @param unknown $template_param
     * @param unknown $timestamp
     * @param string $app_id
     * @return Ambigous <string, mixed>|mixed|boolean
     */
    public function send($acceptor_tel, $template_id, $template_param, $timestamp, $app_id = '')
    {
        if (!$this->access_token && !$this->getAccessToken()){
            $result['code'] = $this->errCode;
            $result['message'] = $this->errMsg;
            return $result;
        }
        
        if(!$app_id){
            $app_id = $this->app_id;
        }
        
        $post_param = array(
            'app_id' => $app_id
            ,'access_token' => $this->access_token
            ,'acceptor_tel' => $acceptor_tel
            ,'template_id' => $template_id
            ,'template_param' => json_encode($template_param)
            ,'timestamp' => $timestamp
        );
        
        $send_template_url = self::API_URL . self::SEND_TEMPLATE_MESSAGE;
        
        $http_result = $this->http_post($send_template_url, $post_param);
        
        if ($http_result){
            $json = json_decode($http_result);
            
            if(!$json || $json->res_code != 0){
                $result['code'] = isset($json->res_code) ? $json->res_code : "-1";
                $result['message'] = isset($json->res_message) ? $json->res_message : 'json解析失敗';
                return $result;
            }else{
                $result['code'] = $json->res_code;
                $result['message'] = $json->res_message;
                $result['idertifier'] = $json->idertifier;
                return $result;
            }
        }
        return false;
    }
    
    /**
     * GET 請求
     * @param string $url
     */
    public function http_get($url){
        $oCurl = curl_init();
        if(stripos($url,"https://")!==FALSE){
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
        }
        curl_setopt($oCurl, CURLOPT_URL, $url);
        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
        $sContent = curl_exec($oCurl);
        $aStatus = curl_getinfo($oCurl);
        curl_close($oCurl);
        if(intval($aStatus["http_code"])==200){
            return $sContent;
        }else{
            return false;
        }
    }
    
    /**
     * POST 請求
     * @param string $url
     * @param array $param
     * @param boolean $post_file 是否檔案上傳
     * @return string content
     */
    private function http_post($url,$param,$post_file=false){
        $oCurl = curl_init();
        if(stripos($url,"https://")!==FALSE){
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
        }
        if (is_string($param) || $post_file) {
            $strPOST = $param;
        } else {
            $aPOST = array();
            foreach($param as $key=>$val){
                $aPOST[] = $key."=".urlencode($val);
            }
            $strPOST =  join("&", $aPOST);
        }
        curl_setopt($oCurl, CURLOPT_URL, $url);
        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt($oCurl, CURLOPT_POST,true);
        curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
        curl_setopt($oCurl, CURLOPT_ENCODING, 'UTF-8');
        $sContent = curl_exec($oCurl);
        $aStatus = curl_getinfo($oCurl);
        curl_close($oCurl);
        if(intval($aStatus["http_code"])==200){
            return $sContent;
        }else{
            return false;
        }
    }
}

  用於ThinkPHP框架,其他框架修改下快取方式也是可用的。

相關文章