由于在代码中,需要将实体,转换成统一下单需要的xml格式。所以自己写了实体映射,以及相应的转换方法进行转换。
实体代码
@Data
@XStreamAlias("xml")
public class UnifiedOrderParams {
@XStreamAlias("appid")
private String appid;
@XStreamAlias("mch_id")
private String mchId;
@XStreamAlias("device_info")
private String deviceInfo;
@XStreamAlias("nonce_str")
private String nonceStr;
@XStreamAlias("sign")
private String sign;
@XStreamAlias("sign_type")
private String signType;
@XStreamAlias("body")
private String body;
@XStreamAlias("detail")
private String detail;
@XStreamAlias("attach")
private String attach;
@XStreamAlias("out_trade_no")
private String outTradeNo;
@XStreamAlias("fee_type")
private String feeType;
@XStreamAlias("total_fee")
private Integer totalFee;
@XStreamAlias("spbill_create_ip")
private String spbillCreateIp;
@XStreamAlias("time_start")
private String timeStart;
@XStreamAlias("time_expire")
private String timeExpire;
@XStreamAlias("goods_tag")
private String goodsTag;
@XStreamAlias("notify_url")
private String notifyUrl;
@XStreamAlias("trade_type")
private String tradeType;
@XStreamAlias("product_id")
private String productId;
@XStreamAlias("limit_pay")
private String limitPay;
@XStreamAlias("openid")
private String openid;
@XStreamAlias("receipt")
private String receipt;
@XStreamAlias("profit_sharing")
private String profitSharing;
}
转换方法代码:
/**
* @param obj 实体类
* @return 实体类转XML字符串
*/
public static String toXml(Object obj) {
XStream xStream = new XStream(new DomDriver());
// 扫描@XStream注解
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj).replaceAll("\\_+", "_");//正则过滤双下划线转为单下划线
}
由于改方法,最后后续进行了replaceAll方法。
至于为什么要用这个方法进行操作,原因如下:
生成的xml内容如下
<xml>
<appid>AAA</appid>
<mch__id>AAA</mch__id>
<nonce_str>AAA</nonce__str>
<sign>AAA</sign>
<sign__type>MD5</sign__type>
<body>WM(AAA)</body>
<detail>AAA</detail>
<out__trade__no>AAA</out__trade__no>
<total__fee>AAA</total__fee>
<spbill__create__ip>127.0.0.1</spbill__create__ip>
<time__start>AAA</time_start>
<time__expire>AAA</time_expire>
<notify__url>AAA</notify__url>
<trade__type>JSAPI</trade__type>
<openid>AAA</openid>
</xml>
每个节点都会有两个下划线"__"。所以用该方法进行强制转换。
问题也就在这边,前期生成微信订单加密sign时,如果碰到了其他内容里面存在"__"的情况。例如open_id这种后台自动生成的。生成sign的时候,用的原始数据。后续生成xml的时候,也会同步替换。导致提交后签名不匹配。
故将xml转换方法修改如下
/**
* @param obj 实体类
* @return 实体类转XML字符串
*/
public static String toXml(Object obj) {
XStream xStream = new XStream(new Xpp3Driver(new NoNameCoder()));
// 扫描@XStream注解
xStream.processAnnotations(obj.getClass());
return xStream.toXML(obj);//正则过滤双下划线转为单下划线
}
生成的xml格式如下
<xml>
<appid>AAA</appid>
<mch_id>AAA</mch_id>
<nonce_str>AAA</nonce_str>
<sign>AAA</sign>
<sign_type>AAA</sign_type>
<body>AAA</body>
<detail>AAA</detail>
<out_trade_no>AAA</out_trade_no>
<total_fee>AAA</total_fee>
<spbill_create_ip>127.0.0.1</spbill_create_ip>
<time_start>AAA</time_start>
<time_expire>AAA</time_expire>
<notify_url>AAA</notify_url>
<trade_type>AAA</trade_type>
<openid>AAA</openid>
</xml>