這篇文章介紹的內容是關於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)詳解