项目是三四年前的老项目,之前有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;
}