• 支付宝APP支付 订单已付款成功,请勿重复提交 和 微信H5支付 INVALID_REQUEST 201 商户订单号重复


    支付宝APP支付 返回请求给前端SDK 提示报错"订单已付款成功,请勿重复提交” 产生原因:存在商家订单号已经支付成功,重复再次请求的情况。
    每一笔的支付项目商家订单号是唯一的,如果存在同一支付项目多笔支付的情况,需要在原来的商家订单号尾部通过递增等自增长的方式来处理,避免重复。

    //扩展3位
    if(StringUtils.isNotBlank(sid) && sid.length() > 2) {
        String shortSn = sid.substring(sid.length()-3, sid.length());  //末位
        String newToSn = shortSn;//默认截取的最后2位
        Integer newSn = Integer.valueOf(shortSn);
        ++newSn; //递增1
        if(newSn < 100) {
            newToSn = "0"+String.valueOf(newSn);
        }else {
            newToSn = String.valueOf(newSn);
        }
        
        //重新构建
        transId = transId.substring(0, transId.length()-3) + newToSn;
    }

    微信H5支付 提示报错"INVALID_REQUEST 201 商户订单号重复"
    微信支付的商家订单号最大位数是32,支付宝是64位。可以参考微信或支付宝支付接入官方文档。
    超出32位的情况,需要将可变的部分截取-反转-在拼接-再截取32位,如果没有反转,可能会导致每次截图的是一样的商家订单号,导致报错。

    //截取
    logger.info("1.transId长度过长截取32位(微信)transId=[{}]",transId);
    //transId = transId.substring(0, 32);
    
    //以下为修改点:
    String lastString = transId.substring(24); //24位开始后的字符串
    StringBuilder sb = new StringBuilder(lastString);
    String lastStringHandler = sb.reverse().toString();  //反转字符串
    transId = transId.substring(0, 24).concat(lastStringHandler).substring(0,32);
    logger.info("2.transId长度过长截取32位(微信)transId=[{}]",transId);
  • 相关阅读:
    Tree
    a letter and a number
    A problem is easy
    connect设置超时的方法
    C++客户端访问Java服务端发布的SOAP模式的WebService接口
    gSoap的“error LNK2001: 无法解析的外部符号 _namespaces”解决方法
    先序序列和后序序列并不能唯一确定二叉树
    二叉树的非递归遍历
    web service,soap ,http,tcp,udp
    byte[]数组和int之间的转换
  • 原文地址:https://www.cnblogs.com/oktokeep/p/16038555.html
Copyright © 2020-2023  润新知