Java实现的苹果IAP二次验证主要逻辑

来源:互联网 发布:js游戏引擎 编辑:程序博客网 时间:2024/05/16 09:50
苹果IAP二次验证流程为:

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


二:AppleSERVER返回购买成功的receipt(IAP在购买流程中,会给每一次购买行为创建一个SKPaymentTransaction,这个transaction会记录用户购买状态,如

     正在购买(SKPaymentTransactionStatePurchasing),

     已购买(SKPaymentTransactionStatePurchased),

     购买失败(SKPaymentTransactionStateFailed)

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


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

{
"receipt-data"
: "(编码后的数据)"

}


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

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

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



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

{
"status"
: 0, (验证状态码,0标识通过,21007 标识此数据为测试数据,需交由sandbox进行再次验证)

"receipt"
: {提交的数据解析为明文返回}

}

下面为具体代码实现方式,作为参考,各位如认为可用,欢迎使用:

/**
*
*@PackageName service   
*@FileName IapSecondaryVerifyService.java
*@Author Albert
*@Time 2014-4-28下午2:04:39
*@Description IAP二次验证
*/
@Service("iapSecondaryVerifyService")
public class IapSecondaryVerifyService {
    private final Logger LOGGER = Logger.getLogger(IapSecondaryVerifyService.class);
   
    Map verifyResultMap = new HashMap();
    String result = "";
    String returnresult="";
    String verifyStatus=null;
    //所有的验证都进入这个方法
    public synchronized Map getSecondaryVerify(String requestJson) throws Exception{
        
        if(requestJson != "" || requestJson !=null){
            URL dataUrl = new URL("https://buy.itunes.apple.com/verifyReceipt");
            HttpURLConnection con = (HttpURLConnection) dataUrl.openConnection();
            //设置请求头信息
            con.setRequestMethod("POST");
            con.setRequestProperty("content-type", "text/json");
            con.setRequestProperty("Proxy-Connection", "Keep-Alive");
            con.setDoOutput(true);
            con.setDoInput(true);
            OutputStreamWriter out =new OutputStreamWriter(con.getOutputStream());
            String str= String.format(Locale.CHINA,"{\"receipt-data\":\""+requestJson+"\"}");
            LOGGER.info(str);
              out.write(str);
              out.flush();
              out.close();
            InputStream is = con.getInputStream();
            BufferedReader reader=new BufferedReader(new InputStreamReader(is));
            String line = null;
            while((line = reader.readLine()) != null){
                result+= line+"\r\n";
            }
            org.json.JSONObject j;
            try{
                j = new org.json.JSONObject(result);
                returnresult = j.get("status").toString();
                if(returnresult.equals("0")){
                    verifyResultMap.put("verfyStatus", 0);
                    verifyResultMap.put("receipt", j.get("receipt"));
                }else if(returnresult.equals("21007")){
                    sandboxUrl(requestJson);
                }else if(returnresult.equals("21002")){
                    verifyResultMap.put("verfyStatus",-6L);
                    verifyResultMap.put("receipt", j.get("receipt"));
                }
                else{
                    verifyResultMap.put("verfyStatus", Long.valueOf(returnresult));
                    verifyResultMap.put("receipt", j.get("receipt"));
                }
            }catch(Exception e){
                LOGGER.info("接收返回类型:"+e.getMessage());
            }
        }
        return verifyResultMap;
    }
    public void sandboxUrl(String requestJson) {
        try {
            URL dataUrl = new URL("https://sandbox.itunes.apple.com/verifyReceipt");
            HttpURLConnection con = (HttpURLConnection) dataUrl.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("content-type", "text/json");
            con.setRequestProperty("Proxy-Connection", "Keep-Alive");
            //con.setRequestProperty("receipt-data", receipt);
            con.setDoOutput(true);
            con.setDoInput(true);
            OutputStreamWriter out =new OutputStreamWriter(con.getOutputStream());
            String str2= String.format(Locale.CHINA,"{\"receipt-data\":\""+requestJson+"\"}");
              out.write(str2);
              out.flush();
              out.close();
            InputStream is = con.getInputStream();
            BufferedReader reader=new BufferedReader(new InputStreamReader(is));
            String line = null;
            while((line = reader.readLine()) != null){
                result+= line+"\r\n";
            }
            org.json.JSONObject j;
            j = new org.json.JSONObject(result);
            returnresult = j.get("status").toString();
            if(returnresult.equals("0")){
                verifyResultMap.put("verfyStatus", 0);
                verifyResultMap.put("receipt", j.get("receipt"));
            }else{
                verifyResultMap.put("verfyStatus", Long.valueOf(returnresult));
                verifyResultMap.put("receipt", null);
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
0 0
原创粉丝点击