前言

IOS原生支付后,需要调用服务端接口进行验证,检测是否真正的支付成功!

class ApplePay

{

/** 环境配置(建议提成配置)

* @var bool

*/

private $sandbox = false ;

/** result as json

* @param int $code

* @param string $msg

* @param array $data

* @return string

*/

private function jsonRet(int $code=200, string $msg='', array $data = [])

{

$result = [

'code' => $code ,

'message' => $msg ,

'data' => $data ,

] ;

return json_encode($result,true);

}

/** code400

* @param string $msg

* @return string

*/

private function code400( $msg = '参数错误!' )

{

return $this->jsonRet(400,$msg);

}

/** code200

* @param string $msg

* @return string

*/

private function code200( $msg = '操作成功!')

{

return $this->jsonRet(200,$msg);

}

/** log

* @param $info

*/

private function log($info)

{

//log info

}

/** ios apple 支付验证

* @return string

*/

public function apple()

{

//苹果支付认证的凭证(base64后的数据)

$receipt = $_POST('receipt') ;

if(empty($receipt)) {

return $this->code400() ;

}

//环境配置

if($this->sandbox) {

$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';//沙箱地址

} else {

$endpoint = 'https://buy.itunes.apple.com/verifyReceipt';//真实运营地址

}

//数据组装

//$receipt ='MIITg45+CLLy37vkb0ADflcoqEY/3mH1Rc9rC4q3/O7eG/sT7MntcVH1gc8GiEuZZ1T0Qormu2TFRrg866YxxI0LVfxzQ==';

$postData = json_encode(

array('receipt-data' => $receipt)

,JSON_UNESCAPED_SLASHES);

//日志记录

$this->log($postData);

//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);

curl_close($ch);

if ($errno != 0) {

return $this->code400('curl请求有错误!') ;

} else {

$data = json_decode($response, true);

if (!is_array($data)) {

return $this->code400('数据错误!') ;

}

//判断购买是否成功

if (!isset($data['status']) || $data['status'] != 0) {

return $this->code400('无效的iOS支付数据!') ;

}

//无效的bundle_id

if(!in_array($data['receipt']['bundle_id'],['ios申请的bundle_id类似于支付的app_id'])) {

return $this->code400('无效的bundle_id:'.$data['receipt']['bundle_id']) ;

}

//多物品购买时

// in_app为多个(坑)

// ios一次支付可能返回多个,可能是上次成功后没有及时返回,这次成功后会把上次或上上次成功的返回

if(!empty($inAppData = $data['receipt']['in_app'])) {

//产品配置,对应ios申请的product_id eg : yw_6 支付6元

$productB = ['yw_6'];

//多物品信息

foreach ($inAppData as $product) {

//订单重复验证

$appleData = $product->check('自身业务去重');

if($appleData) {

continue ;

//return $this->code400('交易单号重复,请不要重复验证!id:'.$transactionId) ;

}

if(isset($productB[$product['product_id']])) {

$productId = $product['product_id'];

$money = $productB[$productId] ;

if(!$money) {

return $this->code400('没有找到对应产品的金额,ID:'.$product['product_id']) ;

}

//业务逻辑处理

//加余额,记录资金日志之类的操作

$product['add_balance'] = true ;

}

//环境

$product['is_sandbox'] = $this->sandbox ;

//数据

$product['receipt_data'] = $receipt ;

//时间

$product['time'] = date('YmdHis') ;

//返回码

$product['err_no'] = '200' ;

//save $product 保存数据

}

}

//根据自身需求返回数据

$returnData = [] ;

return $this->code200($returnData) ;

}

}

}

ios 支付验证 php,PHP验证IOS原生支付是否成功(代码全篇)相关推荐

  1. 利用抖音Cookie充值接口提取支付链接,个人调起原生微信h5支付宝h5支付

    最近开始搞一些个人支付通道的开发,方便个人不用和第三方平台签约就能收款,省去很多流程手续的成本. 然后翻了一下网上并没有太多现成的技术教程,只能自己研究着搞了. 这次要分享的是利用抖音的充值接口,去分 ...

  2. ios内购二次验证安全性问题_iOS内购之二次验证

    开篇:关于iOS内购整体流程网上能找到很多.我抽丝剥茧,着重说一下二次验证及收据回传的数据问题. 二次验证 关于二次验证,其实有两种做法,第一种是在app端验证,第二种也是安全防盗的一种,在服务端进行 ...

  3. 苹果关闭iOS 14.1验证通道,阻止 iOS 14.2 降级

    11月13日消息,据国外媒体报道,今日苹果推出了iOS 14.3,但推出后瞬间撤回.尽管如此,苹果还是执意关闭了iOS 14.1系统的验证通道.这意味着更新到 iOS 14.2 的用户无法再降级到 i ...

  4. ios内购二次验证安全性问题_苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

  5. 怎样查询苹果服务器关闭验证,iPhone小技巧:如何查询 iOS 系统是否已经关闭验证?...

    小编在后台经常会受到来自用户的类似提问:iOS X.X.X 关闭验证了吗? 众所周知,苹果在发布新系统之后不久,就会关闭旧版本系统的验证.验证关闭后,用户将无法再升级/降级到该版本. 举个例子:iOS ...

  6. 苹果关闭iOS 16和16.0.1验证通道,升级iOS 16.0.2后无法降级这2版本

    今日消息,现在苹果官方已经关闭了iOS 16.0和16.0.1的验证通道,意味着升级到iOS 16.0.2的用户将无法降级到这两个版本. 苹果于9月23日向iPhone用户推送了iOS 16.0.2正 ...

  7. ios 自架验证服务器,iOS和SSL:无法验证自签名的服务器证书

    我是相当新的使用SSL通道消费web服务.经过相当不错的搜索后,我发现了一种使用NSURLConnection委托API执行SSL/HTTPS身份验证的方法.以下是代码片段进行实际验证的事情: iOS ...

  8. 微信或QQ分享IOS应用时显示“未验证”问题相关文章汇总

    微信或QQ分享IOS应用时显示"未验证"问题相关文章汇总 1.IOS官方说明与解决方案 2.QQ互联官方关于此问题的通知 3.QQ互联官方提供的解决方案 4.QQ互联对Univer ...

  9. iOS集成极验行为验证

    iOS集成极验行为验证 项目中有使用到极验行为验证 看了下官方的demo,记录下如下的要点,官网文档行为验证 官方验证按钮GT3CaptchaButton的效果图如下: 也可以不使用官方GT3Capt ...

最新文章

  1. 速卖通关键词挖掘工具_网站优化必备的关键词挖掘工具
  2. IPv6 — 网际协议第 6 版
  3. vsnprintf的作用和使用
  4. 三座”大山“或让谷歌无人机送货项目被冻结
  5. 手把手教你如何写简历
  6. java弹出虚拟键盘_JS实现电脑虚拟键盘的操作
  7. python中eof表示什么语句错误_python中pickle的EOF错误
  8. 查询linux上调度命令,浅析Linux中crontab任务调度
  9. 敏捷开发系列学习总结(1)——版本管理发布流程
  10. Unbuntu和Centos中部署同时多版本PHP的详细过程
  11. Java 失宠于 Oracle?
  12. Spanning-Tree Portfast
  13. 静态测试和动态测试相关知识点
  14. HTML四季变换图,四季星空图
  15. Asp.Net Web 项目部署到阿里云 Windows版本服务器
  16. 盘古石杯电子取证比赛WP
  17. 网络安全:为大家介绍5种常见的加密算法
  18. AndroidStudio导入arr包
  19. vue将毫秒为单位的时间转化成分钟和秒
  20. Android Watchdog框架解析、应用与改造(上)

热门文章

  1. NodeJs连接Oracle数据库
  2. PL/SQL Developer中文版下载以及使用图解(绿色版)
  3. 转:Oracle物理文件
  4. Oracle 游标的练习
  5. 在maven本地仓库导入jar包
  6. 程序员为什么老得快_这段 Python 代码让程序员赚 300W,公司已确认!网友:神操作!...
  7. linux vps 运行exe文件夹,在centos环境下运行.exe文件
  8. oracle中12523,【Oracle】静态监听导致的ORA-12523错误
  9. snmp服务 2003 镜像_美国掌握全球70%根服务器,一旦对中国关闭,我们将无法上网?...
  10. 中用BBP公式计算_如何计算基础代谢率