ホームページ  >  記事  >  Java  >  JavaでのWeChat決済の詳しい解説(1):API V3版の署名

JavaでのWeChat決済の詳しい解説(1):API V3版の署名

coldplay.xixi
coldplay.xixi転載
2020-10-27 17:20:212408ブラウズ

java ベースの教程 # Java 内の微信サポート、API V3 バージョン名を実現します。

JavaでのWeChat決済の詳しい解説(1):API V3版の署名

1、 はじめに

最近、マイクロ信管が壊れていますが、これは比較的に慎重なため、いくつかの手順を共有して、マイクロ信管の開始時の転送を減らす必要があります。

JavaでのWeChat決済の詳しい解説(1):API V3版の署名#今日、マイクロシグナルサポートのポイント——

ホットネーム

には、非常に多くの優れた SDK がありますが、 2. マイクロシンサポートについて深く理解する場合は、次の点も理解する必要があります。 API 証明書

は、お金に敏感なデータの安全性を保護するために、トラフィック内でのやり取りが万単位で行われることを保証します。

パスワードを実行します。

後で

zip

圧縮パッケージにアクセスします。ここには、JAVA 公開に関する非常に多くのファイルがあります。来说只要关注JavaでのWeChat決済の詳しい解説(1):API V3版の署名apiclient_cert.p12

この文件実行了,它包含

公私钥

,我们需要它放服务端并利用Java解析

.p12JavaでのWeChat決済の詳しい解説(1):API V3版の署名说明

# これは、サーバー端末の安全性を確認する必要があり、金の安全性に関するものです。<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# に固定されていることがわかりました。 ##。
  • keyPass 証明書パスワード。このデフォルトは販売者番号です。他の構成でも使用する必要があります。mchid です。つまり、Super を使用します。管理者 WeChat マーチャント プラットフォームにログインするときの個人プロフィール内の数字の文字列。
3. V3 署名

WeChat Pay V3 バージョン の署名は、特定の WeChat を呼び出すときに HTTP リクエスト ヘッダーに特定の署名を含めることです。 Pay API: エンコード文字列は、WeChat 支払いサーバーによってリクエストのソースを検証し、リクエストが本物で信頼できるものであることを確認するために使用されます。

署名形式

署名文字列の特定の形式。合計 5 行以上で、各行は改行文字

\n で終わります。

HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n复制代码

  • HTTP リクエスト メソッド 呼び出す WeChat 支払い API (たとえば、APP 支払い) で必要なリクエスト メソッドは POST です。
  • URL たとえば、APP 支払いドキュメントは https://api.mch.weixin.qq.com/v3/pay/transactions/app です。ただし、ドメイン名部分 署名に参加している URL を取得します。リクエストにクエリ パラメータがある場合は、「?」と対応するクエリ文字列を URL の末尾に追加する必要があります。ここは /v3/pay/transactions/app です。
  • リクエスト タイムスタンプ サーバー システムのタイムスタンプ。サーバー時間が正しいことを確認し、System.currentTimeMillis() / 1000 を使用して取得します。
  • ランダムな文字列をリクエストする 593BEC0C930BF1AFEB40B4A08C8FB242 のような文字列を生成するツールを見つけてください。
  • リクエストメッセージ本文 GETの場合、リクエストメソッドが直接null文字""; isPOST または 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());
}复制代码
4. 署名を使用します

署名が生成された後、いくつかのパラメーターと結合されて

Token

が形成され、 HTTP リクエストに対応する Authorizationリクエスト ヘッダーの形式は次のとおりです: <pre class="brush:php;toolbar:false">Authorization: WECHATPAY2-SHA256-RSA2048 {Token}复制代码</pre>

Token

は次の 5 つの部分で構成されます:

    リクエストを開始した販売者 (直接接続されている販売者、サービス プロバイダー、チャネル プロバイダーを含む) 販売者番号
  • mchid

  • 販売者 API 証明書シリアル番号
  • serial_no

    、使用される証明書の宣言に使用

  • リクエストランダム文字列
  • nonce_str

    #タイムスタンプ
  • タイムスタンプ
  • #署名値

    署名
  • トークン
  • 生成されたコアコード:
/**
 * 生成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 サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。