微信V3支付報錯 平臺證書及平臺證書序列號

1.平臺證書及平臺證書序列號設置錯誤報錯:

  • 錯誤1:

Verify the response’s data with: timestamp=1735184656, nonce=a5806b8cabc923299f8db1a174f3a4d0, signature=FZ5FgD/jtt4J99GKssKWKA/0buBSOAbWcu6H52l2UqqaJKvrsNxvodB569ZFz5G3fbassOQcSh5BFq6hvEMjQ2U3gKyF1muqsX8oufN4pLQpO+SO5CM7q8y/jIiYG18Kn3Iss7jbG/qGTsssscN98tfpUAb3TCWSQB1mVXUgSDWsROthYfduUgsNMC/xe1z1f2Os9L8fYWjqv8Fr5W5sL7+jFzSTibu7XcietZ+G1MusHC606ncF8MU9cNEf5QRHqgkril3e5IEesssEud6bp35sss0I87wgU5eMDZJp2hw==, cert=[2sssssss1FCC3BBA284F5C7889BCD7B47 => …] failed

  • 錯誤2:

certs(175BxxxxE4507EA22FFD9D8B7CCD0218F1E3xxxx) contains the merchant’s certificate serial number(175BxxxxE4507EA22FFD9D8B7CCD0218F1E3xxxx) which is not allowed here.

  • 錯誤3:

Cannot found the serial(2sssssss1FCC3BBA284F5C7889BCD7B47)'s configuration, which’s from the response(header:Wechatpay-Serial), your’s 5B1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A

2.重點介紹平臺證書 及序列號獲取方法

選擇 “驗證微信支付身份” 管理證書
2.1選擇商戶后臺 “驗證微信支付身份” 管理證書。
平臺證書的序列號
拿到 平臺證書的序列號,

2.2 點擊 “右上角” 下載證書
在這里插入圖片描述
獲取證書相關鏈接:https://pay.weixin.qq.com/doc/v3/merchant/4012068814

打開鏈接后按照提示下載jar包,
jdk下載地址:https://repo.huaweicloud.com/java/jdk/ windows配置環境變量JAVA_HOME:C:\Program Files\Java\jdk-13
path增加:%JAVA_HOME%\bin
java -jar CertificateDownloader.jar -k a3F7t8L2x9K5xxxxx -m 1xxxxxx -f D:\program\WXCertUtil\WXCertUtil\cert\1700367105_20241225_cert\apiclient_key.pem -s 11111122E5678EA22xxxx18F1cdEab3 -o d:
在d盤生成wechatpay開頭的pem文件,就是我們要的平臺證書。上傳到服務器/data/wechat_cert/wechatpay_platform_create_at_202412.pem下

下屬代碼中的
WECHAT_PAY_PLATFORM_CERTIFICATE=/data/wechat_cert/wechatpay_platform_create_at_202412.pem
WECHAT_PAY_PLATFORM_CERTIFICATE_SERIAL=11D1111B23D5BFD1FddbBBA111F5C7889BC11111

3.支付完整代碼

<?phpnamespace app\common\util;use WeChatPay\Builder;
use WeChatPay\Crypto\Rsa;
use WeChatPay\Formatter;//參考 微信支付文檔:https://pay.weixin.qq.com/docs/merchant/apis/in-app-payment/direct-jsons/app-prepay.html
class WeChatPayUtil
{/*** 微信開發平臺審核通過的應用ID* @var string*/protected $appid = 'xxx';/*** 商戶ID* @var string*/protected $merchantId = 'xxx';/*** 商戶v3版本私鑰* @var string*/protected $merchantV3PrivateKey = 'xx';/*** 「商戶API私鑰」文件的絕對路徑* @var string*/protected $merchantPrivatePath = '\v3_apiclient_key.pem';/*** 「商戶API證書」的「證書序列號」* @var string*/protected $merchantCertificateSerial = 'xxx';/*** 「微信支付平臺證書」文件的絕對路徑* @var string*/protected $platformCertificate = '\platform_key.pem';/*** 「微信支付平臺證書」的「證書序列號」* @var string*/protected $platformCertificateSerial = 'xx';/*** APIv3 客戶端實例* @var \WeChatPay\BuilderChainable*/protected $instance;public function getMerchantV3PrivateKey(): string{return $this->merchantV3PrivateKey;}public function __construct(){$this->appid = getenv('WECHAT_PAY_APPID');$this->merchantId = getenv('WECHAT_PAY_MERCHANT_ID');$this->merchantV3PrivateKey = getenv('WECHAT_PAY_MERCHANT_V3_PRIVATE_KEY');$this->merchantPrivatePath = getenv('WECHAT_PAY_MERCHANT_PRIVATE_PATH');$this->merchantCertificateSerial = getenv('WECHAT_PAY_MERCHANT_CERTIFICATE_SERIAL');$this->platformCertificate = getenv('WECHAT_PAY_PLATFORM_CERTIFICATE');$this->platformCertificateSerial = getenv('WECHAT_PAY_PLATFORM_CERTIFICATE_SERIAL');// 從本地文件中加載「商戶API私鑰」,「商戶API私鑰」會用來生成請求的簽名$merchantPrivateKeyInstance = Rsa::from("file://" . $this->merchantPrivatePath, Rsa::KEY_TYPE_PRIVATE);// 從本地文件中加載「微信支付平臺證書」或者「微信支付平臺公鑰」,用來驗證微信支付應答的簽名$platformPublicKeyInstance = Rsa::from("file://" . $this->platformCertificate, Rsa::KEY_TYPE_PUBLIC);// 構造一個 APIv3 客戶端實例$instance = Builder::factory(['mchid' => $this->merchantId,'serial' => $this->merchantCertificateSerial,'privateKey' => $merchantPrivateKeyInstance,'certs' => [$this->platformCertificateSerial => $platformPublicKeyInstance,],]);$this->instance = $instance;}/***  APP下單* https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml* @param $out_trade_no string 在自己系統中唯一的訂單號* @param $body string  商品描述* @param $amount number 訂單金額,單位為元* @param $notify_url string 支付回調地址,必須是https開頭。例如:https://www.xxx.com/xxx/xxx* @return \Psr\Http\Message\ResponseInterface*/public function appPay($out_trade_no, $body, $amount, $notify_url){return $this->instance->chain('v3/pay/transactions/app')->post(['json' => ['mchid' => $this->merchantId,'out_trade_no' => $out_trade_no,'appid' => $this->appid,'description' => $body,'notify_url' => $notify_url,'amount' => ['total' => $amount * 100,'currency' => 'CNY'],'time_expire' => date('Y-m-d\TH:i:sP', time() + 20 * 60) // 訂單未支付20分鐘過期]]);}/*** 生成支付簽名* @param $result_data* @return array*/public function generateSignature($result_data){// 從本地文件中加載「商戶API私鑰」,「商戶API私鑰」會用來生成請求的簽名// 文件路徑例如:D:\EMin\xxx\cert\wx_v3\v3_apiclient_key.pem$merchantPrivateKeyInstance = Rsa::from('file://' . $this->merchantPrivatePath, Rsa::KEY_TYPE_PRIVATE);$arouse_data = ['appId' => $this->appid,'timeStamp' => strval(Formatter::timestamp()),'nonceStr' => Formatter::nonce(),//'package' => 'prepay_id=' . $result_data['prepay_id'],  // JSAPI下單'prepay_id' => $result_data['prepay_id'], // APP下單];$arouse_data += ['paySign' => Rsa::sign(Formatter::joinedByLineFeed(...array_values($arouse_data)),$merchantPrivateKeyInstance), 'signType' => 'RSA'];return $arouse_data;}/***簽名驗簽* @date 2024/11/28* @param array $header 請求頭* @param string $body 請求參數* @return bool*/public function signVerify(array $header, string $body){$inWechatPaySignature = $header['wechatpay-signature'];// 請根據實際情況獲取 微信方的簽名$inWechatPayTimestamp = $header['wechatpay-timestamp'];// 請根據實際情況獲取 微信方的時間戳$inWechatPayNonce = $header['wechatpay-nonce'];// 請根據實際情況獲取 微信方的隨機字符串// 根據通知的平臺證書序列號,查詢本地平臺證書文件,$platformPublicKeyInstance = Rsa::from('file://' . $this->platformCertificate, Rsa::KEY_TYPE_PUBLIC);// 檢查通知時間偏移量,允許5分鐘之內的偏移$timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$inWechatPayTimestamp);$verifiedStatus = Rsa::verify(// 構造驗簽名串Formatter::joinedByLineFeed($inWechatPayTimestamp, $inWechatPayNonce, $body),$inWechatPaySignature,$platformPublicKeyInstance);if ($timeOffsetStatus && $verifiedStatus) {return true;}return false;}}

配置文件如下:
WECHAT_PAY_APPID=wxd11111111111111
WECHAT_PAY_MERCHANT_ID=1700111111
WECHAT_PAY_MERCHANT_V3_PRIVATE_KEY=aaaaaaaaa9K5p1Q4w6R3s2c7u4bbbbbb
WECHAT_PAY_MERCHANT_PRIVATE_PATH=/data/wechat_cert/wechat_apiclient_key.pem
WECHAT_PAY_MERCHANT_CERTIFICATE_SERIAL=175BC000E45tytr22eeD9d8B7BBD6666F1E3E749
WECHAT_PAY_PLATFORM_CERTIFICATE=/data/wechat_cert/wechatpay_platform_create_at_202412.pem
WECHAT_PAY_PLATFORM_CERTIFICATE_SERIAL=11D1111B23D5BFD1dddbBBA111F5r7889vb11111

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64477.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64477.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Ubuntu下通過Docker部署Mastodon服務器

嘿&#xff0c;朋友們&#xff0c;今天咱們來聊聊如何在Ubuntu上通過Docker部署Mastodon服務器。想要擁有自己的社交媒體平臺&#xff1f;Mastodon就是個不錯的選擇&#xff01;&#x1f310;&#x1f680; Docker與Mastodon簡介 Docker是一個開源的容器化平臺&#xff0c;讓…

Es搭建——單節點——Linux

Es搭建——單節點——Linux 一、安裝 下載安裝包&#xff1a; 官網下載地址&#xff1a;https://www.elastic.co/downloads/elasticsearch 上傳包到linux 切換到安裝目錄下 解壓&#xff1a;tar -zxvf elasticsearch-7.17.1-linux-x86_64.tar.gz 重命名安裝文件夾 mv elastics…

【機器學習】梯度下降

文章目錄 1. 梯度下降概念2. 梯度下降的技巧2.1 動態設置學習率2.2 Adagrad調整梯度2.3 隨機梯度下降&#xff08;SGD&#xff09;2.4 特征縮放 3. 梯度下降理論基礎 1. 梯度下降概念 梯度&#xff1a;Loss 對參數在某一點的偏微分&#xff0c;函數沿梯度的方向具有最大的變化…

數據庫在大數據領域的探索與實踐:動態存儲與查詢優化

在大數據時代&#xff0c;數據庫的靈活性與高效性成為數據存儲與分析的重要基石。從關系型數據庫到 NoSQL 數據庫的演進&#xff0c;開發者逐漸可以在結構化與非結構化數據間找到平衡。本文將聚焦大數據場景下的數據庫實踐&#xff0c;尤其是如何動態存儲與查詢復雜數據&#x…

【Python科研數據爬蟲】基于國家標準查詢平臺和能源標準化信息平臺的海上風電相關行業標準查詢信息爬取及處理

基于國家標準查詢平臺和能源標準化信息平臺的海上風電相關行業標準查詢信息爬取及處理 1 背景2 標準檢索平臺2.1 能源標準化信息平臺2.2 全國標準信息公共服務平臺3 標準信息數據的爬取與處理3.1 能源標準化信息平臺的信息爬取3.2 全國標準信息公共服務平臺的信息爬取3.3 標準信…

AWS Certified AI Practitioner 自學考試心得

學習目標&#xff1a; 考取 AWS Certified AI Practitioner 那什么是 AWS Certified AI Practitioner 認證 是基礎級的認證 比較簡單 — 學習內容&#xff1a; 1. AWS網站自學網站 極客時間免費課程&#xff1a;http://gk.link/a/12sJL 配合極客時間課程的章節測試檢驗自…

Ngnix介紹、安裝、實戰及用法!!!

一、Nginx簡介 1、Nginx概述 Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理服務器&#xff0c;特點是占有內存少&#xff0c;并發能力強&#xff0c;能經受高負載的考驗,有報告表明能支持高達 50,000 個并發連接數 。 2、正向代理 正向代理&#xff1a;如果把局…

05.HTTPS的實現原理-HTTPS的握手流程(TLS1.2)

05.HTTPS的實現原理-HTTPS的握手流程&#xff08;TLS1.2&#xff09; 簡介1. TLS握手過程概述2. TLS握手過程細化3. 主密鑰&#xff08;對稱密鑰&#xff09;生成過程4. 密碼規范變更 簡介 主要講述了混合加密流程完成后&#xff0c;客戶端和服務器如何共同獲得相同的對稱密鑰…

YOLO11全解析:從原理到實戰,全流程體驗下一代目標檢測

前言 一、模型介紹 二、網絡結構 1.主干網絡&#xff08;Backbone&#xff09; 2.頸部網絡&#xff08;Neck&#xff09; 3.頭部網絡&#xff08;Head&#xff09; 三、算法改進 1.增強的特征提取 2.優化的效率和速度 3.更高的準確性與更少的參數 4.環境適應性強 5.…

C++ 與 Python(靜態類型語言與動態語言)

C 與 Python&#xff08;靜態類型語言與動態語言&#xff09; 一、說明 Python和C到底有啥區別&#xff1f;在使用的時候有啥特殊的益處&#xff1f;這種問題的意義在于&#xff1a;如果對語言了解越清楚&#xff0c;越能夠更加大膽地應用哪些極限功能&#xff0c;從而最大限…

Jenkins 構建流水線

在 Linux 系統上安裝 Jenkins 服務&#xff0c;以及配置自動化構建項目 前置準備環境&#xff1a;docker、docker-compose、jdk、maven 一、環境搭建 1. Jenkins 安裝 &#xff08;1&#xff09;拉取鏡像 # 安裝鏡像包&#xff0c;默認安裝最新版本 docker pull jenkins/jen…

【Java】面試題 并發安全 (1)

文章目錄 synchronized1. 基本概念與作用2. 使用方式3. 底層原理&#xff08;基于monitor&#xff09;4. 面試題回答要點5. 注意事項與進階理解 Java中synchronized鎖相關知識總結Java內存模型&#xff08;JMM&#xff09;CAS概述及重要性volatile關鍵字AQS簡介 synchronized …

前端項目 npm報錯解決記錄

1.首先嘗試解決思路 npm報錯就切換yarn &#xff0c; yarn報錯就先切換npm刪除 node_modules 跟 package-lock.json文件重新下載依 2. 報錯信息&#xff1a; Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…

深度學習中batch_size

Batch size調整和epoch/iteration的關系 訓練數據集總共有1000個樣本。若batch_size10&#xff0c;那么訓練完全體樣本集需要100次迭代&#xff0c;1次epoch。 訓練樣本10000條&#xff0c;batchsize設置為20&#xff0c;將所有的訓練樣本在同一個模型中訓練5遍&#xff0c;則…

Redis 數據類型全解析:基礎與進階應用場景

前言&#xff1a;Redis 是一個高性能的內存數據庫&#xff0c;支持多種數據類型&#xff0c;能夠高效處理各種場景的數據存儲和操作。 以下是Redis數據類型的數據結構及其應用場景的詳細說明&#xff1a; 基礎數據類型 1. 字符串 (String) 底層數據結構 Simple Dynamic Stri…

評分模型在路網通勤習慣分析中的應用——提出問題(1)

1、問題的由來、目標和意義 最近一段時間和公司其它業務部門討論時&#xff0c;發現一個有趣的交通路網問題&#xff0c;車輛從S點行駛到V點共用時40分鐘&#xff0c;這段時間內路網中的卡口攝像頭識別到了車輛通過的信息。如下圖所示&#xff1a; 設計師需要通過這些有限的路…

leetcode 面試經典 150 題:刪除有序數組中的重復項

鏈接刪除有序數組中的重復項題序號26題型數組解題方法雙指針難度簡單熟練度????? 題目 給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對順序 應該保…

提升生產力工具

VSCODE插件 干貨&#xff1a;用好這13款VSCode插件&#xff0c;工作效率提升10倍 - 程序員檸檬 - 博客園 Sourcetrail Sourcetrail 是一個開源且免費的源碼閱讀工具&#xff0c;以其強大的代碼導航、可視化及跨平臺支持特性&#xff0c;成為開發者理解復雜代碼庫的得力助手。…

什么是 Git Hooks?

在團隊開發中&#xff0c;當成員提交代碼的描述信息不符合約定提交規范的時候&#xff0c;需要阻止當前的提交&#xff0c;而要實現這個目的&#xff0c;我們就需要先來了解一個概念&#xff0c;叫做 Git hooks&#xff0c;即Git 在執行某個事件之前或之后進行一些其他額外的操…

Go語言方法和接收器類型詳解

Go語言方法和接收器類型詳解 1. 方法接收器類型 1.1 值接收器 值接收器方法不會改變接收器的狀態&#xff0c;因為Go語言會在調用時復制接收器的值。因此&#xff0c;任何對接收器成員變量的修改都只會影響副本&#xff0c;而不會影響原始結構體實例。 type Person struct …