我們正試圖從Salesforce實施Twitter新的DM API。如文檔中所述,我們正在發送我們的JSON請求,但Oauth授權的傳統方法不起作用。任何幫助是極大的讚賞。Twitter新的DM API,傳統的授權方法不起作用
要添加,我發送一個DM從銷售隊伍到Twitter,所以 1)我設置JSON的請求正文。 2)我正在做一個POST。 3)我在'https://api.twitter.com/1.1/direct_messages/events/new.json' 4)Oauth2,獲取訪問令牌(成功) 5)將頭部設置爲('Content-Type','application/json')。 6)使用使用者密鑰,Nonce,簽名,簽名方法,時間戳,版本,Twitter創建授權標頭。建立與developer.twitter.com/en/docs/basics/authentication/guides/ 的「指南」部分相同的內容7)運行錯誤代碼「{」errors「:[{」code「:32,」message 「:「無法驗證您的身份。」}]}」。
另一個重要的信息,我一直在使用Twitter舊API發送完美的DM,唯一的區別是它發送請求體的URL參數而不是JSOn正文,但授權方法保持不變。由於一些新功能只能通過Twitter New API實現,並且根據文檔需要通過JSON格式發送主體。因此請求部分被更改,但授權相同。
示例代碼: -
String accTok = 'redacted';
String conKey = 'redacted';
String conSec = 'redacted';
String accTokSec = 'redacted';
String theTweet = 'Hello world!';
String screenName ='some_test_username';
String jsonString = TwitterJsonReqGenerator.generateJSON(theTweet, screenName);
system.debug('JSON string ='+jsonString);
httpRequest newReq = new httpRequest();
newReq.setBody(jsonString);
newReq.setMethod('POST');
newReq.setEndpoint('https://api.twitter.com/1.1/direct_messages/events/new.json');
//Generate Nonce
string oAuth_nonce = EncodingUtil.base64Encode(blob.valueOf(string.valueOf(Crypto.getRandomInteger()+system.now().getTime())+string.valueOf(Crypto.getRandomInteger()))).replaceAll('[^a-z^A-Z^0-9]','');
map<String, String> heads = new map<String, String>{
'oauth_token'=>accTok,
'oauth_version'=>'1.0',
'oauth_nonce'=>oAuth_nonce,
'oauth_consumer_key'=>conKey,
'oauth_signature_method'=>'HMAC-SHA1',
'oauth_timestamp'=>string.valueOf(system.now().getTime()/1000)
};
//Alphabetize
string[] paramHeads = new string[]{};
paramHeads.addAll(heads.keySet());
paramHeads.sort();
string params = '';
for(String encodedKey : paramHeads){
params+=encodedKey+'%3D'+heads.get(encodedKey)+'%26';
}
//params+='status'+percentEncode('='+percentEncode(theTweet));
params+=percentEncode(theTweet);
//Build the base string
string sigBaseString = newReq.getMethod().toUpperCase()+'&'+EncodingUtil.urlEncode(newReq.getEndpoint(),'UTF-8')+'&'+params;
system.debug('signatureBaseString == '+sigBaseString);
//calculate signature
string sigKey = EncodingUtil.urlEncode(conSec,'UTF-8')+'&'+EncodingUtil.urlEncode(accTokSec,'UTF-8');
blob mac = crypto.generateMac('hmacSHA1', blob.valueOf(sigBaseString), blob.valueOf(sigKey));
string oauth_signature = EncodingUtil.base64Encode(mac);
heads.put(EncodingUtil.urlEncode('oauth_signature','UTF-8'), EncodingUtil.urlEncode(oauth_signature,'UTF-8'));
//build the authorization header
paramHeads.clear();
paramHeads.addAll(heads.keySet());
paramHeads.sort();
string oAuth_Body = 'OAuth ';
for(String key : paramHeads){
oAuth_Body += key+'="'+heads.get(key)+'", ';
}
oAuth_Body = oAuth_Body.subString(0, (oAuth_Body.length() - 2));
newReq.setHeader('Authorization', oAuth_Body);
system.debug('Authroization Header == '+oAuth_Body);
newReq.setHeader('Content-Type', 'application/json');
httpResponse httpRes = new http().send(newReq);
String response = httpRes.getBody();
system.debug(response);
感謝 Prateek
你能發佈您的代碼通過編輯這個問題? –
嗨迪瑪,謝謝你的回覆。 –
你應該考慮添加關於你的問題的信息,比如什麼不工作。另外,您應該考慮添加有關該項目的信息,例如您使用的是哪種技術。代碼示例也真的很感激在這種情況下 – Nicolas