Detaillierte Erl?uterung der WeChat-Zahlung in Java (1): API V3-Versionssignatur
Oct 27, 2020 pm 05:20 PMJava Basic Tutorial Die Kolumne stellt die WeChat-Zahlung in Java vor und implementiert die API V3-Versionssignatur.
1. Einführung
Ich hatte in letzter Zeit Probleme mit der WeChat-Zahlung und das Zertifikat ist immer noch ziemlich nervig, daher ist es notwendig, einige Erfahrungen zu teilen, um Ihre Fallstricke bei der Entwicklung der WeChat-Zahlung zu reduzieren. Derzeit wurde die WeChat-Zahlungs-API auf die V3-Version weiterentwickelt und übernimmt den beliebten Restful-Stil.
Heute werde ich die Schwierigkeiten der WeChat-Zahlung erl?utern – Signature Obwohl es viele nützliche SDKs gibt, müssen Sie sie dennoch verstehen, wenn Sie die WeChat-Zahlung im Detail verstehen m?chten.
2. API-Zertifikat
Um die Sicherheit sensibler Finanzdaten zu gew?hrleisten und sicherzustellen, dass die Finanztransaktionen in unserem Unternehmen narrensicher sind. Derzeit verwendet WeChat Pay den privaten Schlüssel, der im ma?geblichen CA-Zertifikat (API-Zertifikat) bereitgestellt wird, das von einem Dritten zur Signatur ausgestellt wurde. Sie k?nnen API-Zertifikate über die H?ndlerplattform einrichten und erhalten.
Denken Sie daran, dass Sie beim ersten Einrichten zum Herunterladen aufgefordert werden. Weitere Informationen finden Sie in den Anweisungen.
Suchen Sie nach der Einrichtung die zip
壓縮包解壓,里面有很多文件,對(duì)于JAVA開(kāi)發(fā)來(lái)說(shuō)只需要關(guān)注apiclient_cert.p12
這個(gè)證書(shū)文件就行了,它包含了公私鑰
,我們需要把它放在服務(wù)端并利用Java解析.p12
-Datei, um den ?ffentlichen Schlüssel und den privaten Schlüssel zu erhalten.
Stellen Sie sicher, dass die Sicherheit des Zertifikats auf der Serverseite gew?hrleistet ist, was finanzielle Sicherheit beinhaltet.
Das API-Zertifikat analysieren
Der n?chste Schritt besteht darin, das Zertifikat im Internet zu analysieren. Hier verwende ich eine ?formellere“ Methode zum Parsen, n?mlich java.security. KeyStore des zu analysierenden JDK-Sicherheitspakets. <code>java.security.KeyStore
來(lái)解析。
微信支付Detaillierte Erl?uterung der WeChat-Zahlung in Java (1): API V3-Versionssignatur使用了PKCS12
算法,我們通過(guò)KeyStore
來(lái)獲取公私鑰對(duì)的載體KeyPair
以及證書(shū)序列號(hào)serialNumber
,我封裝了工具類(lèi):
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();????????????//?證書(shū)的序列號(hào)?也有用 ????????????String?serialNumber?=?certificate.getSerialNumber().toString(16).toUpperCase();????????????//?證書(shū)的?公鑰 ????????????PublicKey?publicKey?=?certificate.getPublicKey();????????????//?證書(shū)的私鑰 ????????????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); ????????} ????} }復(fù)制代碼
眼熟的可以看出是胖哥Spring Security教程中JWT用的公私鑰提取方法的修改版本,你可以對(duì)比下不同之處。
這個(gè)方法中有三個(gè)參數(shù),這里必須要說(shuō)明一下:
-
keyPath
?Detaillierte Erl?uterung der WeChat-Zahlung in Java (1): API V3-Versionssignaturapiclient_cert.p12
的classpath
路徑,一般我們會(huì)放在resources
路徑下,當(dāng)然你可以修改獲取證書(shū)輸入流的方式。 -
keyAlias
證書(shū)的別名,這個(gè)微信的文檔是沒(méi)有的,胖哥通過(guò)加載證書(shū)時(shí)進(jìn)行DEBUG獲取到該值固定為Tenpay Certificate
。 -
keyPass
?證書(shū)密碼,這個(gè)默認(rèn)就是商戶(hù)號(hào),在其它配置中也需要使用就是mchid
,就是你用超級(jí)管理員登錄微信商戶(hù)平臺(tái)在個(gè)人資料中的一串?dāng)?shù)字。
3. V3簽名
微信支付V3版本的簽名是我們?cè)谡{(diào)用具體的微信支付的API時(shí)在HTTP請(qǐng)求頭中攜帶特定的編碼串供微信支付服務(wù)器進(jìn)行驗(yàn)證請(qǐng)求來(lái)源,確保請(qǐng)求是真實(shí)可信的。
簽名格式
簽名串的具體格式,一共五行一行也不能少,每一行以換行符n
結(jié)束。
HTTP請(qǐng)求方法\n URL\n 請(qǐng)求時(shí)間戳\n 請(qǐng)求隨機(jī)串\n 請(qǐng)求報(bào)文主體\n復(fù)制代碼
-
HTTP請(qǐng)求方法 ?你調(diào)用的微信支付API所要求的請(qǐng)求方法,比如APP支付為
POST
。 -
URL ?比如APP支付文檔中為
https://api.mch.weixin.qq.com/v3/pay/transactions/app
,除去域名部分得到參與簽名的URL。如果請(qǐng)求中有查詢(xún)參數(shù),URL末尾應(yīng)附加有'?'和對(duì)應(yīng)的查詢(xún)字符串。這里為/v3/pay/transactions/app
。 -
請(qǐng)求時(shí)間戳 服務(wù)器系統(tǒng)時(shí)間戳,保證服務(wù)器時(shí)間正確并利用
System.currentTimeMillis() / 1000
獲取即可。 -
請(qǐng)求隨機(jī)串 ?找個(gè)工具類(lèi)生成類(lèi)似
593BEC0C930BF1AFEB40B4A08C8FB242
的字符串就行了。 -
請(qǐng)求報(bào)文主體 ?如果是GET請(qǐng)求直接為空字符
""
;當(dāng)請(qǐng)求方法為POST
或PUT
時(shí),請(qǐng)使用真實(shí)發(fā)送的JSON
報(bào)文。圖片上傳API,請(qǐng)使用meta
對(duì)應(yīng)的JSON
報(bào)文。
生成簽名
然后我們使用商戶(hù)私鑰對(duì)按照上面格式的待簽名串進(jìn)行SHA256 with RSA簽名,并對(duì)簽名結(jié)果進(jìn)行Base64編碼得到簽名值。對(duì)應(yīng)的核心Java代碼為:
/** ?*?V3??SHA256withRSA?簽名. ?* ?*?@param?method???????請(qǐng)求方法??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????當(dāng)前時(shí)間戳???因?yàn)橐渲玫絋OKEN?中所以?簽名中的要跟TOKEN?保持一致 ?*?@param?nonceStr?????隨機(jī)字符串??要和TOKEN中的保持一致 ?*?@param?body?????????請(qǐng)求體?GET?為?""?POST?為JSON ?*?@param?keyPair??????商戶(hù)API?證書(shū)解析的密鑰對(duì)??實(shí)際使用的是其中的私鑰 ?*?@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()); }復(fù)制代碼
4. 使用簽名
簽名生成后會(huì)同一些參數(shù)組成一個(gè)Token
放置到對(duì)應(yīng)HTTP請(qǐng)求的Authorization
請(qǐng)求頭中,格式為:
Authorization:?WECHATPAY2-SHA256-RSA2048?{Token}復(fù)制代碼
Token
由以下五部分組成:
發(fā)起請(qǐng)求的商戶(hù)(包括直連商戶(hù)、服務(wù)商或渠道商)的商戶(hù)號(hào)
mchid
商戶(hù)Detaillierte Erl?uterung der WeChat-Zahlung in Java (1): API V3-Versionssignatur序列號(hào)
serial_no
,用于聲明所使用的證書(shū)請(qǐng)求隨機(jī)串
nonce_str
時(shí)間戳
timestamp
簽名值
signature
Token
生成的核心代碼:
/** ?*?生成Token. ?* ?*?@param?mchId?商戶(hù)號(hào) ?*?@param?nonceStr???隨機(jī)字符串? ?*?@param?timestamp??時(shí)間戳 ?*?@param?serialNo???證書(shū)序列號(hào) ?*?@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); }復(fù)制代碼
將生成的Token
PKCS12
-Algorithmus. Wir verwenden KeyStore
, um den Tr?ger des ?ffentlichen und privaten Schlüsselpaars KeyPair
zu erhalten Zertifikatsseriennummer serialNumber
, ich habe die Tool-Klasse gekapselt: rrreee
Wenn es Ihnen bekannt vorkommt, k?nnen Sie sehen, dass es sich um eine modifizierte Version der von JWT im Frühjahr verwendeten Extraktionsmethode für ?ffentliche und private Schlüssel handelt Sicherheits-Tutorial. Sie k?nnen die Unterschiede vergleichen.
Dann verwenden wir den privaten Schlüssel des H?ndlers, um SHA256 mit RSA-Signatur auf der zu signierenden Zeichenfolge durchzuführen im oben genannten Format und führen Sie eine Base64-Codierung für das Signaturergebnis durch, um den Signaturwert zu erhalten. Der entsprechende Kern-Java-Code lautet: ??rrreeeEs gibt drei Parameter in dieser Methode, die hier erkl?rt werden müssen:
Die Signatur der WeChat Pay V3-Version ist, wenn wir die spezifische WeChat Pay API A aufrufen Im HTTP-Anforderungsheader wird eine bestimmte Codierungszeichenfolge für den WeChat-Zahlungsserver übertragen, um die Quelle der Anforderung zu überprüfen und sicherzustellen, dass die Anforderung authentisch und vertrauenswürdig ist.
keyPath
API-Zertifikatapiclient_cert.p12
'sclasspath
-Code>-Pfad, im Allgemeinen werden wir ihn unter demRessourcen
-Pfad ablegen. Natürlich k?nnen Sie die Art und Weise ?ndern, wie der Zertifikat-Eingabestream abgerufen wird.keyAlias
Dieses WeChat-Dokument hat es nicht durch DEBUG erhalten. Der Wert ist aufTenpay-Zertifikat festgelegt
.keyPass
Zertifikatspasswort, dieser Standardwert ist die H?ndlernummer, Sie müssen auchmchid
in anderen Konfigurationen verwenden, d. h. Sie verwenden Superadministrator Eine Zahlenfolge im pers?nlichen Profil beim Anmelden bei der WeChat-H?ndlerplattform.3. V3-Signatur
SignaturformatDas spezifische Format der Signaturzeichenfolge, insgesamt nicht weniger als fünf Zeilen, jede Zeile endet mit einem Zeilenumbruchzeichen
n
.
rrreee
- HTTP-Anfragemethode Die von der von Ihnen aufgerufenen WeChat-Zahlungs-API ben?tigte Anfragemethode, beispielsweise APP-Zahlung, ist
POST
.- URL Das APP-Zahlungsdokument lautet beispielsweise
https://api.mch.weixin.qq.com/v3/pay/transactions/app
, Entfernen Sie den Teil des Dom?nennamens, um die URL zu erhalten, die an der Signatur beteiligt ist. Wenn die Anfrage Abfrageparameter enth?lt, sollten ??“ und die entsprechende Abfragezeichenfolge an das Ende der URL angeh?ngt werden. Dies ist/v3/pay/transactions/app
.- Zeitstempel anfordern Zeitstempel des Serversystems. Stellen Sie sicher, dass die Serverzeit korrekt ist, und verwenden Sie
System.currentTimeMillis() / 1000
, um ihn abzurufen.- Anfordern einer zuf?lligen Zeichenfolge Suchen Sie einfach eine Toolklasse, um eine Zeichenfolge ?hnlich wie
593BEC0C930BF1AFEB40B4A08C8FB242
zu generieren.- Nachrichtentext anfordern Wenn es sich um eine GET-Anfrage handelt, ist sie direkt Nullzeichen
"" code>; Wenn die Anforderungsmethode
POST
oderPUT
ist, verwenden Sie bitte dieJSON
-Nachricht, die wirklich gesendet wird. Für die Bild-Upload-API verwenden Sie bitte dieJSON
-Nachricht, diemeta
entspricht.Signatur generieren
4 Verwenden Sie die Signatur ????Nachdem die Signatur generiert wurde, wird sie mit einigen Parametern kombiniert, um ein Token zu bilden. code> und fügen Sie es in den <code> ein, der dem HTTP-Anforderungsheader code>Authorization
entspricht. Das Format lautet: ??rrreee??Token
besteht aus den folgenden fünf Teilen: ??
mchid
??serial_no
, wird verwendet, um das verwendete Zertifikat zu deklarieren??nonce_str
??timestamp code>??
signatur
??Token
Der generierte Kerncode: ??rrreee??Setzen Sie den generierten Code ein Token
in den Anforderungsheader gem?? dem oben genannten Format einfügen. Die Verwendung von Signaturen kann abgeschlossen werden. ????5. Zusammenfassung????In diesem Artikel haben wir eine vollst?ndige Analyse der schwierigen Signaturen und der Verwendung von Signaturen in der WeChat Pay V3-Version durchgeführt und auch die Analyse von API-Zertifikaten erl?utert, die Ihnen bei der L?sung einiger Probleme helfen kann spezifische Probleme bei der Zahlungsentwicklung. ??????Verwandte kostenlose Lernempfehlungen: ??Java-Grundlagen-Tutorial??????Einführung in den verwandten Artikel: ??So implementieren Sie die Miniprogramm-Zahlungsfunktion????????
Das obige ist der detaillierte Inhalt vonDetaillierte Erl?uterung der WeChat-Zahlung in Java (1): API V3-Versionssignatur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Um JDBC -Transaktionen korrekt zu verarbeiten, müssen Sie zun?chst den automatischen Komiti -Modus ausschalten und dann mehrere Vorg?nge ausführen und schlie?lich entsprechend den Ergebnissen festlegen oder rollen. 1. Nennen Sie Conn.SetAutoCommit (False), um die Transaktion zu starten. 2. Führen Sie mehrere SQL -Operationen aus, z. B. einfügen und aktualisieren. 3. Rufen Sie Conn.Commit () an, wenn alle Vorg?nge erfolgreich sind, und rufen Sie Conn.Rollback () auf, wenn eine Ausnahme auftritt, um die Datenkonsistenz zu gew?hrleisten. Gleichzeitig sollten Try-with-Ressourcen verwendet werden, um Ressourcen zu verwalten, Ausnahmen ordnungsgem?? zu behandeln und Verbindungen zu schlie?en, um Verbindungsleckage zu vermeiden. Darüber hinaus wird empfohlen, Verbindungspools zu verwenden und Save -Punkte zu setzen, um teilweise Rollback zu erreichen und Transaktionen so kurz wie m?glich zu halten, um die Leistung zu verbessern.

Derzeit hat JD.com keine Stablecoins ausgestellt, und Benutzer k?nnen die folgenden Plattformen ausw?hlen, um Mainstream Stablecoins zu kaufen: 1. Binance ist die Plattform mit dem gr??ten Transaktionsvolumen der Welt, unterstützt mehrere Fiat -W?hrungszahlungen und verfügt über eine starke Liquidit?t. 2. OKX hat leistungsstarke Funktionen und bietet 7x24-Stunden-Kundendienst und mehrere Zahlungsmethoden. 3.. Huobi hat einen hohen Ansehen in der chinesischen Gemeinschaft und ein vollst?ndiges Risikokontrollsystem. V. 5. Auf Kucoin sind viele Arten von W?hrungen aufgeführt, was für die Entdeckung früherer Projekte f?rderlich ist. 6. Bitget ist durch Auftragstransaktionen mit bequemen P2P -Transaktionen charakterisiert und eignet sich für Sozialhandelsbegeisterte. Die oben genannten Plattformen bieten alle sichere und zuverl?ssige Stablecoin -Kaufdienste.

Verwenden Sie Klassen im Java.Time -Paket, um das alte Datum und die Kalenderklassen zu ersetzen. 2. Erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit durch LocalDate, LocalDatetime und Local Time; 3. Erstellen Sie ein bestimmtes Datum und eine bestimmte Uhrzeit mit der von () Methode; 4.. Verwenden Sie die Plus/Minus -Methode, um die Zeit nicht zu erh?hen und zu verkürzen. 5. Verwenden Sie ZonedDatetime und zoneId, um die Zeitzone zu verarbeiten. 6. Format und analysieren Sie Datumszeichenfolgen über DateTimeFormatter; 7. Verwenden Sie sofortige, um bei Bedarf mit den alten Datumstypen kompatibel zu sein. Die Verarbeitung der Datum in der modernen Java sollte der Verwendung von Java.Timeapi vorrangig machen, was klare, unver?nderliche und linear ist

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

Die Müllsammlung von Java (GC) ist ein Mechanismus, der automatisch den Speicher verwaltet, der das Risiko eines Speicherlecks verringert, indem unerreichbare Objekte zurückgeführt werden. 1.GC beurteilt die Zug?nglichkeit des Objekts aus dem Stammobjekt (z. B. Stapelvariablen, aktive Threads, statische Felder usw.) und nicht erreichbare Objekte als Müll markiert. 2. Basierend auf dem markierten Algorithmus markieren Sie alle erreichbaren Objekte und l?schen Sie nicht markierte Objekte. 3.. Verfolgen Sie eine Generationskollektionsstrategie: Die neue Generation (Eden, S0, S1) führt h?ufig MollGC aus; Die ?lteren Menschen erzielen weniger, dauert jedoch l?nger, um MajorGC durchzuführen. MetaPace speichert Klassenmetadaten. 4. JVM bietet eine Vielzahl von GC -Ger?ten: SerialGC ist für kleine Anwendungen geeignet; ParallelgC verbessert den Durchsatz; CMS reduziert sich

Durch die Auswahl des richtigen HTMlinput -Typs kann die Datengenauigkeit verbessert, die Benutzererfahrung verbessert und die Benutzerfreundlichkeit verbessert werden. 1. W?hlen Sie die entsprechenden Eingabetypen gem?? dem Datentyp aus, z. B. Text, E -Mail, Tel, Nummer und Datum, die automatisch überprüft und an die Tastatur anpassen k?nnen. 2. Verwenden Sie HTML5, um neue Typen wie URL, Farbe, Reichweite und Suche hinzuzufügen, die eine intuitivere Interaktionsmethode bieten k?nnen. 3.. Verwenden Sie Platzhalter und erforderliche Attribute, um die Effizienz und Genauigkeit der Formulierung zu verbessern. Es sollte jedoch beachtet werden, dass der Platzhalter das Etikett nicht ersetzen kann.

GradleStheBetterChoiceFormostnewProjectsDuetoitSuperiorFlexibilit?t, Leistung und ModerntoolingSupport.1.GRADLE'SGROOVY/KOTLINDSLISMORECONCISEANDEIPRESSIVETHANMANMANBOSEXML.2.GRAGRECONCISEANDEPRPRESSIVETHANMAVENSVOSEXML.2.

Auf Defer wird verwendet, um bestimmte Vorg?nge auszuführen, bevor die Funktion zurückgibt, z. B. die Reinigungsressourcen. Die Parameter werden sofort bewertet, wenn sie aufgeschoben werden, und die Funktionen werden in der Reihenfolge von Last-In-First-Out (LIFO) ausgeführt. 1. Mehrere Defers werden in umgekehrter Reihenfolge der Erkl?rungen ausgeführt. 2. h?ufig für die sichere Reinigung wie das Schlie?en von Dateien verwendet; 3. Der benannte Rückgabewert kann ge?ndert werden; V. 5. Vermeiden Sie den Missbrauch von Verschiebungen in Schleifen, um Ressourcenleckage zu verhindern. Die korrekte Verwendung kann die Sicherheit und die Lesbarkeit der Code verbessern.
