1. 微信支付证书处理
1.1 背景说明
接入微信支付,调用企业付款接口,向微信用户个人付款。
1.2 问题说明
微信支付企业付款接口文档https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2中说明该接口“请求需要双向证书”,但未说明证书需要如何使用。
微信支付安全规范文档https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3中说明“微信支付接口中,涉及资金回滚的接口会使用到API证书,包括退款、撤销接口”,未说明企业付款接口需要使用证书。
因此在调用微信支付企业付款接口时,未使用证书,调用时返回“证书出错,请登录微信支付商户平台下载证书”。
1.3 问题分析
使用Fildder调用微信支付企业付款接口,https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers,发送POST请求,出现如下提示:
使用Java程序通过SSLSocket访问微信支付企业付款接口,查看SSL调试信息,如现以下内容:
*** CertificateRequest |
Warning: no suitable certificate found - continuing without client authentication *** Certificate chain <Empty> *** |
根据以上现象可知,微信支付企业付款接口的SSL服务进行了双向认证,会对SSL客户端证书进行认证。
1.4 微信支付证书处理
微信支付证书下载说明见安全规范文档https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3。
商家在申请微信支付成功后,收到的相应邮件后,可以按照指引下载API证书,也可以按照以下路径下载:微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全。 |
证书附件 描述 pkcs12格式(apiclient_cert.p12) 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 |
◆ API证书调用或安装需要使用到密码,该密码的值为微信商户号(mch_id) |
需要业务按照微信文档下载证书,并发送给技术人员。
旧版证书文件为cert.zip,其中包含apiclient_cert.p12、apiclient_cert.pem、apiclient_key.pem文件。
Java程序在使用SSL证书时,需要使用KeyStore格式文件中保存的SSL证书,因此需要将P12格式的证书转换为KeyStore文件,可使用Java的keytool命令进行转换。在转换格式后,需要将密钥的初始密码进行修改,并检查KeyStore文件内容,命令如下:
# 进入服务器目录 # 上传apiclient_cert.p12文件至当前目录 # 对KeyStore文件设置的密钥库密码与密钥密码可不相同
# P12转JKS /nemo/jdk1.8.0_141/bin/keytool -importkeystore -srckeystore apiclient_cert.p12 -destkeystore PROD-wcentpay_key.keystore -srcstoretype PKCS12 -deststoretype JKS # 提示“Enter destination keystore password:”“Re-enter new password:”,需要两次输入密钥库密码(不会显示在屏幕),需要自己设置,与/data/tomcat/appsystems/certs/welink-frontdmz/PROD-wcentpay_config.properties配置文件中的keystore_pwd参数值保持一致 # 提示输入“Enter source keystore password”,即P12文件的密码(不会显示在屏幕),为/data/tomcat/appsystems/certs/welink-frontdmz/PROD-wcentpay_config.properties配置文件中的mchid参数值 # 成功后会出现以下提示“Entry for alias mmpaycert successfully imported.”“Import command completed: 1 entries successfully imported, 0 entries failed or cancelled” # 以上mmpaycert为导入KeyStore文件的条目别名
# 修改KeyStore密钥密码 /nemo/jdk1.8.0_141/bin/keytool -keypasswd -keystore PROD-wcentpay_key.keystore -alias mmpaycert # -alias参数值mmpaycert应与之前导入KeyStore文件的条目别名一致 # 提示输入“Enter keystore password:”,即之前设置的密钥库密码(不会显示在屏幕),即/data/tomcat/appsystems/certs/welink-frontdmz/PROD-wcentpay_config.properties配置文件中的keystore_pwd参数值 # 提示输入“Enter key password for <mmpaycert>”,即P12文件的密码(不会显示在屏幕),为/data/tomcat/appsystems/certs/welink-frontdmz/PROD-wcentpay_config.properties配置文件中的mchid参数值 # 提示输入“New key password for <mmpaycert>:”“Re-enter new key password for <mmpaycert>:”,需要两次输入密钥库密钥密码(不会显示在屏幕),需要自己设置,与/data/tomcat/appsystems/certs/welink-frontdmz/PROD-wcentpay_config.properties配置文件中的keystore_key_pwd参数值保持一致 # 成功后无提示
# 查看生成的KeyStore文件 /nemo/jdk1.8.0_141/bin/keytool -list -v -keystore PROD-wcentpay_key.keystore # 提示输入“Enter keystore password:”,即之前设置的密钥库密码(不会显示在屏幕),即/data/tomcat/appsystems/certs/welink-frontdmz/PROD-wcentpay_config.properties配置文件中的keystore_pwd参数值 # # 删除apiclient_cert.p12文件 |
1.5 Java对SSL客户端证书的使用
在Java中进行SSL通信时,使用SSL客户端证书示例代码如下:
1.5.1 使用Apache HttpClient
当使用Apache HttpClient时,示例代码如下:
public CloseableHttpClient genHttpsClient(String[] supportedProtocols, String[] supportedCipherSuites, |
1.5.2 使用SSLSocket或HttpsURLConnection
当使用SSLSocket或HttpsURLConnection时,均需要生成SSLSocketFactory,示例代码如下:
|
当使用SSLSocket时,需要调用SSLSocketFactory的createSocket方法获取SSLSocket对象。
当使用HttpsURLConnection时,需要调用HttpsURLConnection的setSSLSocketFactory,设置SSLSocketFactory对象。
1.6 问题解决
调用微信支付企业付款接口时,对微信支付证书进行处理,并在Java程序中使用SSL客户端证书后,能够正常调用接口。
2. QQ互联appid处理
2.1 问题说明
调用QQ互联的访问用户资料接口get_user_info,文档为http://wiki.connect.qq.com/get_user_info,返回信息为“{"ret":100008,"msg":"client request's app is not existed"}”。
2.2 问题分析
已检查调用上述接口时,appid参数值上送正确。
查看创建应用文档http://wiki.connect.qq.com/__trashed-2,说明“点击“应用接口”可查看已获取的接口,使用QQ登录功能。”截图如下:
登录QQ互联平台查看对应页面,截图如下,可以看到登录对应的API为login,而不是文档中说明的get_user_info:
查看API列表文档http://wiki.connect.qq.com/api%E5%88%97%E8%A1%A8,说明访问用户资料接口不需要申请权限。
怀疑是因为当前应用对访问用户资料接口get_user_info没有权限导致,查看OpenAPI权限申请文档http://wiki.connect.qq.com/openapi%E6%9D%83%E9%99%90%E7%94%B3%E8%AF%B7,按照提示登录QQ互联平台后,未找到对应的API管理界面。
2.3 问题解决
通过腾讯企业微信联系qqconnecthelper(QQ互联及登录咨询),描述问题现象后,对方帮忙找到相应同事解决,反馈原因是因为应用信息未同步。
以上问题为对测试应用进行测试时出现,若生产应用上线时也出现类似问题,需要再联系对方进行处理。