付款到零钱
- 导入jar
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
- 证书
1、在商户平台申请及配置证书;
2、将下载的证书解压到服务器上;
public class AppletConfig implements WXPayConfig {
public static final String APPLET_APP_ID = "app_id";
public static final String APPLET_KEY = "key";
public static final String APPLET_MCH_ID = "商户号";
public static final String APPLET_SECRET = "秘钥";
private byte[] certData;
@Override
public String getAppID() {
return APPLET_APP_ID;
}
@Override
public String getMchID() {
return APPLET_MCH_ID;
}
@Override
public String getKey() {
return APPLET_KEY;
}
//获取证书
@Override
public InputStream getCertStream() {
String certPath = "证书路径"; //路径指向apiclient_cert.p12文件
File file = new File(certPath);
InputStream certStream = null;
try {
certStream = new FileInputStream(file);
this.certData = new byte[(int) file.length()];
certStream.read(this.certData);
certStream.close();
} catch (IOException e) {
e.printStackTrace();
}
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
@Override
public int getHttpConnectTimeoutMs() {
return 8000;
}
@Override
public int getHttpReadTimeoutMs() {
return 10000;
}
}
- 官方文档地址
付款到零钱
1、将所需参数进行封装;
2、进行签名(签名方式见上篇);
3、通过WXPayUtil.mapToXml(params)
将参数转成xml;
4、付款到零钱发送请求需要携带证书
;
携带证书需要密码,密码默认为商户号
public String getRestInstance(String url, String data) throws Exception {
AppletConfig appletConfig = new AppletConfig();
char[] password = appletConfig.getMchID().toCharArray();//证书密码
InputStream certStream = appletConfig.getCertStream();//获取证书的流
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(certStream, password);
// 实例化密钥库 & 初始化密钥工厂
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, password);
// 创建 SSLContext
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, new SecureRandom());
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(
sslContext,
new String[]{"TLSv1"},
null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
BasicHttpClientConnectionManager connManager = new BasicHttpClientConnectionManager(
RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslConnectionSocketFactory)
.build(),
null,
null,
null
);
HttpClient httpClient = HttpClientBuilder.create().setConnectionManager(connManager).build();
HttpPost httpPost = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(10000).setConnectTimeout(8000).build();
httpPost.setConfig(requestConfig);
StringEntity postEntity = new StringEntity(data, "UTF-8");
httpPost.addHeader("Content-Type", "text/xml");
httpPost.addHeader("User-Agent", "This is transfers ");
httpPost.setEntity(postEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
return EntityUtils.toString(httpEntity, "UTF-8");
}
5、接受返回参数,将xml转成map,处理自身业务。