<?php
/**
* 苹果支付
* Class IosPay
* @package app\common\controller
*/
class IosPay
{
/**
* 错误信息状态码描述
* @var string[]
*/
protected $err_msg = [
'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环境的验证服务'
];
/**
* 验证苹果支付是否成功
* @param $receipt_data
* @return array
*/
public function validate_apple_pay($receipt_data, $order_sn)
{
// 验证参数
if (strlen($receipt_data) < 20) {
return array('status' => false, 'message' => '非法参数');
}
// 请求验证
$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';
}
//记录日志
$file = LOG_PATH . 'epaylogs' . DS . 'ios' . '-' . date("Y-m-d") . '.log';
file_put_contents($file, json_encode(['order_sn' => $order_sn, 'receipt_data' => $receipt_data,
'validate_data' => $data
]), FILE_APPEND);
// 判断是否购买成功
if (intval($data['status']) === 0) {
$result = array('status' => true, 'message' => '购买成功');
} else {
$result = array('status' => false, 'message' => $this->err_msg[$data['status']] ?? $data['status']);
}
return $result;
}
/**
* 发送请求
* @param $receipt_data
* @param int $sandbox
* @return bool|string
*/
function acurl($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;
}
}
直接请求 validate_apple_pay 方法就好了。