微信支付--付款到零钱(java后端)

付款到零钱

  • 导入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,处理自身业务。

你可能感兴趣的:(java,java,付款)