IAP支付流程
大致的业务逻辑是这样的。
- 向服务器请求商品订单号码以及ituns配置的商品ID
- 发起IAP购买请求
- 购买流程结束后, 向服务器发起验证凭证以及支付结果的请求
- 验证流程结束完成购买流程。
细化支付验证流程:
首先简单说明一下整个流程, 此处以我们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;
}
?>