SMS Pro - API SMS en java avec encodage / accent
... / API SMS en java avec enco...
BMPCreated with Sketch.BMPZIPCreated with Sketch.ZIPXLSCreated with Sketch.XLSTXTCreated with Sketch.TXTPPTCreated with Sketch.PPTPNGCreated with Sketch.PNGPDFCreated with Sketch.PDFJPGCreated with Sketch.JPGGIFCreated with Sketch.GIFDOCCreated with Sketch.DOC Error Created with Sketch.
Frage

API SMS en java avec encodage / accent

Von
TanguyC
Erstellungsdatum 2019-04-07 08:47:07 (edited on 2024-09-04 12:51:10) in SMS Pro

Bonjour,

L'exemple de l'API SMS https://docs.ovh.com/fr/sms/envoyer_des_sms_avec_lapi_ovh_en_java/ en java pose plusieurs problèmes. Pour vous éviter, comme moi de perdre du temps, voici une version qui résout plusieurs problèmes :
* La fabrication du JSON qui ne prend pas en compte les caractères d'échappements
* Les accents ou caractères spéciaux dans le message qui ne passent pas ou bloquent la signature
* Les num de tel qui doivent être au format E164 (lib de google)

Exemple avec le message "C'était Noël en €"

image

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.Date;

import javax.json.Json;
import javax.json.JsonObjectBuilder;

import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;

public class SMSTest {
private static final String AK = "xxxxxxxxxxxxxxxxx";
private static final String AS = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private static final String CK = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private static final String SN = "sms-xxxxxxx-1";

public static void main(String[] args) throws Exception {
sendSMS("06xxxxxxxx", "C'était Noël en €");
}

private static boolean sendSMS(String num, String contenu) throws Exception {
// On redresse le n° de tel au format E164
try {
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
num = phoneUtil.format(phoneUtil.parse(num, "FR"), PhoneNumberFormat.E164);
} catch (Exception ex) {
//pas réussi à transformer en E164, on tente quand même
}

String method = "POST";
try {
URL url = new URL("https://eu.api.ovh.com/1.0/sms/" + SN + "/jobs/");

//Message en JSON
JsonObjectBuilder json = Json.createObjectBuilder();
json.add("receivers", Json.createArrayBuilder().add(num));
json.add("message", contenu);
json.add("priority", "high");
json.add("senderForResponse", "true");
json.add("charset", "UTF-8");
json.add("coding", "8bit");
String body = json.build().toString();

long timestamp = new Date().getTime() / 1000;

// Création de la signature
String toSign = AS + "+" + CK + "+" + method + "+" + url + "+" + body + "+" + timestamp;
String signature = "$1$" + HashSHA1(toSign);
System.out.println(signature);

HttpURLConnection req = (HttpURLConnection) url.openConnection();
req.setRequestMethod(method);
req.setRequestProperty("Content-Type", "application/json;UTF-8");
req.setRequestProperty("X-Ovh-Application", AK);
req.setRequestProperty("X-Ovh-Consumer", CK);
req.setRequestProperty("X-Ovh-Signature", signature);
req.setRequestProperty("X-Ovh-Timestamp", "" + timestamp);

if (!body.isEmpty()) {
req.setDoOutput(true);
req.getOutputStream().write(body.getBytes("UTF-8"));
}

String inputLine;
BufferedReader in;
int responseCode = req.getResponseCode();
if (responseCode == 200) {
// Récupération du résultat de l'appel
in = new BufferedReader(new InputStreamReader(req.getInputStream()));
} else {
in = new BufferedReader(new InputStreamReader(req.getErrorStream()));
}
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();

// Affichage du résultat
System.out.println(response.toString());
return true;

} catch (Exception e) {
e.printStackTrace();
}
return false;
}

public static String HashSHA1(String text) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] sha1hash = new byte[40];
byte[] data = text.getBytes("UTF-8");
md.update(data, 0, data.length);
sha1hash = md.digest();
return convertToHex(sha1hash);
}

private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString();
}
}


1 Antwort ( Latest reply on 2023-06-13 07:18:42 Von
bca6c09783991b26b10d
)


HashSHA1


Je confirme que le code du HashSHA1 m'a permis d'envoyer du texte avec des accents.
Avec le code du github ovh, j'avais des erreurs de signature.