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