Неверная подпись в фейсбуке stream_publish call - PullRequest
0 голосов
/ 29 июня 2011

У меня ошибка на фейсбуке при вызове stream_publish.Я фактически использовал расширение для Magento для Fconnect.Fconnect & Flogin работает нормально.Но это требование, чтобы когда пользователь размещал заказ, он был размещен на стене пользователя.Для этого я реализовал вот так

document.observe('click', function(e){

    if (e.element().match('a[rel^=facebook-connect]') || e.element().match('button[rel^=facebook-connect]')) {

        e.stop();

        FB.login(function(response){



            if(response.status=='connected') setLocation('http://staging.mystore.com/facebook/customer_account/connect/');



        }, {perms:"email,publish_stream"});

    }

});

в файле клиента Facebook. Метод generateSignature подобен этому

private function _generateSig($params_array)
{
    Mage::log($params_array);
    $str = '';
    ksort($params_array);
    foreach ($params_array as $k=>$v) {
        $str .= "$k=$v";
    }

    $str .= $this->_secret;
    Mage::log($str);
    Mage::log('md5 sigs:: ' . md5($str));

    return md5($str);
}

& Мой код, вызывающий API, выглядит так:

    $message = 'just placed an order on mystore.com';

     $attachment = array(
     'name' => "mystore",
     'href' => 'http://www.mystore.com/',
     'description' => 'New order on mystore.com',
     'media' => array(array('type' => 'image',
     'src' => 'http://www.mystore.com/skin/frontend/default/mystore/images/logo.png',
     'href' => 'http://www.mystore.com/')));

     $action_links = array( array('text' => 'Buy@mystore', 'href' => 'http://www.mystore.com/'));

     $attachment = json_encode($attachment);
     $action_links = json_encode($action_links);

     try{
         // if( $facebook->api_client->stream_publish($message, $attachment, $action_links, null, $target_id))
         if($this->_getClient()->call( 'facebook.stream.publish', 
                                array($message, $attachment, $action_links, 
                                        $this->_getClient()->users->getLoggedInUser(), 
                                        Mage::getSingleton('facebook/config')->getApiKey() )
                                 )  ) 
         {
            Mage::log( "Added on FB Wall" );
         }

        } catch(Exception $e) 
        {
            Mage::log( "Exception in wall write" );

            Mage::log($e);
        }

После регистрации подпись, которую я нашел в журнале:

api_key=XXXXXXXXmethod=facebook.stream.publishsession_key=2.AQCm5fABfobInAS5.3600.1309352400.1-1000025660978090=just placed an order on mystore.comcall_id=1309345883.3068format=JSONv=1.01={"name":"mystore","href":"http:\/\/www.mystore.com\/","description":"New order on mystore.com","media":[{"type":"image","src":"http:\/\/www.mystore.com\/skin\/frontend\/default\/mystore\/images\/logo.png","href":"http:\/\/www.mystore.com\/"}]}2=[{"text":"Buy@mystore","href":"http:\/\/www.mystore.com\/"}]3=1000025660978094=5070afefb42b162aff748f55ecf44d110d9e2a90117ee1704e2adb41f1d190fa

Я никогда не занимался разработкой на Facebook, так что я понятия не имею, что делать?Пожалуйста, помогите мне с решением.И дайте мне знать, если вам, ребята, нужна какая-то другая информация, чтобы понять это.

Ах да, еще одна вещь, код файла клиента, который вызывает Api (метод вызова), выглядит так:

private function _prepareParams($method, $params)
{

    $defaultParams = array(
        'api_key' => $this->_apiKey,
        'call_id' => microtime(true),
        'format'  => 'JSON',
        'v'       => '1.0'
    );

    if($this->_sessionKey){
        $defaultParams['session_key'] = $this->_sessionKey;
    }

    $params = array_merge($defaultParams, $params);
    foreach ($params as $key => &$val) {
        if (!is_array($val)) continue;
        $val = Zend_Json::encode($val);
    }

    $params['method'] = $method;

    if(isset($params['sig'])) {
        unset($params['sig']);
    }
    $params['sig'] = $this->_generateSig($params);

    return $params;
}


public function call($method, $args=array())
{
    Mage::log($args);
    $params = $this->_prepareParams($method, $args);

    $client = self::_getHttpClient()
            ->setUri(self::FACEBOOK_REST_URI)
            ->setMethod(Zend_Http_Client::POST)
            ->resetParameters()
            ->setParameterPost($params);    

    try {
        $response = $client->request();
    } catch(Exception $e) {
        throw new Mage_Core_Exception('Service unavaliable');
    }

    if(!$response->isSuccessful()) {
        throw new Mage_Core_Exception('Service unavaliable');
    }

    $result = Zend_Json::decode($response->getBody());

    //json decode returns float on long uid number? is_json check? old php?
    if(is_float($result)){
        $result = $response->getBody();
    }

    if(is_array($result) && isset($result['error_code'])) {
        throw new Mage_Core_Exception($result['error_msg'], $result['error_code']);
    }

    return $result;
}

Для вызова API я использовал два способа $this->_getClient()->call( 'facebook.stream.publish', & $this->_getClient()->call( 'stream_publish', Ни один из них не работает

1 Ответ

0 голосов
/ 30 июня 2011

ок, ребята, я обнаружил ошибку

посмотрите на мой код

format=JSONv=1.01={"name":"mystore","href":"http:\/\/www.mystore.com\/","description":"New order on mystore.com","media":[{"type":"image","src":"http:\/\/www.mystore.com\/skin\/frontend\/default\/mystore\/images\/logo.png","href":"http:\/\/www.mystore.com\/"}]}2=[{"text":"Buy@mystore","href":"http:\/\/www.mystore.com\/"}]3=1000025660978094=5070afefb42b162aff748f55ecf44d110d9e2a90117ee1704e2adb41f1d190fa

где вы можете увидеть format = JSONv = 1.01 = {....} 2 =[{.....}] проблема была в том, что я использовал числовые массивы для параметров.они должны быть связаны массивами, такими как message = {новый порядок} attachment = {....} Как только я исправил проблему с ассоциативным массивом, мой код начал работать правильно, вот ссылка, которая даст вам подробную информацию о параметрахперейти на stream.publish http://schoolout.net/en/developers/view/39

Надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...