PHP实战——苹果IAP支付接入

IAP支付流程

大致的业务逻辑是这样的。

  1. 向服务器请求商品订单号码以及ituns配置的商品ID
  2. 发起IAP购买请求
  3. 购买流程结束后, 向服务器发起验证凭证以及支付结果的请求
  4. 验证流程结束完成购买流程。
细化支付验证流程:

首先简单说明一下整个流程, 此处以我们APP开发为例, 说明客户端进行支付, 服务器端进行验证的逻辑, 保证整个IAP支付的安全性

  • 整个流程大体为

    • 客户端请求商品订单
    • 获取IAP商品id
    • IAP商品查询
    • 用户支付
    • 客户端发送订单号+支付凭证到服务器
    • 服务器验证凭证是否合法
    • 返回结果到客户端
    • 客户端业务逻辑处理
        
      最近看到很多人在网上询问关于Apple应用内购的服务端验证问题,之前实现了一个PHP版本的封装,今天整理一下,记录在这里,供需要的朋友参考,

注意,这里是PHP版本,其他语言验证方式一样,请自行实现: 

1、App端包含Apple应用内购的产品;

2、验证方式为服务端验证(另一种为App应用本地验证,此文不做介绍);

使用到的类库看这里:Apple内购校验 (不要忘了给个star o( ̄︶ ̄)o)
  
下面介绍一下使用方法:
  
创建一个名为Demo.php的文件,将以下内容拷贝至Demo.php文件中:

require_once 'src/AppleIAP/AppleInAppPurchaseVerification.php';
use AppleIAP\AppleInAppPurchaseVerification;
//apple返回的支付参数 receipt-data
$receiptData = 'MIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
//如果产品类型为订阅型的,请使用校验需要的密码;如果不是订阅型的产品,请将其置为空字符串
$password = 'baXXXXXXXXXXXXXXXXXXXXXXXXX';
$appleIAP = newAppleInAppPurchaseVerification($receiptData,$password,true);
$result = $appleIAP->validateReceipt();
echo $result;

  
结果输出说明:

A、校验通过:会得到一个json数据,包含购买产品的详细信息;
B、校验失败:会得到一个错误代码。
PHP实战代码 
<?php 

//* 随着苹果系统越来越强大,有种马上要开始胡来的节奏,个人认为强制添加内购就是其中之一,虽然很多人都特别鄙视这种行为,然并卵。
//* 具体的官方给出的验证规则,大家可以详细阅读看看:http://zengwu3915.blog.163.com/blog/static/2783489720137605156966/?suggestedreading
//* apple官方提供的文档地址:https://developer.apple.com/library/prerelease/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

 $apple_receipt = $this->_post('apple_receipt'); //苹果内购的验证收据,由客户端传过来 

 $jsonData = array('receipt-data'=>$apple_receipt);//这里本来是需要base64加密的,我这里没有加密的原因是客户端返回服务器端之前,已经作加密处理 

 $jsonData = json_encode($jsonData); 
 //$url = 'https://buy.itunes.apple.com/verifyReceipt';  正式验证地址
 //$url = 'https://sandbox.itunes.apple.com/verifyReceipt'; //测试验证地址 

$response = http_post_data($url,$jsonData); 
if($response->{'status'} == 0){ 
echo '验证成功'; 
}else{ 
echo '验证失败'.$response->{'status'}; 
} 

//curl请求苹果app_store验证地址 
function http_post_data($url, $data_string) { 
    $curl_handle=curl_init(); curl_setopt($curl_handle,CURLOPT_URL, $url); curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER, true); curl_setopt($curl_handle,CURLOPT_HEADER, 0); 
    curl_setopt($curl_handle,CURLOPT_POST, true); 
    curl_setopt($curl_handle,CURLOPT_POSTFIELDS, $data_string); curl_setopt($curl_handle,CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($curl_handle,CURLOPT_SSL_VERIFYPEER, 0); 
    $response_json =curl_exec($curl_handle); 
    $response =json_decode($response_json); 
    curl_close($curl_handle); return $response; 
} 
?>

  

坚持原创技术分享,您的支持将鼓励我继续创作!