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());
}复制代码
4. 署名を使用します
署名が生成された後、いくつかのパラメーターと結合されて
Token が形成され、 HTTP リクエストに対応する Authorization
リクエスト ヘッダーの形式は次のとおりです: <pre class="brush:php;toolbar:false">Authorization: WECHATPAY2-SHA256-RSA2048 {Token}复制代码</pre>
は次の 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 サイトの他の関連記事を参照してください。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

Dreamweaver Mac版
ビジュアル Web 開発ツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

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