微信支付与QQ互联接入问题记录

8 篇文章 1 订阅

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,
                                          KeyStore trustStore, TrustStrategy trustStrategy, X509HostnameVerifier hostnameVerifier) {

    
try (InputStream inputStream = new FileInputStream("KeyStore文件路径")) {

        SSLContext sslcontext;
        SSLConnectionSocketFactory sslsf;

        KeyStore keystoreKey = KeyStore.getInstance(
"JKS");
        keystoreKey.load(inputStream, 
"密钥库密码".toCharArray());

        sslcontext = SSLContexts
                .custom()
                .loadTrustMaterial(trustStore, trustStrategy)
                .loadKeyMaterial(keystoreKey, 
"密钥密码".toCharArray())
                .build();

        sslsf = 
new SSLConnectionSocketFactory(
                sslcontext,
                supportedProtocols,
                supportedCipherSuites,
                hostnameVerifier);

        
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
    } 
catch (Exception e) {
        
logger.error("genHttpsClient error: ", e);
        
return null;
    }
}

1.5.2  使用SSLSocket或HttpsURLConnection

当使用SSLSocket或HttpsURLConnection时,均需要生成SSLSocketFactory,示例代码如下:

public SSLSocketFactory genSSLSocketFactory(String protocol) {

    try (InputStream inputStream = new FileInputStream("KeyStore文件路径")) {

  

        SSLContext context = SSLContext.getInstance(protocol);

  

        KeyStore keystore = KeyStore.getInstance("JKS");

        keystore.load(inputStream, "密钥库密码".toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");

        kmf.init(keystore, "密钥密码".toCharArray());

  

        context.init(new KeyManager[]{kmf.getKeyManagers()[0]}, null, new SecureRandom());

        return context.getSocketFactory();

    } catch (Exception e) {

        logger.error("genSSLSocketFactory error: ", e);

        return null;

    }

}

当使用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互联及登录咨询),描述问题现象后,对方帮忙找到相应同事解决,反馈原因是因为应用信息未同步。

以上问题为对测试应用进行测试时出现,若生产应用上线时也出现类似问题,需要再联系对方进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值