一、创建参数对象
//OrderWechat 参数的实体类
OrderWechat ow = new OrderWechat();
ow.setAppid(appid); // 公众账号ID
ow.setMch_id(mch_id); // 商户号
ow.setOut_trade_no(out_request_no); // 商户订单号
ow.setTransaction_id(trade_no);// 微信支付返回的订单号 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*@ ,且在同一个商户号下唯一。
ow.setCustoms(customs); //海关申报是的代码
ow.setMch_customs_no("" + merchant_co_code);//商户代码 商户在海关登记的备案号,customs非NO,此参数必填
//备案必填
ow.setCert_type(cardType);//证件类型 请传固定值IDCARD,暂只支持大陆身份证。
ow.setCert_id("" + cardId);//身份证号 用户大陆身份证号,尾号为字母X的身份证号,请大写字母X。
ow.setName("" + name);//姓名
//封装签名字段
SortedMap<Object, Object> params = new TreeMap<Object, Object>();
params.put("appid", appid);
params.put("mch_id", mch_id);
params.put("out_trade_no", out_request_no);
params.put("transaction_id", trade_no);
params.put("customs", customs);
params.put("mch_customs_no", "" + merchant_co_code);
params.put("cert_type", cardType);
params.put("cert_id", "" + cardId);
params.put("name", "" + name);
// 得到签名 生成支付签名,这个签名 给 微信支付的调用使用
String sign = Sign.createSign("utf-8", params, key);
ow.setSign(sign); //签名
二、微信签名方法:
//characterEncoding:编码格式 parameters:签名字段 key:微信提供的 用于加签的密钥
public static String createSign(String characterEncoding, SortedMap<Object, Object> parameters, String key) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();// 所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + key);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
三、将对象转换为微信接收格式XML (XML转为对象)
// object to XML. XStream 这个类需要 依赖xmlpull_1_0_5.jar
public static String object2Xml(Object ro, Class<?> type) throws Exception {
if (null == ro) {
return null;
}
XStream xstream = xstreams.get(type.getName());
if (xstream == null) {
xstream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
xstreams.put(type.getName(), xstream);
}
xstream.alias("xml", type);
return xstream.toXML(ro);
}
//XML to object
public static <T> T xml2Object(String inputXml, Class<T> type) throws Exception {
if (null == inputXml || "".equals(inputXml))
return null;
XStream xstream = xstreams.get(type.getName());
if (xstream == null) {
xstream = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));
xstreams.put(type.getName(), xstream);
}
xstream.alias("xml", type);
return (T) xstream.fromXML(inputXml);
}
四、封装请求接口
String url="https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder";
try{
// Object转换为XML
String xml = XmlUtil.object2Xml(ow, OrderWechat.class);
//请求 微信清关接口 returnXml 返回结果
String returnXml = HttpUtil.sendPost(url, xml);
// XML转换为Object
OrderWechatDeclareResult owr = (OrderWechatDeclareResult) XmlUtil.xml2Object(returnXml,
OrderWechatDeclareResult.class);
}catch (Exception e) {
System.out.println("微信自助清关异常");
}