package wx.wechat.service;
/**
* Created by apple on 16/6/7.
*/
import com.alibaba.fastjson.JSONObject;
import com.squareup.okhttp.*;
import lombok.SneakyThrows;
import wx.wechat.common.signature.Signature;
import wx.wechat.utils.XMLUtils;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @function 封装一些常用的方法
*/
public class WXService {
public final String API_WEIXIN_HOST = "api.weixin.qq.com";
private final OkHttpClient client = new OkHttpClient();
private static final MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse("text/xml; charset=utf-8");
/**
* @param host
* @param path
* @param params 参数对,必须是双数
* @return
*/
@SneakyThrows
protected Map<String, String> getWithParams(String host, String path, Map<String, String> params) {
//预设的返回的数据集
Map<String, String> result = new HashMap<>();
//构建请求路径
HttpUrl.Builder httpUrlBuilder = new HttpUrl.Builder()
.scheme("https")
.host(host);
//将Path重新解构依次赋值给URL
Arrays.stream(path.split("/")).forEach(s -> {
httpUrlBuilder.addPathSegment(s);
});
//添加查询参数
params.forEach((k, v) -> {
httpUrlBuilder.addEncodedQueryParameter(k, v);
});
//构建请求
Request request = new Request.Builder()
.url(httpUrlBuilder.build())
.get()
.build();
// System.out.println(request);
//发起请求
Response response = client.newCall(request).execute();
//解析获取的数据并且返回Map
JSONObject.parseObject(response.body().string()).forEach((k, v) -> {
result.put(k, String.valueOf(v));
});
return result;
}
/**
* @param url 待请求的URL的地址
* @param requestData 请求的数据
* @return
* @function 根据输入的数据向URL发起请求, 并且进行自动的签名
*/
@SneakyThrows
protected Map<String, Object> postByXML(String url, Map requestData) {
//首先获取签名,注意,这里的签名用的是微信支付的签名
String signature = Signature.getSign4Pay(requestData);
//签名添加到请求数据中
requestData.put("sign", signature);
//封装成XML数据
String requestXML = XMLUtils.convertToXML(requestData);
//调用okHttp发起请求
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, requestXML))
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return XMLUtils.XML2Map(response.body().string());
}
}