ФорумПрограммированиеPHP для идиотов → vkontakte signature

vkontakte signature

  • Mars

    Сообщения: 304 Репутация: N Группа: Кто попало

    Spritz 22 декабря 2010 г. 20:08

    Забыл я каким макаром сделать сигнатур?

    Короче посылаю такой запрос

    photo_id=3691205_194302575&api_id=1979194&wall_id=29355104&method=wall.savePost&format=JSON&message=%D0%AF+%D0%BE%D1%82%D0%BC%D0%B0%D1%82%D0%B0%D0%BB+%D1%85%D0%BE%D0%B4%D0%BA%D1%83+%D0%B2+%D1%82%D1%8E%D1%80%D1%8C%D0%BC%D0%B5+%D0%9C%D0%B0%D1%82%D1%80%D0%BE%D1%81%D1%81%D0%BA%D0%B0%D1%8F+%D0%A2%D0%B8%D1%88%D0%B8%D0%BD%D0%B0.&v=2.0&sig=221c0b11c95dd172ea8a1f3b63eeb2b4

    выдаёт

    {"error":{"error_code":4,"error_msg":"Incorrect signature","request_params":[{"key":"photo_id","value":"3691205_194302575"},{"key":"api_id","value":"1979194"},{"key":"wall_id","value":"29355104"},{"key":"method","value":"wall.savePost"},{"key":"format","value":"JSON"},{"key":"message","value":"Я отматал ходку в тюрьме Матросская Тишина."},{"key":"v","value":"2.0"},{"key":"sig","value":"221c0b11c95dd172ea8a1f3b63eeb2b4"}]}}

    Подскажите как сделать верный сигнатур?
  • Frozzeg

    Сообщения: 5641 Репутация: N Группа: Джедаи

    Spritz 22 декабря 2010 г. 20:14, спустя 6 минут 21 секунду

    документация жи есть
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 22 декабря 2010 г. 20:23, спустя 9 минут 12 секунд

    <?php
    
    class VkApi
    {
    	protected $appSecret;
    	protected $appId;
    	protected $apiUrl;
    
    	public function  __construct($appId, $appSecret, $url = 'api.vk.com/api.php')
    	{
    		$this->appId = $appId;
    		$this->appSecret = $appSecret;
    		if (!strstr($url, 'http://')) {
    			$url = 'http://'.$url;
    		}
    		$this->apiUrl = $url;
    	}
    
    	public function api($method, array $params = array())
    	{
    		$params['api_id'] = $this->appId;
    		$params['v'] = '3.0';
    		$params['method'] = $method;
    		$params['timestamp'] = time();
    		$params['format'] = 'json';
    		$params['random'] = rand(0,10000);
    		ksort($params);
    
    		$sig = '';
    		foreach($params as $k=>$v) {
    			$sig .= $k.'='.$v;
    		}
    		$sig .= $this->appSecret;
    		$params['sig'] = md5($sig);
    
    		$query = $this->apiUrl . '?' . $this->paramsToString($params);
    		$res = file_get_contents($query);
    
    		return json_decode($res, true);
    	}
    
    	protected function paramsToString($params)
    	{
    		//TODO: http_build_str?
    		$pice = array();
    		foreach($params as $k => $v) {
    			$pice[] = $k . '=' . urlencode($v);
    		}
    
    		return implode('&', $pice);
    	}
    
    	public function isAuth()
    	{
    		if (!isset($_COOKIE["vk_app_{$this->appId}"]))
    			return false;
    
    		$vkCookie = $_COOKIE["vk_app_{$this->appId}"];
    
    		if (!empty($vkCookie)) {
    			$data = array();
    
    			foreach (explode('&', $vkCookie) as $item) {
    				list($key, $value) = explode('=', $item);
    				$data[$key] = $value;
    			}
    
    			// Проверяем sig
    			$string = sprintf("expire=%smid=%ssecret=%ssid=%s%s", $data['expire'], $data['mid'], $data['secret'], $data['sid'], $this->appSecret);
    
    			if (md5($string) == $data['sig']) {
    				// sig не подделан - возвращаем ID пользователя ВКонтакте.
    				return $data['mid'];
    			}
    		}
    
    		return false;
    	}
    
    }
    

Пожалуйста, авторизуйтесь, чтобы написать комментарий!