मैं PHP एसडीके का उपयोग कर क्विकबुक एपीआई तक पहुंचने की कोशिश कर रहा हूं लेकिन निम्न त्रुटि प्राप्त कर रहा हूं:

ताज़ा करें OAuth 2 रीफ़्रेश टोकन के साथ एक्सेस टोकन विफल रहा। मुख्य भाग: [{"त्रुटि":"invalid_grant"}].

मेरे टोकन 24 घंटे काम करते प्रतीत होते हैं लेकिन उसके बाद मुझे उपरोक्त त्रुटि प्राप्त होती है। हर बार जब मैं एपीआई को कॉल करता हूं, तो मैं अपने अपडेट किए गए टोकन को अपने डेटाबेस में सहेज रहा हूं:

//Client ID & Secret
$qbClientId = $this->scopeConfig->getValue('quickbooks/api/qb_client_id', $storeScope);
$qbClientSecret = $this->scopeConfig->getValue('quickbooks/api/qb_client_secret', $storeScope);

//Retrieve currently saved Refresh_Token from DB
$qbRefreshToken = $this->scopeConfig->getValue('quickbooks/api/qb_refresh_token', $storeScope);

$OAuth2LoginHelper = new OAuth2LoginHelper($qbClientId, $qbClientSecret);
$accessTokenObj = $OAuth2LoginHelper->refreshAccessTokenWithRefreshToken($qbRefreshToken);

$error = $OAuth2LoginHelper->getLastError();

if($error) {
  throw new \Exception($error);
} else {
  // The refresh token and access token expiration
  $refreshTokenValue = $accessTokenObj->getRefreshToken();
  $refreshTokenExpiry = $accessTokenObj->getRefreshTokenExpiresAt();

  // Save new Refresh Token & Expiry to DB
  $this->configInterface->saveConfig('quickbooks/api/qb_refresh_token', $this->encryptor->encrypt($refreshTokenValue), 'default', 0);
  $this->configInterface->saveConfig('quickbooks/api/qb_refresh_token_expiry', $refreshTokenExpiry, 'default', 0);

  // The access token and access token expiration
  $accessTokenValue = $accessTokenObj->getAccessToken();
  $accessTokenExpiry = $accessTokenObj->getAccessTokenExpiresAt();

  // Save new Access Token & Expiry to DB
  $this->configInterface->saveConfig('quickbooks/api/qb_access_token', $this->encryptor->encrypt($accessTokenValue), 'default', 0);
  $this->configInterface->saveConfig('quickbooks/api/qb_access_token_expiry', $accessTokenExpiry, 'default', 0);

  return DataService::Configure(array(
    'auth_mode' => 'oauth2',
    'ClientID' => $qbClientId,
    'ClientSecret' => $qbClientSecret,
    'accessTokenKey' => $accessTokenValue,
    'refreshTokenKey' => $refreshTokenValue,
    'QBORealmID' => 'MyRealmID',
    'baseUrl' => 'Development'
  ));
}

इसलिए जैसा कि आप देख सकते हैं, प्रत्येक एपीआई कॉल पर, मैं नए रीफ्रेश और एक्सेस टोकन प्राप्त करने के लिए refreshAccessTokenWithRefreshToken($qbRefreshToken) विधि का उपयोग कर रहा हूं और अगले उपयोग के लिए उन्हें अपने डीबी में सहेज रहा हूं, हालांकि मुझे अभी भी 24 घंटे के बाद भी अमान्य_ग्रांट त्रुटियां प्राप्त होती हैं।

कोई विचार?

2
AJK 2 जिंदा 2020, 21:42

2 जवाब

https://developer.intuit.com/app/developer/qbo/docs/develop/authentication-and-authorization/faq

मेरा रीफ़्रेश टोकन 24 घंटों के बाद समाप्त क्यों हो जाता है?

पुराने रीफ़्रेश टोकन 24 घंटों के बाद समाप्त हो जाते हैं। हर बार जब आप एक्सेस_टोकन को रीफ्रेश करते हैं तो 100 दिनों के जीवनकाल के साथ एक नया रीफ्रेश_टोकन वापस कर दिया जाता है। पिछला रीफ्रेश_टोकन अब पुराना है और 24 घंटों के बाद समाप्त हो जाता है। एक्सेस_टोकन को रीफ्रेश करते समय, हमेशा आपको लौटाए गए नवीनतम रीफ्रेश_टोकन का उपयोग करें।

क्या आप सुनिश्चित हैं कि नवीनतम रीफ्रेश टोकन का उपयोग किया गया है?

1
Community 20 जून 2020, 12:12
हाँ हर बार जब मेरा कोड चलता है, तो मैं इस फ़ंक्शन को अपने टोकन रीफ्रेश करने और हर बार अपने डीबी में नए सहेजने के लिए कॉल कर रहा हूं
 – 
AJK
5 जिंदा 2020, 04:27
हो सकता है कि कोई और उस सहेजे गए ताज़ा टोकन का भी उपयोग करता हो, इसलिए आपका सहेजा गया टोकन पुराना हो गया।
 – 
Jan Garaj
5 जिंदा 2020, 09:42
धन्यवाद, लेकिन सिद्धांत रूप में उपरोक्त कोड को टोकन को मैन्युअल रूप से रीफ्रेश करने की आवश्यकता के बिना लगातार काम करना चाहिए? यह मानते हुए कि ऐप का उपयोग 100 दिनों के भीतर किया जाता है, इसलिए रिफ्रेशटोकन वैध रहता है
 – 
AJK
5 जिंदा 2020, 18:59
सिद्धांत रूप में, यह आपकी समस्या की स्पष्ट व्याख्या है। मेरे पास आपका कोड, बुनियादी ढांचा नहीं है इसलिए मैं यह नहीं जानता कि सहेजे गए टोकन के साथ कौन/क्या कर रहा है
 – 
Jan Garaj
11 जिंदा 2020, 11:10

तो जैसा कि आप देख सकते हैं, प्रत्येक एपीआई कॉल पर, मैं नए रिफ्रेश और एक्सेस टोकन प्राप्त करने और अगले उपयोग के लिए उन्हें अपने डीबी में सहेजने के लिए रीफ्रेश एक्सेसटोकनविथ रीफ्रेश टोकन ($ qbRefreshToken) विधि का उपयोग कर रहा हूं ...

आप हर बार अनुरोध करने पर नए एक्सेस टोकन और रीफ्रेश टोकन का अनुरोध क्यों कर रहे हैं? जांच क्यों नहीं कर रहे हैं कि पुराना एक्सेस टोकन अभी भी वैध है या नहीं?

जैसा कि आपने ऊपर कहा है, आप एक्सेस टोकन की समाप्ति समय भी संग्रहीत कर रहे हैं। तो आपको पता होना चाहिए कि यह अभी भी मान्य है या नहीं।

तो जब आप एपीआई अनुरोध कर रहे हैं और आप टोकन का उपयोग समाप्त कर चुके हैं, तो आपको एक त्रुटि संदेश मिलेगा। बदले में, अब आप एक नया अनुरोध कर सकते हैं।

0
davidev 11 जिंदा 2020, 14:16