您的位置:首页 > 编程语言 > Java开发

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

2016-06-13 14:30 816 查看


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

  
Albert_CaiCai





初来乍到



串个门

加好友

打招呼

发消息
电梯直达


楼主


 发表于
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代码 

{

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

}

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

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

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

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

JavaScript代码 

{

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

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

}

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

Java代码 

/**

*

*@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();

    }

    

  }

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: