項目是三四年前的老項目,之前有IOS內購二次驗證的接口,貌似很久都沒用了,然而最近IOS的妹子說接口用不了,讓我看看啥問題。接口流程時很簡單的,就是前端IOS在購買成功之后,接收到receipt后進行了base64加密,然后傳到我們服務端進行二次驗證,確認用戶是否購買成功,確認成功后創建自己的訂單。然而就是這么簡單的轉發校驗過程,居然一直返回state="21002",網上查了下資料說是"receipt-data域的數據有問題",於是我就和妹子說你傳給我的數據不對。好吧,居然數據不對,妹子就在那仔細的檢查哪出問題了,最后base64加密算法都換了,還是返回21002。最后妹子得出一個結論,就是你后台代碼有問題,然后就一直質疑我你會不會哪里寫錯了,是不是你json封裝有問題啊,你就重新寫一個啊。。。就這樣,json封裝方式換了好幾種,receipt拿到后台來進行base64轉換,試了N多方法,盯着短短的幾十行代碼看了無數次,最后還是返回21002。妹子就一直在哪吐槽就是你這里出錯了,你會不會啊!!你看網上人家是這樣這樣寫的,你參考下啊!!!我勒個去,網上代碼和我這有啥區別,能參考的方案都參考了,就這樣一遍頂着妹子鄙視智商的質疑,一邊默默地思考和無力的反駁着(就是你傳給我的數據有問題)。然后激烈的討論聲音有點大了,這時驚動了在后邊的主管,於是發個消息給我,會不會是IOS返回的receip有問題,之前也遇到過IOS傳輸數據時把“+”變成了空格。這時我仿佛握住了一根救命草,趕緊操作試試
String newReceipt = receipt.replace(" ", "+");
哇,終於驗證成功了。。。就這么簡簡單單的一行代碼拯救了我的智商,此時心中那個高興啊,差點就喜極而泣了。ε=(´ο`*)))唉!這個神坑吖!
附上代碼吧
public static String buyAppVerify(String receipt, String environment) { String url = null; if(environment.equals("0")) { url = url_verify; // 生產環境 } if (environment.equals("1")) { url = url_sandbox; // 沙盒測試 } try { SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom()); URL console = new URL(url); HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); conn.setSSLSocketFactory(sc.getSocketFactory()); conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-type", "application/json"); conn.setDoInput(true); conn.setDoOutput(true); BufferedOutputStream hurlBufOus = new BufferedOutputStream( conn.getOutputStream()); String newReceipt = receipt.replace(" ", "+"); String str = String.format("{\"receipt-data\":\"" + newReceipt + "\"}"); hurlBufOus.write(str.getBytes()); hurlBufOus.flush(); InputStream is = conn.getInputStream(); BufferedReader reader = new BufferedReader( new InputStreamReader(is)); String line = null; StringBuffer sb = new StringBuffer(); while ((line = reader.readLine()) != null) { sb.append(line); } return sb.toString(); } catch (Exception ex) { ex.printStackTrace(); } return null; }