2016-05-27 3 views
1

Je rencontre des problèmes en utilisant le API OpenPay.mx (paiements banques mexicaines & autres services de paiements). Cette API renvoie JSON. J'essaie d'accéder à l'API avec CFHTTP, mais il renvoie une erreur de requête HTTP 400 incorrecte.Coldfusion CFHTTP accès API Openpay.mx Caractère inattendu ('m' (code 109)): attendu une valeur valide

erreur complète:

https://sandbox-api.openpay.mx/v1/maidzkihk7utcvzhucwk/charges {"category":"request","description":"Unexpected character ('m' (code 109)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')","http_code":400,"error_code":1001,"request_id":"79a19194-61a2-49e5-8cbc-c83f5c93ce69"}

Dans la liste des erreurs de l'aide de l'API sur les erreurs 1001-400, voici l'explication:

The request format is JSON, the fields do not have the correct format, or the request does not have fields that are required.

Code ColdFusion:

<cfset request_id = "sk_722a9645ea0040899ccd1f0a53dfcf53"> 
<cfset method="store"> 
<cfset amount=100> 
<cfset description="Cargo con tienda"> 
<cfset customer="Gabriel Villafuerte"> 

<cfhttp url="https://sandbox-api.openpay.mx/v1/maidzkihk7utcvzhucwk/charges" 
method="post" charset="utf-8" username="#request_id#" password="" 
throwonerror="no"> 
     <cfhttpparam type="header" name="Content-Type" value="application/json"/> 
     <cfhttpparam name="method" type="formfield" value="#method#"> 
     <cfhttpparam name="amount" type="FormField" value="#amount#"> 
     <cfhttpparam name="description" type="FormField" value="#description#"> 
     <cfhttpparam name="customer" type="FormField" value="#customer#"> 
</cfhttp> 

<CFDUMP var="#cfhttp#"> 

<!---display results---> 

<cfoutput> 
    HTTP Response = #cfhttp.statusCode# <br> 
     <textarea cols=80 rows=10> 
      https://sandbox-api.openpay.mx/v1/maidzkihk7utcvzhucwk/charges 
      #cfhttp.fileContent# 
     </textarea> 
</cfoutput> 

Voici les règles pour l'accès API OpenPay.mx: OpenPay.mx Rules

Quelqu'un at-il une idée sur la façon dont je peux donner le format correct des champs?

Répondre

2

Je ne suis pas familier avec l'API, mais en regardant la documentation et les exemples, je soupçonne que le message d'erreur signifie exactement ce qu'il dit (emphase mienne). Les valeurs de demande doivent être soumises en tant que champs JSON distincts et ne pas contenir de champs distincts. Elles doivent évidemment contenir toutes les valeurs requises. Au lieu d'utiliser "formfield", placez les valeurs dans une structure. Convertissez-le en JSON en utilisant serializeJSON(). Puis passez le JSON à l'API en utilisant le type de paramètre "body".

Vous devrez passer en revue les exemples d'API, quelle que soit la méthode que vous invoquez, pour savoir quels paramètres sont requis. Cependant, le Charges via Store Example a travaillé avec quelques légères modifications:

  • Le "due_date" ne peut pas être une date antérieure
  • Le "order_id" doit être une valeur non déjà traitée. (Je viens d'augmenter le nombre d'échantillons par une quantité arbitraire jusqu'à ce que je frappe un identifiant valide.)

frais par magasin Exemple

<!--- sample request from API ---> 
<!--- note: increased "order_id" value by arbitrary amount ---> 
<cfset timeNow = now()>     
<cfset requestData = { 
    "method" : "store", 
    "amount" : 100, 
    "description" : "Cargo con tienda", 
    "order_id" : "oid-00100", 
    "due_date" : dateFormat(timeNow, "yyyy-mm-dd")&"T"&timeFormat(timeNow, "HH:nn:ss") 
}> 

<cfhttp url="https://sandbox-api.openpay.mx/v1/mzdtln0bmtms6o3kck8f/customers/ag4nktpdzebjiye1tlze/charges" 
    method="post" 
    charset="utf-8" 
    username="sk_e568c42a6c384b7ab02cd47d2e407cab:" 
    password="" 
    throwonerror="no"> 
     <cfhttpparam type="header" name="Content-Type" value="application/json"/> 
     <cfhttpparam type="body" value="#serializeJSON(requestData)#"> 
</cfhttp> 

<cfdump var="#cfhttp#"> 

Résultat:

OpenPay.mx Response

+0

Sensationnel !! Merci Leigh, vous savez beaucoup de Json, cela fonctionne correctement, j'ai fait les ajustements nécessaires et le code de réponse est "OK", merci encore. Cordialement –

+0

[Le format JSON est assez simple] (http://stackoverflow.com/questions/15840003/using-json-data-with-coldfusion/15841047#15841047). Les structures sont notées '{}' et contiennent une ou plusieurs valeurs au format '{" keyName ":" SomeValue "}'. J'ai simplement copié la chaîne de requête cURL dans les charges via l'exemple de magasin et j'ai changé quelques valeurs :) – Leigh