WeChat の支払い検証または署名が失敗するのはなぜですか? 3 つの解決策を添付します

php是最好的语言
リリース: 2018-08-07 15:44:05
オリジナル
47670 人が閲覧しました

iOS WeChat 統一支払いの検証が失敗するのはなぜですか?署名に失敗し、まだ支払いができないのでとても不安です。主な問題は本文が中国語であることです。これを解決するのが非常に面倒です。Baidu で検索しましたが、記事が見つかりません。一言で言えば、あらゆるトラブルを解決します。ここでは詳細には触れませんが、本題に入りましょう:

会社のプロジェクトでは WeChat での支払いが必要なため、デプロイ中に署名エラーが常に報告されることがわかりました。調査の結果、それはエンコーディングの問題であることが判明しました。理由が見つかったら、この記事で 3 つの解決策を詳しく紹介します。時間が限られており、すべてを読む時間がない場合は、3 番目の解決策に直接進んでください。みんな。

最初の解決策: Tomcat エンコーディングを utf-8 に設定します

ウィンドウ環境における Tomcat のデフォルトのエンコーディングは gbk であるため、Tomcat エンコーディングを utf-8 に設定する必要があります。

最初のステップ: catalina.bat のヘッダーの 2 行目に

set JAVA_OPTS=-Xms128m -Xmx512m -XX:MaxPermSize=256m -Dfile.encoding=utf-8 -Dsun.jnu.encoding=utf-8
ログイン後にコピー
让java环境使用utf-8编码
ログイン後にコピー

を追加します。 2 番目のステップ:

URIEncoding="UTF-8" useBodyEncodingForURI="true" をserver.xml に追加してリクエストを送信します。 by tomcat 次のコードに示すように、utf-8 を使用します

  1. <Connector port="8081" protocol="HTTP/1.1"

  2. connectionTimeout="20000"

  3. redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true" />

    コンソールで文字化けが発生する場合がありますが、 gbk に変更しても問題ありませんが、WeChat 署名は失敗しました

2 番目の解決策: body をトランスコードします

String body = new String("body Chinese field value".toString().getBytes("ISO8859- 1")," UTF-8");

ただし: WeChat から返される製品名は文字化けします

WeChat の支払い検証または署名が失敗するのはなぜですか? 3 つの解決策を添付します


3 番目の解決策: 署名 MD5 エンコーディングを変更します (この解決策は王です)

Windows 環境の tomcat デフォルトのエンコーディングは gbk なので、md5 署名を実行する場合はエンコーディングを utf-8 に設定するだけです。

WeChat の支払い検証または署名が失敗するのはなぜですか? 3 つの解決策を添付します

これは私が使用する MD5 署名ツール クラスです:

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" };

}
ログイン後にコピー

関連する推奨事項:

WeChat アプリの支払い: 支払い許可のチェックに失敗しました。その理由は何ですか?

WeChat アプリ支払い: 支払い許可チェックに失敗しました。理由は何ですか

以上がWeChat の支払い検証または署名が失敗するのはなぜですか? 3 つの解決策を添付しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート