JavaでのWeChat決済の詳しい解説(1):API V3版の署名
java ベースの教程 # Java 内の微信サポート、API V3 バージョン名を実現します。
1、 はじめに
最近、マイクロ信管が壊れていますが、これは比較的に慎重なため、いくつかの手順を共有して、マイクロ信管の開始時の転送を減らす必要があります。
#今日、マイクロシグナルサポートのポイント——
には、非常に多くの優れた SDK がありますが、 2. マイクロシンサポートについて深く理解する場合は、次の点も理解する必要があります。 API 証明書
は、お金に敏感なデータの安全性を保護するために、トラフィック内でのやり取りが万単位で行われることを保証します。
パスワードを実行します。後で
zip 圧縮パッケージにアクセスします。ここには、JAVA 公開に関する非常に多くのファイルがあります。来说只要关注apiclient_cert.p12
公私钥
,我们需要它放服务端并利用Java解析.p12
# これは、サーバー端末の安全性を確認する必要があり、金の安全性に関するものです。
。<h3 id="API-証明書の解析">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 マーチャント プラットフォームにログインするときの個人プロフィール内の数字の文字列。
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文字""
; 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());
}复制代码
署名が生成された後、いくつかのパラメーターと結合されて
Token が形成され、 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 つの部分で構成されます:
- リクエストを開始した販売者 (直接接続されている販売者、サービス プロバイダー、チャネル プロバイダーを含む) 販売者番号
- mchid
- 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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
