1. 程式人生 > >對接微信支付退款證書之坑

對接微信支付退款證書之坑

背景

專案需要直接對接微信支付,實現小程式支付和退款功能,支付不需要證書,但是退款的話需要證書支援

  • 語言:php
  • 開發環境win
  • 測試環境centos

坑點1:路徑問題

網上查到比較多的答案是在Linux系統下采用虛擬路徑,Windows系統下采用絕對路徑,但是在開發的過程中,發現在Windows系統下用絕對路徑OK,但是放到測試環境的時候,出錯了,報curl:58錯誤。測試環境改成絕對路徑就可以通過用例了。

參考PHP程式碼:

			//在微信官方提供的demo中的Wxpay.Api.php中的postXmlCurl方法
			//設定證書
			//使用證書:cert 與 key 分別屬於兩個.pem檔案
			curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
			curl_setopt($ch,CURLOPT_SSLCERT, __DIR__ .WxPayConfig::SSLCERT_PATH);
			curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
			curl_setopt($ch,CURLOPT_SSLKEY, __DIR__ .WxPayConfig::SSLKEY_PATH);

坑點2:證書存放目錄

證書需要放到一個檔名問cert的資料夾下面,不然還是會報找不到證書的錯誤

坑點3:微信官方文件提供的OpenSSL命令跑出來的證書有問題

  • 官方提供:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem
輸出樣例
Bag Attributes
    localKeyID: ******************************** 
    friendlyName: Tenpay Certificate
Key Attributes: <No Attributes>


  • 最後正確的命令:openssl pkcs12 -nodes -clcerts -in apiclient_cert.p12 -out apiclient_key.pem
輸出樣例
Bag Attributes
    localKeyID: **************************************
    friendlyName: Tenpay Certificate
subject=/CN=1245052102/O=**************/C=CN/ST=GuangDong/L=ShenZhen
issuer=/C=CN/O=Tenpay.com/OU=Tenpay.com CA Center/CN=Tenpay.com Root CA
-----BEGIN CERTIFICATE-----
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
-----END CERTIFICATE-----
Bag Attributes
    localKeyID:**********************************
    friendlyName: Tenpay Certificate
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************

官方提供的命令中的-nocerts表示不輸出任何證書,修改後的-clicerts表示僅輸出客戶端證書