这是个坑爹的报错,但是证明了开发人员没有仔细看官方的DEMO。官方的DEMO里面不仅有代码示例,还有一个word文档,专门讲了遇到这种情况如何处理。

一、背景

开发环境是Windows Server,写的是C#的代码,用到了微信支付,当然是用到了企业付款的功能,下载安装了API证书,也因为近期微信根证书更换的事情,所以为了保险,也安装了微信支付提供的那两个CA证书,但是仍然报错,直接报请求被中止,未能创建 SSL/TLS 安全通道,这其实就意味着根本没有发起支付,所以推测应该是环境出了问题,但是环境能有啥问题啊,一共就2个证书,要么是CA那种根证书,要么就是API证书,翻来覆去安装了数十遍,一点效果都没有。

二、解决方案

一不小心,重新看了一下DEMO,看到了里面的文档,文档里面详细的介绍了解决方案。这个文档地址在微信支付提供的Demo外链,下载之后里面有解决方案,自己看。

实战的步骤是:

(1)打开mmc

(2)选择文件-添加/删除管理单元,左边选择证书,点击添加,选择计算机账户,点击下一步,选择本地计算机(默认选择),点击完成后,再点确定

(3)右键个人-证书,出现导入证书界面,安装步骤导入.p12格式的证书,导完之后右边出现刚刚导入的证书。

(4)到这一步,官方让你再试一试看看,我试了仍然不行,所以接着往下配置。

(5)去微软官方下载一个叫做WinHttpCertCfg.exe的安装文件,事实上你打开这个网址它就自动下载了。下载之后安装到服务器上。

(6)在64位系统下,安装之后工具在C:\Program Files (x86)\Windows Resource Kits\Tools路径下,使用CD指令定位到该目录下。

(7)使用刚刚安装的工具,给指定用户开证书的访问权限,这是创造奇迹的命令:

winhttpcertcfg.exe -g -c LOCAL_MACHINE\MY -s "证书名称,一般是公司名称" -a "NETWORKSERVICE"

(8)上面的证书名称,官方提示你了,你双击你安装的那个证书,看看颁发给那个字段是什么值这里就填写什么。

(9)可是你很可能和我一样,上面命令执行后发现虽然提示成功,但是仍然没有用,怎么办?接着把其他两个用户也授权试试吧。事实上你在执行下面第一条命令的时候有失败提示,无所谓,接着第二条,提示成功,这个时候再试试程序能够正常企业付款。

winhttpcertcfg.exe -g -c LOCAL_MACHINE\MY -s "证书名称,一般是公司名称" -a "ASPNET"
winhttpcertcfg.exe -g -c LOCAL_MACHINE\MY -s "证书名称,一般是公司名称" -a "Authenticated Users"

(10)如果还不行,那你继续战斗吧。我歇会。