最近、マイクロ信管が壊れていますが、これは比較的に慎重なため、いくつかの手順を共有して、マイクロ信管の開始時の転送を減らす必要があります。
#今日、マイクロシグナルサポートのポイント——
ホットネームには、非常に多くの優れた SDK がありますが、 2. マイクロシンサポートについて深く理解する場合は、次の点も理解する必要があります。 API 証明書
後で
zip圧縮パッケージにアクセスします。ここには、JAVA 公開に関する非常に多くのファイルがあります。来说只要关注apiclient_cert.p12
この文件実行了,它包含公私钥
,我们需要它放服务端并利用Java解析.p12
# これは、サーバー端末の安全性を確認する必要があり、金の安全性に関するものです。
。<h3 data-id="heading-2">API 証明書の解析</h3>
<p>次のステップは、証明書を解析することです。インターネット上で証明書を解析する方法はたくさんあります。ここでは、より「正式な」解析方法を使用します。 JDK セキュリティ パッケージ<code>java.security.KeyStore
を解決します。
WeChat 支払い API 証明書は PKCS12
アルゴリズムを使用します。KeyStore
を使用して公開鍵と秘密鍵のペア KeyPair
のキャリアを取得します。証明書のシリアル番号serialNumber
、ツール クラスをカプセル化しました:
import org.springframework.core.io.ClassPathResource;import java.security.KeyPair;import java.security.KeyStore;import java.security.PrivateKey;import java.security.PublicKey;import java.security.cert.X509Certificate;/** * KeyPairFactory * * @author dax * @since 13:41 **/public class KeyPairFactory { private KeyStore store; private final Object lock = new Object(); /** * 获取公私钥. * * @param keyPath the key path * @param keyAlias the key alias * @param keyPass password * @return the key pair */ public KeyPair createPKCS12(String keyPath, String keyAlias, String keyPass) { ClassPathResource resource = new ClassPathResource(keyPath); char[] pem = keyPass.toCharArray(); try { synchronized (lock) { if (store == null) { synchronized (lock) { store = KeyStore.getInstance("PKCS12"); store.load(resource.getInputStream(), pem); } } } X509Certificate certificate = (X509Certificate) store.getCertificate(keyAlias); certificate.checkValidity(); // 证书的序列号 也有用 String serialNumber = certificate.getSerialNumber().toString(16).toUpperCase(); // 证书的 公钥 PublicKey publicKey = certificate.getPublicKey(); // 证书的私钥 PrivateKey storeKey = (PrivateKey) store.getKey(keyAlias, pem); return new KeyPair(publicKey, storeKey); } catch (Exception e) { throw new IllegalStateException("Cannot load keys from store: " + resource, e); } } }复制代码
これに見覚えがある場合は、公開キーと秘密キーの抽出メソッドの修正バージョンであることがわかります。 Fat Brother の Spring Security チュートリアルで JWT によって使用されており、違いを比較できます。
このメソッドには 3 つのパラメーターがあり、ここで説明する必要があります:
keyPath
API 証明書 apiclient_cert.p12
classpath
パス、通常は resources
パスの下に配置します。もちろん、証明書入力ストリームを取得する方法を変更することもできます。 keyAlias
証明書のエイリアスは、この WeChat ドキュメントでは使用できません。Brother Fat は、証明書をロードするときに DEBUG によってエイリアスを取得し、値が Tenpay Certificate# に固定されていることがわかりました。 ##。
証明書パスワード。このデフォルトは販売者番号です。他の構成でも使用する必要があります。
mchid です。つまり、
Super を使用します。管理者 WeChat マーチャント プラットフォームにログインするときの個人プロフィール内の数字の文字列。
WeChat Pay V3 バージョン の署名は、特定の WeChat を呼び出すときに HTTP リクエスト ヘッダーに特定の署名を含めることです。 Pay API: エンコード文字列は、WeChat 支払いサーバーによってリクエストのソースを検証し、リクエストが本物で信頼できるものであることを確認するために使用されます。
署名形式署名文字列の特定の形式。合計 5 行以上で、各行は改行文字\n で終わります。
HTTP请求方法\n URL\n 请求时间戳\n 请求随机串\n 请求报文主体\n复制代码
です。
です。ただし、ドメイン名部分 署名に参加している URL を取得します。リクエストにクエリ パラメータがある場合は、「?」と対応するクエリ文字列を URL の末尾に追加する必要があります。ここは
/v3/pay/transactions/app です。
を使用して取得します。
のような文字列を生成するツールを見つけてください。
; is
POST または
PUT の場合、実際に
の JSON メッセージを送信するには を使用してください。画像アップロード API の場合は、
meta に対応する
JSON メッセージを使用してください。
文字列に対して RSA 署名付き SHA256 を実行します、および ##署名結果 #Base64 エンコーディング署名値を取得します。対応するコア Java コードは次のとおりです: /**
* V3 SHA256withRSA 签名.
*
* @param method 请求方法 GET POST PUT DELETE 等
* @param canonicalUrl 例如 https://api.mch.weixin.qq.com/v3/pay/transactions/app?version=1 ——> /v3/pay/transactions/app?version=1
* @param timestamp 当前时间戳 因为要配置到TOKEN 中所以 签名中的要跟TOKEN 保持一致
* @param nonceStr 随机字符串 要和TOKEN中的保持一致
* @param body 请求体 GET 为 "" POST 为JSON
* @param keyPair 商户API 证书解析的密钥对 实际使用的是其中的私钥
* @return the string
*/@SneakyThrowsString sign(String method, String canonicalUrl, long timestamp, String nonceStr, String body, KeyPair keyPair) {
String signatureStr = Stream.of(method, canonicalUrl, String.valueOf(timestamp), nonceStr, body)
.collect(Collectors.joining("\n", "", "\n"));
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(keyPair.getPrivate());
sign.update(signatureStr.getBytes(StandardCharsets.UTF_8)); return Base64Utils.encodeToString(sign.sign());
}复制代码
が形成され、 HTTP リクエストに対応する Authorization
リクエスト ヘッダーの形式は次のとおりです: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Authorization: WECHATPAY2-SHA256-RSA2048 {Token}复制代码</pre><div class="contentsignin">ログイン後にコピー</div></div>
は次の 5 つの部分で構成されます:
、使用される証明書の宣言に使用
#署名値
/** * 生成Token. * * @param mchId 商户号 * @param nonceStr 随机字符串 * @param timestamp 时间戳 * @param serialNo 证书序列号 * @param signature 签名 * @return the string */String token(String mchId, String nonceStr, long timestamp, String serialNo, String signature) { final String TOKEN_PATTERN = "mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\""; // 生成token return String.format(TOKEN_PATTERN, wechatPayProperties.getMchId(), nonceStr, timestamp, serialNo, signature); }复制代码
Will generated Token
は、上記の形式に従ってリクエスト ヘッダーに配置され、署名の使用が完了します。
5. 概要この記事では、WeChat Pay V3 バージョンの難しい署名と署名の使用法を徹底的に分析し、API 証明書の分析についても説明しました。決済開発における特定の問題を解決します。
Java 基本チュートリアル
関連記事の紹介: ミニ プログラム支払い機能の実装方法
以上がJavaでのWeChat決済の詳しい解説(1):API V3版の署名の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。