Pourquoi la vérification unifiée des paiements iOS WeChat échoue-t-elle ? Je suis vraiment anxieux car ma signature a échoué et je ne peux toujours pas payer. Le principal problème est que le corps est en chinois, ce qui est très difficile à résoudre, j'ai beaucoup cherché sur Baidu, mais je ne trouve aucun article. cela le résout complètement. Bref, c'est toutes sortes de problèmes. Je n'entrerai pas dans les détails ici, allons droit au but :
Comme les projets de l'entreprise nécessitent un paiement via WeChat, lors du déploiement, j'ai constaté que des erreurs de signature étaient toujours signalées. Après enquête, il s'est avéré que c'était le cas. un problème de codage, nous le résoudrons donc si nous en trouvons la raison. Question, cet article présente trois solutions en détail. Si vous avez peu de temps et n'avez pas le temps de le lire, passez directement à la troisième solution, j'espère. cela peut aider tout le monde.
L'encodage par défaut de Tomcat dans l'environnement de fenêtre est gbk, définissez donc l'encodage Tomcat sur utf-8.
Étape 1 : Ajoutez
set JAVA_OPTS=-Xms128m -Xmx512m -XX:MaxPermSize=256m -Dfile.encoding=utf-8 -Dsun.jnu.encoding=utf-8
让java环境使用utf-8编码
à la deuxième ligne de l'en-tête dans catalina.bat Étape 2 : Ajoutez
URIEncoding à server.xml =" UTF-8" useBodyEncodingForURI="true", oblige la requête envoyée par Tomcat à utiliser utf-8, comme indiqué dans le code suivant
<Connector port="8081" protocol="HTTP/1.1"
redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI=" true" />
Il peut y avoir des caractères tronqués dans la console, mais ce sera bien si vous le changez en gbk, mais la signature WeChat échoue
String body = new String("body Chinese field value".toString().getBytes("ISO8859-1"),"UTF-8") ;
Cependant : le nom du produit renvoyé par WeChat sera tronqué
Le codage par défaut de Tomcat dans l'environnement de fenêtre est gbk, donc lors de l'exécution de la signature md5, définissez le codage sur utf-8.
Voici l'outil de signature MD5 que j'utilise :
public class MD5Util { private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.append(byteToHexString(b[i])); return resultSb.toString(); } private static String byteToHexString(byte b) { int n = b; if (n < 0) n += 256; int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; } public static String MD5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance("MD5"); if (charsetname == null || "".equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString .getBytes())); else resultString = byteArrayToHexString(md.digest(resultString .getBytes(charsetname))); } catch (Exception exception) { } return resultString; } private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; }
Recommandations associées :
Paiement de l'application WeChat : Paiement La vérification des autorisations a échoué, pourquoi ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!