本帖最后由 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",值为上一步编码后的数据。具体格式为:
- {
- "receipt-data": "(编码后的数据)"
- }
四、将此Json 经HTTPS 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": {提交的数据解析为明文返回}
- }
下面为具体代码实现方式,作为参考,各位如认为可用,欢迎使用:
-
-
-
-
-
-
-
-
- @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.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) {
-
- e.printStackTrace();
- } catch (IOException e) {
-
- e.printStackTrace();
- } catch (JSONException e) {
-
- e.printStackTrace();
- }
-
- }
|