微信支付微信统一下单【签名错误】

由于在代码中,需要将实体,转换成统一下单需要的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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值