2016-06-02 6 views
2

Я пытаюсь заставить push работать из сценария ColdFusion, используя API Azure REST. Существует рабочий PHP-скрипт, расположенный here, и я попытался преобразовать PHP в ColdFusion. Ниже приведен код, который у меня есть до сих пор, и все кажется мне правильным, я не получаю никаких ошибок. Однако результат в cfhttp.FileContent - это просто пустая строка, и я не получаю уведомления. может ли кто-нибудь указать на мою ошибку?Преобразуйте этот cuRL в CFHTTP - Azure NotificationHub

<cfset CONNECTION_STRING = "Endpoint=sb://mypushnamespacehere.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=mysharedaccesskeyhere"> 
    <cfset API_VERSION = "?api-version=2015-01"> 
    <cfset connectionStringParts = ListToArray(CONNECTION_STRING,';','YES')> 
    <cfset ENDPOINT = "https" & #connectionStringParts[1].substring(11)#> 
    <cfset HUBPATH = "myhubpathname"> 
    <cfset sasKEYNAME = #connectionStringParts[2].substring(20)#> 
    <cfset sasKEYVALUE = #connectionStringParts[3].substring(16)#> 

    <cfset URI = #ENDPOINT# & #HUBPATH# & "/messages" & API_VERSION> 

    <cfset TARGET_URI = #Lcase(URLEncodedFormat(URI))#> 
    <cfset EXPIRES = int(createObject('java', 'java.lang.System').currentTimeMillis()/1000)> 
    <cfset EXPIRES_IN_MINS = 60> 
    <cfset EXPIRES = EXPIRES + EXPIRES_IN_MINS * 60> 

    <cfset TO_SIGN = #TARGET_URI# & Chr(13) & Chr(10) & #EXPIRES#> 
    <cfset SIGNATURE_HMAC = #HMAC(TO_SIGN, sasKEYVALUE, 'HmacSHA256')#> 
    <cfset SIGNATURE = #EncodeForURL(binaryEncode(binaryDecode(SIGNATURE_HMAC, 'hex'), 'base64'))#> 

    <cfset TOKEN = "SharedAccessSignature sr=" & #TARGET_URI# & "&sig=" & #SIGNATURE# & "&se=" & #EXPIRES# & "&skn=" & #sasKEYNAME#> 

    <cftry> 
     <!--- Create our requestBody ---> 
     <cfset requestBody = '{ 
           "data" : { 
            "message" : "Hello from ColdFusion" 
            } 
           }'> 
     <!--- Send Push ---> 
     <cfhttp method="post" url="#URI#">  
      <cfhttpparam type="header" name="Authorization" value="#TOKEN#"> 
      <cfhttpparam type="header" name="Content-Type" value="application/json">  
      <cfhttpparam type="header" name="ServiceBusNotification-Format" value="gcm"> 
      <cfhttpparam type="body" encoded="false" value="#trim(requestBody)#"> 
     </cfhttp> 
     <!--- Parse JSON Response to determine if call was successful ---> 
     <cfdump var=#cfHttp.FileContent#> 
    <!--- Catch any errors, return false ---> 
    <cfcatch type="any"> 
     <cfdump var=#cfcatch#> 
    </cfcatch> 
    </cftry> 

UPDATE

я тестировал с помощью ПОДПИСЬ, что PHP скрипт генерирует и он работал с ColdFusion. Так что это то, с чем я генерирую переменную SIGNATURE, которая не соответствует тому, как это генерирует PHP.

Вот что делает PHP ...

$targetUri = strtolower(rawurlencode(strtolower($uri))); 
$expires = time(); 
$expiresInMins = 60; 
$expires = $expires + $expiresInMins * 60; 
$toSign = $targetUri . "\n" . $expires; 

$signature = rawurlencode(base64_encode(hash_hmac('sha256', $toSign, $this->sasKeyValue, TRUE))); 

$token = "SharedAccessSignature sr=" . $targetUri . "&sig=" . $signature . "&se=" . $expires . "&skn=" . $this->sasKeyName; 
+0

При отладке рекомендуется удалить cftry/cfcatch. –

+0

@AlexBaban, но я делаю в блоке catch. поэтому я должен все еще видеть сообщения об ошибках – Phil

+0

Как насчет $ expires, есть ли у вас совпадение между PHP и ColdFusion? –

ответ

3

Фигурные его. В PHP «\ n» для новой строки отлично работает, но когда я преобразовывал его в ColdFusion, я использовал Chr (13) & Chr (10). Взял Chr (13) и использовал только Chr (10), и теперь он отлично работает.

Обновлено

<cfset TO_SIGN = TARGET_URI & Chr(13) & Chr(10) & EXPIRES> 

в

<cfset TO_SIGN = TARGET_URI & Chr(10) & EXPIRES> 
+0

@Leigh - для записи, я ДЕЙСТВИТЕЛЬНО люблю свои фунтовые знаки. ;) – Phil

+0

. @ Фил, используйте их тогда, это свободный брат страны. –

+0

@AlexBaban - Ли снял их, когда редактировал мой пост :( – Phil

 Смежные вопросы

  • Нет связанных вопросов^_^