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 €"
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();
}
}
SMS Pro - API SMS en java avec encodage / accent
Related questions
- Envois SMS non délivrés - "No templates available"
27538
17.03.2020 09:55
- Saut de ligne dans un SMS envoyé avec API
19403
02.11.2017 07:31
- Click2Call.OVH : le plugin Click2Call et Click2SMS pour Mozilla Firefox est disponible!
17070
09.05.2017 18:24
- SMS : Durée de conservation SMS envoyés
16652
06.07.2017 12:01
- Format des fichiers CSV
16170
06.11.2016 21:00
- Portabilité numero de fax, ou/comment commander ?
15559
29.03.2019 13:31
- Nombre de caractère dans SMS
15052
01.08.2017 14:39
- Envoi de SMS via C# ne fonctionne plus
14993
14.11.2019 16:58
- API OVH - Modification des droits d'accès et de la durée de vie des identifiants
14783
21.11.2016 13:57
- Recevoir un SMS
13031
17.11.2016 23:23
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.