以下是實際測試通過的蘋果支付服務端代碼,給大家提供些許思路幫助。再加強的安全處理根據自己的業務增加即可,這兒隻列出了可用的骨架。
public function applepayAction(){
$receipt = isset($this->param['receipt'])?$this->param['receipt']:'';
$orderid = isset($this->param['transactionId'])?$this->param['transactionId']:'';
$username = isset($this->param['username'])?$this->param['username']:'';
$password = isset($this->param['password'])?$this->param['password']:''
if(!$receipt||!$orderid){
$this->ajaxerror('參數缺失');
}
$rechargeModel = new \Model\RechargeModel;
$membersModel = M('Members');
$member = $membersModel->where(array('uid'=>$uid))->find();
//建立訂單,使用蘋果給的訂單号
$record = $rechargeModel->where(array('waterno'=>$orderid))->find();
$orderno = date('YmdHis',time()).rand(,);
if(empty($record)){
$data = array(
'uid' => $uid,
'orderno' => $orderno,
'waterno' => $orderid,
'ordertime' => time(),
'fromaddr' => $_SERVER['HTTP_HOST'],
'paytype' => ,
);
$rechargeModel->add($data);
}
$isSandbox = false;//沙箱是測試環境,正式環境改為false
$info = $this->getReceiptData($receipt, $isSandbox);//去蘋果進行二次驗證,防止收到的是僞造的資料
if(is_array($info) && $info['status'] == ){//沒有錯誤就進行業務邏輯的處理,訂單設定成已支付,給使用者加錢
$answer['status'] = ;
$answer['msg'] = '支付成功';
if($record['status'] != '1'){
$data['amount'] = $this->product[$info['product_id']];//這個價格清單是你送出給蘋果的,蘋果不會直接給你具體多少錢
$rechargeModel->where(array('waterno'=>$orderid))->save($data);
//實際充值
}else{
$answer['msg'] = '該訂單已支付';
}
}elseif(is_array($info) && $info['status'] == ){
$infonew = $this->getReceiptData($receipt, true);//接着去蘋果官網進行二次驗證(沙盒)
if(is_array($infonew) && $infonew['status'] == ){
$answer['status'] = ;
$answer['msg'] = '支付成功';
}else{
$answer['status'] = -;
$answer['msg'] = '正式不通過改測沙盒依舊不通過,錯誤碼:'.$infonew['status'];
}
}else{
$answer['status'] = -;
$answer['msg'] = '正式不通過且非21007不測沙盒,錯誤碼:'.$info['status'];
}
$this->ajaxReturn($answer);
}
private $product = [
'cb_18' => ,
'cb_68' => ,
'cb_118' => ,
'cb_198' => ,
'cb_208' => ,
'cb_298' => ,
'cb_308' => ,
'cb_518' => ,
'cb_698' => ,
'cb_1048' => ,
'cb_1998' => ,
'cb_2298' => ,
'cb_5898' => ,
'cb_6498' =>
];
private function getReceiptData($receipt, $isSandbox = false){
if ($isSandbox) {
$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';//沙箱位址
} else {
$endpoint = 'https://buy.itunes.apple.com/verifyReceipt';//真實營運位址
}
$postData = json_encode(
array('receipt-data' => $receipt)
);
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, );
$response = curl_exec($ch);
$errno = curl_errno($ch);
curl_close($ch);
if ($errno != ) {//curl請求有錯誤
$this->ajaxerror('請求逾時,請稍後重試');
}else{
$data = json_decode($response, true);
if(isset($data['status'])){
//傳回産品的資訊
$order = $data['receipt']['in_app'][];
$order['status']=$data['status'];
}else{
$order['status']=;
}
return $order;
}
}
這兒給大家貼個中文狀态碼:

再給個傳回示例
/*傳回資料參照樣例
array (
'status' => ,
'environment' => 'Sandbox',
'receipt' =>
array (
'receipt_type' => 'ProductionSandbox',
'adam_id' => ,
'app_item_id' => ,
'bundle_id' => 'com.abcde.www',
'application_version' => '0.0.9',
'download_id' => ,
'version_external_identifier' => ,
'receipt_creation_date' => '2016-07-13 18:22:19 Etc/GMT',
'receipt_creation_date_ms' => '1468434139000',
'receipt_creation_date_pst' => '2016-07-13 11:22:19 America/Los_Angeles',
'request_date' => '2016-07-13 18:22:22 Etc/GMT',
'request_date_ms' => '1468434142143',
'request_date_pst' => '2016-07-13 11:22:22 America/Los_Angeles',
'original_purchase_date' => '2013-08-01 07:00:00 Etc/GMT',
'original_purchase_date_ms' => '1375340400000',
'original_purchase_date_pst' => '2013-08-01 00:00:00 America/Los_Angeles',
'original_application_version' => '1.0',
'in_app' =>
array (
=>
array (
'quantity' => '1',
'product_id' => 'price_1',//去看$this->product裡對應的價格,就是你的充值額
'transaction_id' => '1000000223463280',
'original_transaction_id' => '1000000223463280',
'purchase_date' => '2016-07-13 18:22:19 Etc/GMT',
'purchase_date_ms' => '1468434139000',
'purchase_date_pst' => '2016-07-13 11:22:19 America/Los_Angeles',
'original_purchase_date' => '2016-07-13 18:22:19 Etc/GMT',
'original_purchase_date_ms' => '1468434139000',
'original_purchase_date_pst' => '2016-07-13 11:22:19 America/Los_Angeles',
'is_trial_period' => 'false',
),
),
),
)
*/