背景
項目需要直接對接微信支付,實現小程序支付和退款功能,支付不需要證書,但是退款的話需要證書支持
- 語言: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
表示僅輸出客戶端證書
具體命令可以看看官網文檔的描述:https://www.openssl.org/docs/manmaster/man1/pkcs12.html