1. 程式人生 > >Java實現的蘋果IAP二次驗證主要邏輯

Java實現的蘋果IAP二次驗證主要邏輯

蘋果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();
        }
        
    }

相關推薦

Java實現蘋果IAP驗證主要邏輯

蘋果IAP二次驗證流程為:一:客戶端(iphone or ipad)向Apple SERVER傳送購買請求 二:AppleSERVER返回購買成功的receipt(IAP在購買流程中,會給每一次購買行為建立一個SKPaymentTransaction,這個transacti

java實現解一元n多項式()

package commonAlgorithm; public class PolynomialSoluter { private double[][] matrix; private double[] result; private

IOS內購伺服器驗證 JAVA

String itunes_request = ""; itunes_request = Https.sendPost("https://buy.itunes.apple.com/verifyReceipt", "{\"receipt-data\":\"" + app_r

PHP處理蘋果APP內購後到服務端的驗證(專案經驗)

一、蘋果APP支付到服務端驗證流程1. 使用者在app中點選購買;2. app呼叫服務端介面生成訂單;3. app獲取到服務端訂單生成成功後彈出支付視窗;4. 使用者輸入密碼支付;5. app接收支付後apple應用商店返回的支付憑證;6. app將支付憑證傳回伺服器,呼叫伺

Unity內IAP支付驗證/伺服器驗證————最白話,手把手教你做系列。

之前的一篇寫了Unity支付的IAP支付接入。 後來就出現了一些問題,資料統計的時候出現大量購買訂單。但是實際上賬戶的錢卻沒有增加。@¥……&¥……*@¥&@初步判定可能存在部分使用者通過其他渠道刷單的現象,然後才有以下操作,驗證使用者的訂單是

數據結構之中序遍歷轉興許遍歷(JAVA實現)(

百度 empty 表達 pty 中序 tor opera lin sem 算法流程: 主要分為四步: 1.當前字符為數字或者字母,則直接輸出 2.當前字符為)。則在棧中匹配輸出。一直匹配到),則停止輸出(就是將)及其

spring-eureka 源碼解讀----作為集群的eureka怎麽樣實現不做傳播

rem spa time pri sre str 二次 boolean word 在平時工作中,eureka作為一個集群時候,我們會配置多個peer ,假設當前有服務器eureka-A,eureka-B,eureka-C。 如果Eureka A的peer指向了B, B的pe

使用Google身份驗證進行ssh驗證

Google身份驗證什麽是谷歌身份驗證器谷歌身份驗證器,即Google Authenticator(Google身份驗證器)v2.33 谷歌推出的一款動態口令工具,解決大家的google賬戶遭到惡意攻擊的問題。特點1、透過QR圖碼自動設定2、支持多個賬戶3、支援多種語言開始動手1、編輯/etc/selinux

如何在火幣網綁定谷歌驗證

如果 -a 生成 輸入 href 忘記 方法 註意 二次 1.IOS用戶和安卓用戶都可以使用微信小程序,安卓手機也可以添加到桌面上。 IOS使用方法,打開微信點擊“發現”—“小程序” 如圖: 安卓使用方法一,打開微信點擊“發現”—“小程序” 如圖:

gmail驗證碼具有哪些方面的優勢

多數人肯定對驗證碼還是非常熟悉的,日常我們都是直接使用到手機驗證碼,這樣所有的賬戶繫結手機即可,我們需要登入的時候也要更加簡單一些。不過很多朋友還是會使用到gmail二次驗證碼,其實這樣的驗證碼也已經存在了很長的時間,確實其實用性還是非常強的,而且現在也是越來越受歡迎。那麼為什麼其受歡迎程度如此之高?這類二次

如何在火幣網繫結谷歌驗證

1.IOS使用者和安卓使用者都可以使用微信小程式,安卓手機也可以新增到桌面上。 IOS使用方法,開啟微信點選“發現”—“小程式” 如圖:     安卓使用方法一,開啟微信點選“發現”—“小程式” 如圖:

驗證碼在微信中是如何進行使用的

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px "Helvetica Neue" } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; f

JAVA實現QRCode的維碼生成以及列印(轉)

不說廢話了直接上程式碼 注意使用QRCode是需要zxing的核心jar包,這裡給大家提供下載地址 https://download.csdn.net/download/dsn727455218/10515340 下載 1.二維碼的工具類   public class QR_Cod

java實現的一些叉樹演算法

二叉堆 == 完全二叉樹 二叉堆滿足二個特性: 1.父結點的鍵值總是大於或等於(小於或等於)任何一個子節點的鍵值。 2.每個結點的左子樹和右子樹都是一個二叉堆(都是最大堆或最小堆)。 當父結點的鍵值總是大於或等於任何一個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何一個

取消google驗證碼要怎麼進行處理

我們之所以設定好Google的二次驗證碼,都是為了能夠保證安全性,但是也有一些朋友覺的操作太麻煩,不想用了,所以大家肯定也想要知道取消google二次驗證碼小程式的方法。本身這樣的驗證碼都是為了保護好賬戶,所以取消肯定也是要按照一定的流程來完成。下面就來簡單為大家介紹一下具體

Java實現表單登陸及驗證

Java實現登陸及驗證 前端程式碼 前端程式碼只是一個表單隨意就好具體樣式看個人愛好 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"&

[連載]《C#通訊(串列埠和網路)框架的設計與實現》- 12.開發及應用

目       錄 第十二章     二次開發及應用... 2 12.1        專案配製... 3 12.2        引用相關元件... 4 12.3        構建主程式... 5 12.4        裝置驅動的開發... 6 12.4.1       假定通訊協議...

必須知道的八大種排序演算法【java實現】() 選擇排序,插入排序,希爾演算法【詳解】

一、選擇排序   1、基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。   2、例項   3、演算法實現    /** * 選擇排序演算法 * 在未

Java實現掃碼維碼下載app流程

1.先生成一個二維碼(二維碼裡面包含了下載的地址資訊,推薦用二維碼裡面包含是過濾器網站,安全),在草料網https://cli.im/ 進行生成,這裡我們生成網址 2.生成後就可以下載,然後放到你的網址上,供掃碼下載app(在跳轉過濾器中間設定識別ios跟Android等裝

java實現qq郵箱傳送註冊驗證

import javax.mail.*; import javax.mail.internet.MimeMessage;/** * * @param email 傳送郵箱驗證碼(註冊) * @return 驗證碼給前段 */ @RequestMapping(valu