苹果支付有2种。
一种是app pay 这个相当于微信,支付宝类似。
一种是appstore内支付。这个就是上架苹果商店(Appstore)的接入方式。
公司开发了一个应用,接入了苹果支付(其实是AppStore内支付,因为是虚拟商品,所有不能直接接入app pay),
客户端做好了,要 PHP程序员 对接支付回调接口,处理支付后的业务逻辑(修改订单状态,发送短信通知客户,修改用户购买的套餐)。
代码:
// 苹果支付验证 接口
// @param string $receipt 收到的数据
// @param boolean $isSandbox 是否是沙盒模式,true,false
// @因为只是写一个demo。所以没有用加密方法。线上的可以用openssl加密传输。不要直接post
function getreceiptdata(){
//接受用户的请求。可以改成自己的接受方式。我这里是post请求。$_REQUEST可以接受post,get,cookie等。速度较慢
$receipt = $_REQUEST['strReceipt'];
$username = addslashes($_REQUEST['username']);//用户名转义用户名
$tc = $_REQUEST['pid'];//套餐类型
$isSandbox = true;
//如果是沙盒模式,请求苹果测试服务器,反之,请求苹果正式的服务器
if ($isSandbox) {
$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';
}
else {
$endpoint = 'https://buy.itunes.apple.com/verifyReceipt';
}
$postData = json_encode(
array('receipt-data' => $receipt)
);
//为了方便演示。所以没有封装curl方法。实际应用中可以把这个单独拿出来。
$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, 0); //这两行一定要加,不加会报SSL 错误
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
$response = curl_exec($ch);
$errno = curl_errno($ch);
$errmsg = curl_error($ch);
curl_close($ch);
$data = json_decode($response);
//判断时候出错,抛出异常
if ($errno != 0) {
//throw new \Exception($errmsg, $errno);
//这里写上自己的逻辑。
}
//判断返回的数据是否是对象
if (!is_object($data)) {
//无效的响应数据
}
$order = $data->receipt->in_app;
//所有的订单的信息
$k = count($order) -1;
$need = $order[$k];//需要的那个订单
//下面进行业务处理了,根据用户购买的套餐,给他开通相应的套餐、时间
//新建一个订单,已支付状态,
//把购买的套餐的时间加到该账号
我这里的是客户端(ios)调用我的接口,客户端传用户名,套餐类型,还有苹果发送的数据过来。返回的是xml格式的数据,其实最好是用json返回给客户端,我这里是客户端要求返回xml,代码写的很烂。没有做其他的任何验证,如果你们自己验证的话,一定要验证全面一些。我只是把验证思路贴出来。
苹果的支付回调的接口文档地址我也贴出来方便大家自己去查阅:https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html#//apple_ref/doc/uid/TP40010573-CH1-SW5