1. 程式人生 > >蘋果內購支付 伺服器端驗證

蘋果內購支付 伺服器端驗證

classClassName{/** * 客戶端支付完後呼叫的介面 * 驗證通過後 做後續業務邏輯處理 */publicfunctionpayendtovalidate(){$receipt_data=isset($_POST['receipt_data'])?$_POST['receipt_data']:'';//待驗證資料$validate=$this->validate_apple_pay($receipt_data);if(!$validate['status']){//驗證不通過exit(json_encode(['state'=>'10','msg'=>$validate['message'

]]));}//進行驗證通過的邏輯處理}/** * 驗證AppStore內付 * @param string $receipt_data 付款後憑證 * @return array 驗證是否成功 */functionvalidate_apple_pay($receipt_data){// 驗證引數if(strlen($receipt_data)<20){$result=array('status'=>false,'message'=>'非法引數');return$result;}// 請求驗證$html=$this->acurl($receipt_data);$data=json_decode
($html,true);// 如果是沙盒資料 則驗證沙盒模式if($data['status']=='21007'){// 請求驗證$html=$this->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;}/** * 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環境的驗證服務 */functionacurl($receipt_data,$sandbox=0){//小票資訊$POSTFIELDS=array("receipt-data"=>$receipt_data);$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;}}