微信支付 带apiclient_cert.p12证书的请求方法 JAVA版

以下是带apiclient_cert.p12证书的请求方法

package utils.wechat;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

/**
 * 获取微信apiclient_cert.p12证书
 *
 * @author zengwei
 * @email [email protected]
 * @date 2018年4月5日 下午4:49:36
 */
@SuppressWarnings("deprecation")
public class CertHttpUtil {

    private static int socketTimeout = 10000;// 连接超时时间,默认10秒
    private static int connectTimeout = 30000;// 传输超时时间,默认30秒
    private static RequestConfig requestConfig;// 请求器的配置
    private static CloseableHttpClient httpClient;// HTTP请求器

    /**
     * 通过Https往API post xml数据
     *
     * @param url API地址
     * @param xmlObj 要提交的XML数据对象
    * @param mchId 商户ID
    * @param certPath 证书位置
     * @return
     */
    public static String postData(String url, String xmlObj, String mchId, String certPath) {
        // 加载证书
        try {
            initCert(mchId, certPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        String result = null;
        HttpPost httpPost = new HttpPost(url);
        // 得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别
        StringEntity postEntity = new StringEntity(xmlObj, "UTF-8");
        httpPost.addHeader("Content-Type", "text/xml");
        httpPost.setEntity(postEntity);
        // 根据默认超时限制初始化requestConfig
        requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
        // 设置请求器的配置
        httpPost.setConfig(requestConfig);
        try {
            HttpResponse response = null;
            try {
                response = httpClient.execute(httpPost);
            } catch (IOException e) {
                e.printStackTrace();
            }
            HttpEntity entity = response.getEntity();
            try {
                result = EntityUtils.toString(entity, "UTF-8");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } finally {
            httpPost.abort();
        }
        return result;
    }

    /**
     * 加载证书
     *
     * @param mchId 商户ID
     * @param certPath 证书位置
     * @throws Exception
     */
    private static void initCert(String mchId, String certPath) throws Exception {
        // 证书密码,默认为商户ID
        String key = mchId;
        // 证书的路径
        String path = certPath;
        // 指定读取证书格式为PKCS12
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        // 读取本机存放的PKCS12证书文件
        FileInputStream instream = new FileInputStream(new File(path));
        try {
            // 指定PKCS12的密码(商户ID)
            keyStore.load(instream, key.toCharArray());
        } finally {
            instream.close();
        }
        SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
        SSLConnectionSocketFactory sslsf =
                new SSLConnectionSocketFactory(sslcontext, new String[] {"TLSv1"}, null,
                        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
        httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
    }
}

  

原文地址:https://www.cnblogs.com/zengweiB208/p/9025545.html

时间: 2024-10-13 15:12:56

微信支付 带apiclient_cert.p12证书的请求方法 JAVA版的相关文章

微信公众号红包接口开发PHP开发 CA证书出错,请登陆微信支付商户平台下载证书

微信红包接口调试过程中一直提示“CA证书出错,请登陆微信支付商户平台下载证书”,经反复调试,大致解决方法如下: 1.首先确保CA证书的路径是否正确,一定得是绝对路径,因为是PHP开发的,这里需要三个pem证书 2.确保服务器支持,新浪云的sae,经测试支持不是很好,一直报错,换用其他服务器后,一次通过 POST红包证书的代码部分如下: function post( $strXml) { $url='https://api.mch.weixin.qq.com/mmpaymkttransfers/s

解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)

这几天用到了微信企业付款到零钱这个接口,结果出现了报错:CA_ERROR, 该接口的API说明和报错提示说明:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 通过看提示知道原因大概在:请求没带商户API证书或带了错误的商户API证书. 然后我自己查看了我发post请求的地方,汗,果不其然,有个控制是否携带API证书的地方我设置了不携带false. 修改为ture,然后检查下证书路径,测试OK. 原文地址:

微信支付返回-1的问题和解决方法

今天为app新添加了一个微信支付功能,总是会返回-1,然后到处找问题,问朋友,最终解决了. 我的问题就是签名的问题: 我用的微信的签名工具,获取的签名,和可keystore的签名不一致,把微信的应用签名改过来即可. 其实这里遇到一个小问题,我一直想不通,我的签名不一致,但有时也可以支付成功一次,然也就一次. 总结一下查看keystore的信息的方法(网上也有很多): 我已经配置好了keytool,如果没有配置好的话,就到jdk的bin目录下运行这个程序,bin目录下有keytool.exe 这个

关于IOS调用微信支付jsapi不起作用的解决方法

微信支付时,安卓机调用 jsapi可以支付,IOS就不行,点击立即支付,直接返回原立即支付页面,跟刷新页面差不多,解决方案很简单:两句话而已. 不得不说,微信支付坑太多了,我擦..... <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <asp:Button ID="btnSubmit" runat="server" Text

微信支付接口返回“签名错误”的排查方法

1.确认公众号的appSecret和商户号的API密钥没有搞混. 2.重置商户API密钥.(本人亲测是这样解决了问题,tx真是个坑,我严重鄙视.) 3.确认公众号授权的域名和目录是正确的. 4.参数body含有中文字符,改换英文签名成功,那么就转换字符编码试试. $dat = iconv('UTF-8','ISO8859-1',array2xml($package)); 5.血的教训,以上都试过之后,再仔细对比参数,确认签名算法没有问题,可以使用官网的调试工具验证自己的签名是否正确. https

微信支付(公众号支付接入方式)

首先准备几个工具类:HttpRequest请求工具类,MD5加密工具类,随机数生成工具类,签名生成工具类,xml格式转换类 package net.tiantianup.wap.utils.weixinpay; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.config.RequestConfig; import org.apache.ht

微信APP支付服务端开发Java版(一)

一.准备工作 去微信开发者中心下载(扫码支付,里面的大部分代码是可以用的) https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11_1 选择UTF-8的版本copy到你的项目里面 找到Configure.java的类修改成public static String PAY_API = "https://api.mch.weixin.qq.com/pay/unifiedorder"; 下面正式进入代码部分 1 //初始化

微信公众号可通过现金红包接口发放微信支付现金红包(附开发教程)

农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守.昨日,微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.微信公众号也可以发放现金红包了! 通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果. 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领

微信支付现金红包接口

微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果.具体能力如下: 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验 微信红包发送规则 1. 发送频率规则 ◆ 每分钟发送红包数量不得超过1800个: ◆