对接微信支付退款证书之坑

背景

项目需要直接对接微信支付,实现小程序支付和退款功能,支付不需要证书,但是退款的话需要证书支持

  • 语言: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: 


  • 最后正确的命令: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: 
-----BEGIN PRIVATE KEY-----
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************
******************************

官方提供的命令中的-nocerts表示不输出任何证书,修改后的-clicerts表示仅输出客户端证书

具体命令可以看看官网文档的描述:https://www.openssl.org/docs/manmaster/man1/pkcs12.html

你可能感兴趣的:(PHP,踩坑记录)