IOS苹果AppStore内购付款的服务器端php验证方法(使用thinkphp)
发布时间:2023-06-14 13:05:56
标签:IOS,thinkphp,内购
这篇文章主要介绍了IOS苹果AppStore内购付款的服务器端php验证方法(使用thinkphp)。AppStore内购在app中支付的过程那是由前端IOS程序猿完成的;
IOS会把支付凭证发给后端服务器;使用php需要做的就是对支付结果的验证;这篇文章使用thinkphp整合,其实脱离thinkphp别的框架也能很便利的使用。
/**
* 验证AppStore内付
* @param string $receipt_data 付款后凭证
* @return array 验证是否成功
*/
function validate_apple_pay($receipt_data){
/**
* 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环境的验证服务
*/
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;
}
// 验证参数
if (strlen($receipt_data)<20){
$result=array(
'status'=>false,
'message'=>'非法参数'
);
return $result;
}
// 请求验证
$html = acurl($receipt_data);
$data = json_decode($html,true);
// 如果是沙盒数据 则验证沙盒模式
if($data['status']=='21007'){
// 请求验证
$html = acurl($receipt_data, 1);
$data = json_decode($html,true);
$data['sandbox'] = '1';
}
if (isset($_GET['debug'])) {
exit(json_encode($data));
}
// 判断是否购买成功
if(intval($data['status'])===0){
$result=array(
'status'=>true,
'message'=>'购买成功'
);
}else{
$result=array(
'status'=>false,
'message'=>'购买失败 status:'.$data['status']
);
}
return $result;
}
使用方法也非常简单,就是把IOS发过来的支付凭证作为参数传入validate_apple_pay()函数即可。
<?php
namespace Api\Controller;
use Common\Controller\HomeBaseController;
/**
* paypal支付
*/
class AppstoreController extends HomeBaseController{
// 支付回调
public function result(){
//苹果内购的验证收据
$receipt_data = I('post.apple_receipt');
// 验证支付状态
$result=validate_apple_pay($receipt_data);
if($result['status']){
// 验证通过 此处可以是修改数据库订单状态等操作
}else{
// 验证不通过
}
}
}


猜你喜欢
- 一、前言最近趁空闲之余,在对MySQL数据库进行插入数据测试,对于如何快速插入数据的操作无从下手,在仅1W数据量的情况下,竟花费接近47s,
- 一.图像漫水填充图像漫水填充(FloodFill)是指用一种特定的颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效
- 最近做的都是前端的项目,很多项目都有回到顶部的需求,下面把我写js代码做个笔录,方便以后查找。发现还可以添加从快到慢的动画效果和随时下拉滚动
- 由于js的代码逻辑越来越重,一个js文件可能会有上千行,十分不利于开发与维护。最近正在把逻辑很重的js拆分成模块,在一顿纠结是使用requi
- 左为旧版,右为更新到1.0版本后的名字定义变量的更新tf.VARIABLES ——> tf.GLOBAL_VARIABLEStf.al
- APSchedulerAPScheduler 四个组件分别为:调度器(scheduler)、触发器(trigger),作业存储(job st
- 本文实例讲述了Python wxPython库使用wx.ListBox创建列表框。分享给大家供大家参考,具体如下:如何创建一个列表框?列表框
- 一、说明 关于matplotlib的scatter函数有许多活动参数,如果不专门注解,是
- 当后端并未编写后台json数据,但是前端又要使用数据进行页面的编写,这是便可用mockjs编写一个假的数据源,发送ajax请求并获取数据1.
- 本文实例讲述了PHP解析xml格式数据工具类。分享给大家供大家参考,具体如下:class ome_xml { /**  
- 一、业务需求在使用Python进行业务开发的时候,需要将一些数据保存到本地文件存储,方便后面进行数据分析展示。二、需求分析通过查看需求可得出
- 大家都知道,数据库的安全性是很重要的,它直接影响到数据库的广泛应用。用户可以采用任意一种方法来保护数据库应用程序,也可以将几种方法结合起来使
- Gmail 作为一个经典的 Web 2.0 应用,在带来革命性的邮件管理体验的同时,以其完整、快速的 AJAX 操作方式,深受用户的推崇和技
- 两种情况:1.带索引 2.不带索引前提介绍:方式:采用命令行的方式来模拟1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据
- 假设要实现一个存放多种类型数据结构的对象,比如一个存放算术操作数和操作符的树结点,需要存放包含一元操作符、二元操作符和数字类型的结点clas
- 第一步、导入需要的包import osimport scipy.io as sioimport numpy as npimport torc
- matlab中创建类似字典的数据结构Matlab中创建struct:d = struct('a','1',&
- --table1 表ID NAME QQ PHONE1 秦云 10102800 135000002 在路上 10378 136000003
- 如IE6,在他上面还不那么富饶,给程序调试带来的很大的痛苦啊,所以日志即时输出是一个不错的选择,可以知道程序覆盖到了哪里。即是在先进的浏览器
- 路由路由可以定义在工程的目录下(看你的需求),也可以定义在各个应用中来保存应用的路由,用主路文件urls中使用include()包含各个应用