第一句,微信支付sdk非常的狗血,那么大的公司,sdk竟然没什么人维护,支付宝甩他几十条街。神奇的sdk接入操作,必须要自己写一个特定wxapi命名包在代码根目录,对不起,我是强迫症患者,看了就接受不了。
下面主要吐槽的是,每次优化代码或者重构项目的的时候,官网的例子工程,还是eclipse 工程,13年的货。这也就算了,支付流程第一步,统一下单的网络请求例子给的是httpclient 请求。谷歌都在Android里舍弃掉了httpclient ,它还没人改。
这个就算了,支付交互还是xml。真恶心。
下面贴出自己写的HttpsUrlConnection 替换掉获取预支付的代码,直接替换掉,官方例子里面给的httpPost()方法就行 了。不用再使用微信支付还得接入httpclient的apache包了。
URL url;
try {
HttpsURLConnection.setDefaultHostnameVerifier((arg0, arg1) -> true);
class HTTPSTrustManager implements X509TrustManager {
private final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] x509Certificates, String s)
{
}
@SuppressLint("TrustAllX509TrustManager")
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] x509Certificates, String s)
{
}
@SuppressLint("TrustAllX509TrustManager")
@Override
public X509Certificate[] getAcceptedIssuers() {
return _AcceptedIssuers;
}
}
SSLContext context = null;
TrustManager[] trustManagers= new TrustManager[] { new HTTPSTrustManager() };
try {
context = SSLContext.getInstance("TLS");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
HttpsURLConnection.setDefaultSSLSocketFactory(Objects.requireNonNull(context).getSocketFactory());
url = new URL(urlPath);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setConnectTimeout(50000);//5
conn.setReadTimeout(50000);
conn.setDoOutput(true);// 设置允许输出
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
conn.setRequestProperty("Charset", "UTF-8");
conn.setRequestProperty("Content-Type", "text/xml");
DataOutputStream out = new DataOutputStream(conn
.getOutputStream());
out.writeBytes(entity);
out.flush();
out.close();
/* 服务器返回的响应码 */
int code = conn.getResponseCode();
Log.i("https","code="+code);
if (code == 200) {
BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8.name()));
String retData ;
StringBuilder responseData = new StringBuilder();
while ((retData = in.readLine()) != null) {
responseData.append(retData);
}
in.close();
return responseData.toString().getBytes();
} else {
Log.i("https","return error");
return null;
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}