You've already forked qlg.tsgz.moe
							
							
		
			
				
	
	
		
			232 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
	
	
<?php
 | 
						|
 | 
						|
/**
 | 
						|
 * 多媒体文件客户端
 | 
						|
 * @author yikai.hu
 | 
						|
 * @version $Id: AlipayMobilePublicMultiMediaClient.php, v 0.1 Aug 15, 2014 10:19:01 AM yikai.hu Exp $
 | 
						|
 */
 | 
						|
 | 
						|
//namespace alipay\api ;
 | 
						|
 | 
						|
include("AlipayMobilePublicMultiMediaExecute.php");
 | 
						|
 | 
						|
 | 
						|
class AlipayMobilePublicMultiMediaClient{
 | 
						|
 | 
						|
    private				$DEFAULT_CHARSET = 'UTF-8';
 | 
						|
    private				$METHOD_POST     = "POST";
 | 
						|
    private				$METHOD_GET      = "GET";
 | 
						|
	private				$SIGN			= 'sign'; //get name
 | 
						|
 | 
						|
	private				$timeout = 10 ;// 超时时间
 | 
						|
    private				$serverUrl;
 | 
						|
    private				$appId;
 | 
						|
    private				$privateKey;
 | 
						|
    private				$prodCode;
 | 
						|
    private				$format          = 'json'; //todo
 | 
						|
    private				$sign_type       = 'RSA'; //todo
 | 
						|
 | 
						|
	private				$charset;
 | 
						|
	private				$apiVersion    = "1.0";
 | 
						|
	private				$apiMethodName = "alipay.mobile.public.multimedia.download";
 | 
						|
	private				$media_id = "L21pZnMvVDFQV3hYWGJKWFhYYUNucHJYP3Q9YW13ZiZ4c2lnPTU0MzRhYjg1ZTZjNWJmZTMxZGJiNjIzNDdjMzFkNzkw575";
 | 
						|
	//此处写死的,实际开发中,请传入
 | 
						|
 | 
						|
    private				$connectTimeout  = 3000;
 | 
						|
    private				$readTimeout     = 15000;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	function __construct($serverUrl = '', $appId = '', $partner_private_key = '', $format = '', $charset = 'GBK'){
 | 
						|
		$this -> serverUrl = $serverUrl;
 | 
						|
		$this -> appId = $appId;
 | 
						|
		$this -> privateKey = $partner_private_key;
 | 
						|
		$this -> format = $format;
 | 
						|
		$this -> charset = $charset;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * getContents 获取网址内容
 | 
						|
	 * @param $request
 | 
						|
	 * @return text | bin
 | 
						|
	 */
 | 
						|
	public function getContents(){
 | 
						|
		//自己的服务器如果没有 curl,可用:fsockopen() 等
 | 
						|
 | 
						|
 | 
						|
		//1:
 | 
						|
		//2: 私钥格式
 | 
						|
		$datas = array(
 | 
						|
			"app_id" 		=> $this -> appId,
 | 
						|
			"method" 		=> $this -> METHOD_POST,
 | 
						|
			"sign_type" 	=> $this -> sign_type,
 | 
						|
			"version" 		=> $this -> apiVersion,
 | 
						|
			"timestamp" 	=> date('Y-m-d H:i:s')  ,//yyyy-MM-dd HH:mm:ss
 | 
						|
			"biz_content" 	=> '{"mediaId":"'. $this -> media_id  .'"}',
 | 
						|
			"charset" 		=> $this -> charset
 | 
						|
		);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		//要提交的数据
 | 
						|
		$data_sign = $this -> buildGetUrl( $datas );
 | 
						|
 | 
						|
		$post_data = $data_sign;
 | 
						|
		//初始化 curl
 | 
						|
		$ch = curl_init();
 | 
						|
		//设置目标服务器
 | 
						|
		curl_setopt($ch, CURLOPT_URL, $this -> serverUrl );
 | 
						|
		curl_setopt($ch, CURLOPT_HEADER, TRUE);
 | 
						|
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 | 
						|
		//超时时间
 | 
						|
		curl_setopt($ch, CURLOPT_TIMEOUT, $this-> timeout);
 | 
						|
 | 
						|
		if( $this-> METHOD_POST == 'POST'){
 | 
						|
			// post数据
 | 
						|
			curl_setopt($ch, CURLOPT_POST, 1);
 | 
						|
			// post的变量
 | 
						|
			curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		$output = curl_exec($ch);
 | 
						|
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
 | 
						|
		curl_close($ch);
 | 
						|
 | 
						|
		echo $output;
 | 
						|
 | 
						|
		//分离头部
 | 
						|
		//list($header, $body) = explode("\r\n\r\n", $output, 2);
 | 
						|
		$datas = explode("\r\n\r\n", $output, 2);
 | 
						|
		$header = $datas[0];
 | 
						|
 | 
						|
		if( $httpCode == '200'){
 | 
						|
			$body = $datas[1];
 | 
						|
		}else{
 | 
						|
			$body = '';
 | 
						|
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		return $this -> execute( $header, $body, $httpCode );
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 *
 | 
						|
	 * @param $request
 | 
						|
	 * @return text | bin
 | 
						|
	 */
 | 
						|
	public function execute( $header = '', $body = '', $httpCode = '' ){
 | 
						|
		$exe = new AlipayMobilePublicMultiMediaExecute( $header, $body, $httpCode );
 | 
						|
		return $exe;
 | 
						|
	}
 | 
						|
 | 
						|
	public function buildGetUrl( $query = array() ){
 | 
						|
 | 
						|
		if( ! is_array( $query ) ){
 | 
						|
			//exit;
 | 
						|
		}
 | 
						|
 | 
						|
		//排序参数,
 | 
						|
		$data = $this -> buildQuery( $query );
 | 
						|
 | 
						|
 | 
						|
 | 
						|
		// 私钥密码
 | 
						|
		$passphrase = '';
 | 
						|
		$key_width = 64;
 | 
						|
 | 
						|
		//私钥
 | 
						|
		$privateKey = $this -> privateKey;
 | 
						|
		$p_key = array();
 | 
						|
		//如果私钥是 1行
 | 
						|
		if( ! stripos( $privateKey, "\n" )  ){
 | 
						|
			$i = 0;
 | 
						|
			while( $key_str = substr( $privateKey , $i * $key_width , $key_width) ){
 | 
						|
				$p_key[] = $key_str;
 | 
						|
				$i ++ ;
 | 
						|
			}
 | 
						|
		}else{
 | 
						|
			//echo '一行?';
 | 
						|
		}
 | 
						|
		$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . implode("\n", $p_key) ;
 | 
						|
		$privateKey = $privateKey ."\n-----END RSA PRIVATE KEY-----";
 | 
						|
 | 
						|
//		echo "\n\n私钥:\n";
 | 
						|
//		echo( $privateKey );
 | 
						|
//		echo "\n\n\n";
 | 
						|
 | 
						|
		//私钥
 | 
						|
		$private_id = openssl_pkey_get_private( $privateKey , $passphrase);
 | 
						|
 | 
						|
 | 
						|
		// 签名
 | 
						|
		$signature = '';
 | 
						|
 | 
						|
		if("RSA2"==$this->sign_type){
 | 
						|
 | 
						|
			openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA256 );
 | 
						|
		}else{
 | 
						|
 | 
						|
			openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA1 );
 | 
						|
		}
 | 
						|
 | 
						|
		openssl_free_key( $private_id );
 | 
						|
 | 
						|
		//加密后的内容通常含有特殊字符,需要编码转换下
 | 
						|
		$signature = base64_encode($signature);
 | 
						|
 | 
						|
		$signature = urlencode( $signature );
 | 
						|
 | 
						|
		//$signature = 'XjUN6YM1Mc9HXebKMv7GTLy7gmyhktyOgKk2/Jf+cz4DtP6udkzTdpkjW2j/Z4ZSD7xD6CNYI1Spz4yS93HPT0a5X9LgFWYY8SaADqe+ArXg+FBSiTwUz49SE//Xd9+LEiIRsSFkbpkuiGoO6mqJmB7vXjlD5lx6qCM3nb41wb8=';
 | 
						|
 | 
						|
		$out = $data .'&'. $this -> SIGN .'='. $signature;
 | 
						|
 | 
						|
//		echo "\n\n 加密后:\n";
 | 
						|
//		echo( $out );
 | 
						|
//		echo "\n\n\n";
 | 
						|
 | 
						|
		return $out ;
 | 
						|
	}
 | 
						|
 | 
						|
	/*
 | 
						|
	 * 查询参数排序 a-z
 | 
						|
	 * */
 | 
						|
	public function buildQuery( $query ){
 | 
						|
		if ( !$query ) {
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
//将要 参数 排序
 | 
						|
		ksort( $query );
 | 
						|
 | 
						|
		//重新组装参数
 | 
						|
		$params = array();
 | 
						|
		foreach($query as $key => $value){
 | 
						|
			$params[] = $key .'='. $value ;
 | 
						|
		}
 | 
						|
		$data = implode('&', $params);
 | 
						|
 | 
						|
		return $data;
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
}
 |