2016-06-02 6 views
2

J'essaie de faire fonctionner le push à partir d'un script ColdFusion en utilisant l'API Azure REST. Il y a un script PHP fonctionnant situé here et j'ai essayé de convertir le PHP en ColdFusion. Voici le code que j'ai jusqu'à présent, et tout semble me convenir, je ne reçois aucune erreur. Cependant, le résultat dans cfhttp.FileContent est juste une chaîne vide et je ne reçois aucune notification. quelqu'un peut-il signaler mon erreur?Convertir cette liste en 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> 

MISE À JOUR

J'ai testé en utilisant la signature que le script PHP génère et il a travaillé à partir ColdFusion. C'est donc quelque chose avec la façon dont je génère la variable SIGNATURE qui ne correspond pas à la façon dont PHP la génère.

Voici ce que fait 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

Lors du débogage, il est recommandé de supprimer cftry/cfcatch. –

+0

@AlexBaban, je ferai cependant un dans le bloc catch. donc je devrais toujours voir des messages d'erreur – Phil

+0

Que diriez-vous $ expire, avez-vous une correspondance entre PHP et ColdFusion? –

Répondre

3

figured it out. En PHP, le "\ n" pour une nouvelle ligne fonctionne bien, mais quand je le convertissais en ColdFusion, j'utilisais Chr (13) & Chr (10). J'ai sorti le Chr (13) et seulement utilisé Chr (10) et ça marche très bien maintenant.

Mise à jour

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

à

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

@Leigh - pour l'enregistrement, j'aime vraiment mes signes de livre. ;) – Phil

+0

@ Phil, utilisez-les alors, c'est un frère de la campagne libre. –

+0

@AlexBaban - Leigh les a emmenés quand elle a édité mon post :( – Phil