使用Java实现的苹果IAP二次验证主要逻辑过程及原创代码

使用Java实现的苹果IAP二次验证主要逻辑过程及原创代码 [复制链接]

   
Albert_CaiCai
使用Java实现的苹果IAP二次验证主要逻辑过程及原创代码_第1张图片

初来乍到

Rank: 1

  • 串个门
  • 加好友
  • 打招呼
  • 发消息
电梯直达
楼主
  发表于 2014-7-4 00:07:23  | 只看该作者  | 倒序浏览
本帖最后由 Albert_CaiCai 于 2014-7-4 00:07 编辑

苹果IAP二次验证流程为:

一:客户端(iphone or ipad)向Apple SERVER发送购买请求


二:AppleSERVER返回购买成功的receipt(IAP在购买流程中,会给每一次购买行为创建一个SKPaymentTransaction.

       这个transaction会记录用户购买状态,其中transaction_id具有唯一性,transaction标识状态如

              正在购买(SKPaymentTransactionStatePurchasing)

              已购买(SKPaymentTransactionStatePurchased)

              购买失败(SKPaymentTransactionStateFailed)

              而当transaction状态是SKPaymentTransactionStatePurchased(已购买)的时候,客户端就能得到一个transaction.transactionReceipt

              重点:此状态需要注意,进行IAP验证时,需要获取此回发信息用于第三方二次验证。


三、当客户端购买状态结束,收到经由苹果回发的Receipt是,获取客户端Receipt,经第三方平台进行二次验证,此时苹果服务器需要的数据格式为JSON,具体包含字段,由程序自行规定:例如:
           quantity(数量)
           product_id(物品ID)
           transaction_id(交易标识,此字段可做全局标识,唯一)
           purchase_date(交易日期)
           数据转换为Json编码格式,键名为"receipt-data",值为上一步编码后的数据。具体格式为:
JavaScript代码 
  1. {
  2. "receipt-data""(编码后的数据)"
  3. }

四、将此Json 经HTTPS POST的请求,将数据发送到App Store,其地址为:

    https://buy.itunes.apple.com/verifyReceipt (正式购买地址)

    https://sandbox.itunes.apple.com/verifyReceipt (测试数据地址)



五、App Store的返回值也是一个JSON格式的对象,包含两个键值对, status和receipt:


JavaScript代码 
  1. {
  2. "status": 0,(验证状态码,0标识通过,21007 标识此数据为测试数据,需交由sandbox进行再次验证)
  3. "receipt": {提交的数据解析为明文返回}
  4. }
下面为具体代码实现方式,作为参考,各位如认为可用,欢迎使用:

Java代码 
  1. /**
  2. *
  3. *@PackageName service  
  4. *@FileName IapSecondaryVerifyService.java
  5. *@Author Albert
  6. *@Time 2014-4-28下午2:04:39
  7. *@Description IAP二次验证
  8. */
  9. @Service("iapSecondaryVerifyService")
  10. public class IapSecondaryVerifyService {
  11.   private final Logger LOGGER = Logger.getLogger(IapSecondaryVerifyService.class);
  12.   
  13.   Map verifyResultMap = new HashMap();
  14.   String result = "";
  15.   String returnresult="";
  16.   String verifyStatus=null;
  17.   //所有的验证都进入这个方法
  18.   public synchronized Map getSecondaryVerify(String requestJson) throws Exception{
  19.     
  20.     if(requestJson != "" || requestJson !=null){
  21.     URL dataUrl = new URL("https://buy.itunes.apple.com/verifyReceipt");
  22.     HttpURLConnection con = (HttpURLConnection) dataUrl.openConnection();
  23.     //设置请求头信息
  24.     con.setRequestMethod("POST");
  25.     con.setRequestProperty("content-type""text/json");
  26.     con.setRequestProperty("Proxy-Connection""Keep-Alive");
  27.     con.setDoOutput(true);
  28.     con.setDoInput(true);
  29.     OutputStreamWriter out =new OutputStreamWriter(con.getOutputStream());
  30.     String str= String.format(Locale.CHINA,"{\"receipt-data\":\""+requestJson+"\"}");
  31.     LOGGER.info(str);
  32.       out.write(str);
  33.       out.flush();
  34.       out.close();
  35.     InputStream is = con.getInputStream();
  36.     BufferedReader reader=new BufferedReader(new InputStreamReader(is));
  37.     String line = null;
  38.     while((line = reader.readLine()) != null){
  39.       result+= line+"\r\n";
  40.     }
  41.     org.json.JSONObject j;
  42.     try{
  43.       j = new org.json.JSONObject(result);
  44.       returnresult = j.get("status").toString();
  45.       if(returnresult.equals("0")){
  46.         verifyResultMap.put("verfyStatus"0);
  47.         verifyResultMap.put("receipt", j.get("receipt"));
  48.       }else if(returnresult.equals("21007")){
  49.         sandboxUrl(requestJson);
  50.       }else if(returnresult.equals("21002")){
  51.         verifyResultMap.put("verfyStatus",-6L);
  52.         verifyResultMap.put("receipt", j.get("receipt"));
  53.       }
  54.       else{
  55.         verifyResultMap.put("verfyStatus", Long.valueOf(returnresult));
  56.         verifyResultMap.put("receipt", j.get("receipt"));
  57.       }
  58.     }catch(Exception e){
  59.       LOGGER.info("接收返回类型:"+e.getMessage());
  60.     }
  61.     }
  62.     return verifyResultMap;
  63.   }
  64.   public void sandboxUrl(String requestJson) {
  65.     try {
  66.     URL dataUrl = new URL("https://sandbox.itunes.apple.com/verifyReceipt");
  67.     HttpURLConnection con = (HttpURLConnection) dataUrl.openConnection();
  68.     con.setRequestMethod("POST");
  69.     con.setRequestProperty("content-type""text/json");
  70.     con.setRequestProperty("Proxy-Connection""Keep-Alive");
  71.     //con.setRequestProperty("receipt-data", receipt);
  72.     con.setDoOutput(true);
  73.     con.setDoInput(true);
  74.     OutputStreamWriter out =new OutputStreamWriter(con.getOutputStream());
  75.     String str2= String.format(Locale.CHINA,"{\"receipt-data\":\""+requestJson+"\"}");
  76.       out.write(str2);
  77.       out.flush();
  78.       out.close();
  79.     InputStream is = con.getInputStream();
  80.     BufferedReader reader=new BufferedReader(new InputStreamReader(is));
  81.     String line = null;
  82.     while((line = reader.readLine()) != null){
  83.       result+= line+"\r\n";
  84.     }
  85.     org.json.JSONObject j;
  86.     j = new org.json.JSONObject(result);
  87.     returnresult = j.get("status").toString();
  88.     if(returnresult.equals("0")){
  89.       verifyResultMap.put("verfyStatus"0);
  90.       verifyResultMap.put("receipt", j.get("receipt"));
  91.     }else{
  92.       verifyResultMap.put("verfyStatus", Long.valueOf(returnresult));
  93.       verifyResultMap.put("receipt"null);
  94.     }
  95.     } catch (MalformedURLException e) {
  96.     // TODO Auto-generated catch block
  97.     e.printStackTrace();
  98.     } catch (IOException e) {
  99.     // TODO Auto-generated catch block
  100.     e.printStackTrace();
  101.     } catch (JSONException e) {
  102.     // TODO Auto-generated catch block
  103.     e.printStackTrace();
  104.     }
  105.     
  106.   }

你可能感兴趣的:(使用Java实现的苹果IAP二次验证主要逻辑过程及原创代码)