支付寶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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM