国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
最近在折騰微信支付,證書(shū)還是比較煩人的,所以有必要分享一些經(jīng)驗(yàn),減少你在開(kāi)發(fā)微信支付時(shí)的踩坑。目前微信支付的API已經(jīng)發(fā)展到
為了確保資金敏感資料的安全性,確保我們業(yè)務(wù)中的資金往來(lái)交易萬(wàn)無(wú)一失。目前微信支付第三方簽發(fā)的權(quán)威CA憑證(API憑證)中提供的
解析API憑證
3. V3簽章
簽章格式
產(chǎn)生簽章
4. 使用簽章
%%PRE_BLOCK_4%%
首頁(yè) Java Java基礎(chǔ) 詳解Java中的微信支付(1):API V3版本簽名

詳解Java中的微信支付(1):API V3版本簽名

Oct 27, 2020 pm 05:20 PM
java 微信支付

##java基礎(chǔ)教學(xué) ##專(zhuān)欄介紹Java中的微信支付,實(shí)作API V3版本簽名。

詳解Java中的微信支付(1):API V3版本簽名#1、前言

最近在折騰微信支付,證書(shū)還是比較煩人的,所以有必要分享一些經(jīng)驗(yàn),減少你在開(kāi)發(fā)微信支付時(shí)的踩坑。目前微信支付的API已經(jīng)發(fā)展到

V3

版本,採(cǎi)用了流行的寧?kù)o風(fēng)格。

詳解Java中的微信支付(1):API V3版本簽名今天來(lái)分享微支付信的難點(diǎn)-

簽名

#,雖然有很多好用的SDK但是如果你想深入了解微信支付還是需要了解一下的。2. API憑證

為了確保資金敏感資料的安全性,確保我們業(yè)務(wù)中的資金往來(lái)交易萬(wàn)無(wú)一失。目前微信支付第三方簽發(fā)的權(quán)威CA憑證(API憑證)中提供的

私鑰

來(lái)進(jìn)行簽名。您可以透過(guò)商家平臺(tái)設(shè)定並取得API憑證。

詳解Java中的微信支付(1):API V3版本簽名記得在第一次設(shè)定的時(shí)候會(huì)提示下載,後面就不再提供下載了,參考具體說(shuō)明。

詳解Java中的微信支付(1):API V3版本簽名說(shuō)明#設(shè)定後找到

zip

壓縮很多包解壓,裡面有文件,適合JAVA開(kāi)發(fā)話(huà)說(shuō)只需要關(guān)注apiclient_cert.p12這個(gè)憑證檔案就行了,它包含了公私金鑰,我們需要把它放在服務(wù)端並利用Java解析.p12檔案取得公鑰私鑰。

務(wù)必保證伺服器端的安全,它涉及到資金安全

解析API憑證

接下來(lái)就是憑證的解析了,憑證的解析有網(wǎng)路上很多方法,這裡我使用比較「正規(guī)」的方法來(lái)解析,利用JDK安全包的java.security.KeyStore來(lái)解析。

微信支付API憑證使用了PKCS12演算法,我們透過(guò)KeyStore來(lái)取得公私鑰對(duì)的載體KeyPair以及憑證序號(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 ?API憑證apiclient_cert.p12classpath路徑,一般我們會(huì)放在resources路徑下,當(dāng)然你可以修改取得憑證輸入流的方式。
  • keyAlias 憑證的別名,這個(gè)微信的文檔是沒(méi)有的,胖哥透過(guò)載入憑證時(shí)進(jìn)行DEBUG取得到該值固定為Tenpay Certificate
  • keyPass ?憑證密碼,這個(gè)預(yù)設(shè)就是商家號(hào),在其它配置中也需要使用就是mchid,就是你用超級(jí)管理員登入微信商家平臺(tái)在個(gè)人資料中的一串?dāng)?shù)字。

3. V3簽章

微信支付V3版本的簽章是我們?cè)诤艚刑囟ǖ奈⑿胖Ц兜腁PI時(shí)在HTTP請(qǐng)求頭中攜帶特定的編碼串供微信支付伺服器進(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)求方法 ?你呼叫的微信支付API所要求的請(qǐng)求方法,例如APP支付為POST。
  • URL ?例如APP付款文件中為https://api.mch.weixin.qq.com/v3/pay/transactions/app,除去網(wǎng)域名稱(chēng)部分得到參與簽名的URL。如果請(qǐng)求中有查詢(xún)參數(shù),URL末尾應(yīng)附加有'?'和對(duì)應(yīng)的查詢(xún)字串。這裡為/v3/pay/transactions/app
  • 請(qǐng)求時(shí)間戳 伺服器系統(tǒng)時(shí)間戳,保證伺服器時(shí)間正確並利用System.currentTimeMillis() / 1000取得即可。
  • 要求隨機(jī)字串 ?找個(gè)工具類(lèi)別產(chǎn)生類(lèi)似593BEC0C930BF1AFEB40B4A08C8FB242的字串就行了。
  • 請(qǐng)求封包主體 ?如果是GET請(qǐng)求直接為空白字元"" ;當(dāng)請(qǐng)求方法為POSTPUT時(shí),請(qǐng)使用真實(shí)傳送JSON封包。圖片上傳API,請(qǐng)使用meta對(duì)應(yīng)的JSON封包。

產(chǎn)生簽章

然後我們使用商家私鑰對(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. 使用簽章

簽章產(chǎn)生後會(huì)同一些參數(shù)組成一個(gè)Token放置到對(duì)應(yīng)HTTP請(qǐng)求的Authorization請(qǐng)求頭中,格式為:

Authorization:?WECHATPAY2-SHA256-RSA2048?{Token}復(fù)制代碼

Token由以下五個(gè)部分組成:

  • 發(fā)起請(qǐng)求的商家(包括直連商家、服務(wù)商或頻道商)的商家號(hào)碼mchid

  • #商家API憑證序號(hào)serial_no,用於宣告所使用的憑證

  • 請(qǐng)求隨機(jī)字串nonce_str

  • #時(shí)間戳記timestamp

  • #timestamp

簽名值

signature

Token

產(chǎn)生的核心程式碼:

/**
?*?生成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ù)制代碼

將產(chǎn)生的

Token

依照上述格式放入請(qǐng)求頭中即可完成簽名的使用。

5. 總結(jié)本文我們對(duì)微信支付V3版本的難點(diǎn)簽名以及簽名的使用進(jìn)行了完整的分析,同時(shí)對(duì)API證書(shū)的解析也進(jìn)行了講解,相信能夠幫助你在支付開(kāi)發(fā)中解決一些具體的問(wèn)題。

相關(guān)免費(fèi)學(xué)習(xí)推薦:java基礎(chǔ)教學(xué)

相關(guān)文章介紹:###如何實(shí)作小程式支付功能######### ####

以上是詳解Java中的微信支付(1):API V3版本簽名的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

Laravel 教程
1600
29
PHP教程
1501
276
如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開(kāi)始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

京東穩(wěn)定幣官網(wǎng) 京東穩(wěn)定幣在哪買(mǎi) 京東穩(wěn)定幣官網(wǎng) 京東穩(wěn)定幣在哪買(mǎi) Aug 01, 2025 pm 06:51 PM

目前京東並未發(fā)行任何穩(wěn)定幣,用戶(hù)可選擇以下平臺(tái)購(gòu)買(mǎi)主流穩(wěn)定幣:1. 幣安(Binance)是全球交易量最大的平臺(tái),支持多種法幣支付,流動(dòng)性強(qiáng);2. 歐易(OKX)功能強(qiáng)大,提供7x24小時(shí)客服和多重支付方式;3. 火幣(Huobi)在華人社區(qū)信譽(yù)高,風(fēng)控體系完善;4. Gate.io幣種豐富,適合購(gòu)買(mǎi)穩(wěn)定幣後探索小眾資產(chǎn);5. KuCoin上幣種類(lèi)多,利於發(fā)現(xiàn)早期項(xiàng)目;6. Bitget以跟單交易為特色,P2P交易便捷,適合社交交易愛(ài)好者,以上平臺(tái)均提供安全可靠的穩(wěn)定幣購(gòu)買(mǎi)服務(wù)。

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類(lèi)替代舊的Date和Calendar類(lèi);2.通過(guò)LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過(guò)DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過(guò)Instant與舊日期類(lèi)型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線(xiàn)

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動(dòng)管理內(nèi)存的機(jī)制,通過(guò)回收不可達(dá)對(duì)象釋放堆內(nèi)存,減少內(nèi)存洩漏風(fēng)險(xiǎn)。 1.GC從根對(duì)象(如棧變量、活動(dòng)線(xiàn)程、靜態(tài)字段等)出發(fā)判斷對(duì)象可達(dá)性,無(wú)法到達(dá)的對(duì)像被標(biāo)記為垃圾。 2.基於標(biāo)記-清除算法,標(biāo)記所有可達(dá)對(duì)象,清除未標(biāo)記對(duì)象。 3.採(cǎi)用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時(shí)較長(zhǎng)的MajorGC;Metaspace存儲(chǔ)類(lèi)元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

以身作則,解釋說(shuō)明 以身作則,解釋說(shuō)明 Aug 02, 2025 am 06:26 AM

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時(shí)立即求值,函數(shù)按後進(jìn)先出(LIFO)順序執(zhí)行;1.多個(gè)defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會(huì)執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

Java並發(fā)公用事業(yè):執(zhí)行人員服務(wù)和叉/加入 Java並發(fā)公用事業(yè):執(zhí)行人員服務(wù)和叉/加入 Aug 03, 2025 am 01:54 AM

ExecutorService適用於獨(dú)立任務(wù)的異步執(zhí)行,如I/O操作或定時(shí)任務(wù),使用線(xiàn)程池管理並發(fā),通過(guò)submit提交Runnable或Callable任務(wù),並用Future獲取結(jié)果,需注意無(wú)界隊(duì)列風(fēng)險(xiǎn)和顯式關(guān)閉線(xiàn)程池;2.Fork/Join框架專(zhuān)為可拆分的CPU密集型任務(wù)設(shè)計(jì),基於分治法和工作竊取算法,通過(guò)RecursiveTask或RecursiveAction實(shí)現(xiàn)任務(wù)遞歸拆分,由ForkJoinPool調(diào)度執(zhí)行,適合大數(shù)組求和、排序等場(chǎng)景,需合理設(shè)置拆分閾值避免開(kāi)銷(xiāo);3.選擇依據(jù):獨(dú)立任

See all articles