PHP處理蘋果APP內購後到服務端的二次驗證(項目經驗)

來源:互聯網
上載者:User
這篇文章介紹的內容是關於PHP項目整合端掃碼支付API(境內支付),有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

一、蘋果APP支付到服務端驗證流程

1. 使用者在app中點擊購買;

2. app調用服務端介面產生訂單

3. app擷取到服務端訂單產生成功後彈出支付視窗;

4. 使用者輸入密碼支付;

5. app接收支付後apple市集返回的支付憑證;

6. app將支付憑證傳回伺服器,調用伺服器介面驗證憑證是否有效;

7. app擷取伺服器端的驗證結果,反饋使用者支付結果狀態。

說明:蘋果支付的商品,需要先在 itunes Connect 中配置APP內購項目,配置後對應會產生一個商品ID,在蘋果APP端調用蘋果支付時,就需要給蘋果商店傳送這個商品ID(product_id)參數。然後支付過程是在蘋果商店中進行,支付完成後,返回一個支付憑證給APP,表示支付完成,但一般會再次調用自己的伺服器(商家伺服器)端進行支付驗證,這時候在伺服器寫個驗證介面,判斷憑證是否有效,如果有效,對應修改訂單狀態和購買的商品狀態等等。

二、憑證驗證函式

        /** * 驗證AppStore內付 * @param  string $receipt_data 付款後憑證 * @return array                驗證是否成功 */function validate_apple_pay($receipt_data){    /**     * 21000 App Store不能讀取你提供的JSON對象     * 21002 receipt-data域的資料有問題     * 21003 receipt無法通過驗證     * 21004 提供的shared secret不匹配你帳號中的shared secret     * 21005 receipt伺服器當前不可用     * 21006 receipt合法,但是訂閱已到期。伺服器接收到這個狀態代碼時,receipt資料仍然會解碼並一起發送     * 21007 receipt是Sandbox receipt,但卻發送至生產系統的驗證服務     * 21008 receipt是生產receipt,但卻發送至Sandbox環境的驗證服務     */    function acurl($receipt_data, $sandbox=0){        //小票資訊        $secret = "XXXXXXXXXXXXXXXXXXXX";    // APP固定密鑰,在itunes中擷取        $POSTFIELDS = array("receipt-data" => $receipt_data,'password'=>$secret);        $POSTFIELDS = json_encode($POSTFIELDS);         //正式購買地址 沙箱購買地址        $url_buy     = "https://buy.itunes.apple.com/verifyReceipt";        $url_sandbox = "https://sandbox.itunes.apple.com/verifyReceipt";        $url = $sandbox ? $url_sandbox : $url_buy;         //簡單的curl        $ch = curl_init($url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        curl_setopt($ch, CURLOPT_POST, 1);        curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS);        $result = curl_exec($ch);        curl_close($ch);        return $result;    }    // 驗證參數    if (strlen($receipt_data)<20){        $result=array(            'status'=>false,            'message'=>'非法參數'            );        return $result;    }    // 請求驗證    $html = acurl($receipt_data);    $data = json_decode($html,true);     // 如果是沙箱資料 則驗證沙箱模式    if($data['status']=='21007'){        // 請求驗證        $html = acurl($receipt_data, 1);        $data = json_decode($html,true);        $data['sandbox'] = '1';    }     if (isset($_GET['debug'])) {        exit(json_encode($data));    }         // 判斷是否購買成功    if(intval($data['status'])===0){        $result=array(            'status'=>true,            'message'=>'購買成功'            );    }else{        $result=array(            'status'=>false,            'message'=>'購買失敗 status:'.$data['status']            );    }    return $result;}

注意:驗證函式中有一個密鑰需要在 itunes 中擷取。

三、應用示範(ThinkPHP3.2控制器)

    public function verify()    {    // 擷取訂單號    $order_no = I('post.order_no');    // 擷取使用者id    $user_id  = I('post.uid');    //蘋果內購的驗證收據        $apple_receipt = I('post.apple_receipt');        // 判斷是否缺少參數    if ( empty($order_no) || empty($user_id) || empty($apple_receipt) ) {        $message = "缺少請求參數";        $status = "400";    } else {        // 代碼思路            // 1. 判斷訂單是否存在並且有效            // 2. 判斷使用者是否存在            // 3. 調用蘋果支付憑證驗證函式            $verify_result = validate_apple_pay($apple_receipt);            // 4.判斷驗證結果            if( $apple_result['status'] ) {     // 憑證驗證成功                // 其他code,修改訂單狀態、購買商品狀態……                $message = "ok";                $status  = "200";            } else {                            // 憑證驗證失敗                $status  = "401";                $message = "驗證失敗";            }    }        // 返回介面資料        $result = array();        if( !empty($apple_receipt) ) {        $result['verify_result'] = $verify_result['message'];        $result['apple_receipt'] = $apple_receipt;        }        $result['status']  = $status;        $result['message'] = $message;                $this->response($result,'json');  //以json方式返回資料    }

四、參考文檔

1. HTTP標準狀態代碼;

2. 蘋果內購買項目配置流程;

3. iOS應用內支付(IAP)詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.