参考网址:https://blog.csdn.net/que_csdn/article/details/80861408  http://www.php.cn/php-weizijiaocheng-394625.html

上面的地址写的都不错的 可以参考改改代码  即OK!!!!

一、苹果APP支付到服务端验证流程

1. 用户在app中点击购买;

2. app调用服务端接口生成订单

3. app获取到服务端订单生成成功后弹出支付窗口;

4. 用户输入密码支付;

5. app接收支付后apple应用商店返回的支付凭证;

6. app将支付凭证传回服务器,调用服务器接口验证凭证是否有效;

7. app获取服务器端的验证结果,反馈用户支付结果状态。

说明:苹果支付的商品,需要先在 itunes Connect 中配置APP内购项目,配置后对应会生成一个商品ID,在苹果APP端调用苹果支付时,就需要给苹果商店传送这个商品ID(product_id)参数。然后支付过程是在苹果商店中进行,支付完成后,返回一个支付凭证给APP,表示支付完成,但一般会再次调用自己的服务器(商家服务器)端进行支付验证,这时候在服务器写个验证接口,判断凭证是否有效,如果有效,对应修改订单状态和购买的商品状态等等。

二、凭证验证函数

    /**

 * 验证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){

        //小票信息

        $secret = "XXXXXXXXXXXXXXXXXXXX";    // APP固定密钥,在itunes中获取

        $POSTFIELDS = array("receipt-data" => $receipt_data,'password'=>$secret);

        $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;

}

注意:验证函数中有一个密钥需要在 itunes 中获取。

三、应用示范(ThinkPHP3.2控制器)

public function verify()

{

    // 获取订单号

    $order_no = I('post.order_no');

    // 获取用户id

    $user_id  = I('post.uid');

    //苹果内购的验证收据

    $apple_receipt = I('post.apple_receipt');

    // 判断是否缺少参数

    if ( empty($order_no) || empty($user_id) || empty($apple_receipt) ) {

        $message = "缺少请求参数";

        $status = "400";

    } else {

        // 代码思路

        // 1. 判断订单是否存在并且有效

        // 2. 判断用户是否存在

        // 3. 调用苹果支付凭证验证函数

        $verify_result = validate_apple_pay($apple_receipt);

        // 4.判断验证结果

        if( $apple_result['status'] ) {     // 凭证验证成功

            // 其他code,修改订单状态、购买商品状态……

            $message = "ok";

            $status  = "200";

        } else {                            // 凭证验证失败

            $status  = "401";

            $message = "验证失败";

        }

    }

    // 返回接口数据

    $result = array();

    if( !empty($apple_receipt) ) {

        $result['verify_result'] = $verify_result['message'];

        $result['apple_receipt'] = $apple_receipt;

    }

    $result['status']  = $status;

    $result['message'] = $message;

    

    $this->response($result,'json');  //以json方式返回数据

}

四、参考文档

1. HTTP标准状态码;

2. 苹果内购买项目配置流程;

3. iOS应用内支付(IAP)详解

转自:http://www.php.cn/php-weizijiaocheng-394625.html

IOS内购--后台PHP认证的更多相关文章

  1. 苹果IOS内购二次验证返回state为21002的坑

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

  2. iOS 内购相关

    iOS 内购相关 下面总结一下过往订阅和内购的项目的代码方面的实现细节和注意事项,特别是掉单方面的处理. 后台的协议.商品ID.银行卡.内购类型.沙盒账号测试人员都由运营或者产品在苹果后台中申请处理. ...

  3. iOS - 内购总结

        如果有人以后要在做内购这一块.希望可以好好的阅读这篇文章,虽然不是字字珠玑.但是也是本人亲人趟过了无数的坑,希望可以对大家有所帮助!  下面是在研究工程中遇到的问题(iOS 内购的流程如下 1 ...

  4. IOS内购支付server验证模式

    IOS 内购支付两种模式: 内置模式 server模式 内置模式的流程: app从app store 获取产品信息 用户选择须要购买的产品 app发送支付请求到app store app store ...

  5. IOS内购支付服务器验证模式

    IOS 内购支付两种模式: 内置模式 服务器模式 内置模式的流程: app从app store 获取产品信息 用户选择需要购买的产品 app发送支付请求到app store app store 处理支 ...

  6. Unity苹果(iOS)内购接入(Unity内置IAP)

    https://www.jianshu.com/p/4045ebf81a1c Unity苹果(iOS)内购接入(Unity内置IAP) Kakarottog                       ...

  7. iOS 内购遇到的坑

    一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...

  8. iOS 内购讲解

    一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...

  9. iOS内购图文流程(2017)

    什么是内购? 只要在iPhone App上购买的不是实物产品(也就是虚拟产品如qq币.虎牙币.电子书......) 都需要走内购流程,苹果这里面抽走三成.   使用内购需要走的流程. 1,填写协议,税 ...

随机推荐

  1. Spring Web Flow 入门demo(二)与业务结合 附源代码

    第一部分demo仅仅介绍了简单的页面跳转,接下来我们要实现与业务逻辑相关的功能. 业务的逻辑涉及到数据的获取.传递.保存.相关的业务功能函数的调用等内容,这些功能的实现都可用Java 代码来完毕,但定 ...

  2. java编程思想——java IO系统

    一.什么是IO io在本质上是单个字节的移动.而流能够说是字节移动的载体和方式,它不停的向目标处移动数据.我们要做的就是依据流的方向从流中读取数据或者向流中写入数据. 二.java中支持IO操作的库类 ...

  3. 【JAVA】merge two array by order

    public class MergeSort { static void show(int a[]) { int i; for (i = 0; i < a.length; i++) { Syst ...

  4. c++ 编译器会绕过拷贝构造函数

    C++ primer P442 P447:在拷贝初始化过程中,编译器可以跳过拷贝构造函数,直接创建对象.即,编译器允许将下面的代码 "; //1 改写为 "); //2 由于str ...

  5. openStack aio 测试

  6. [App Store Connect帮助]二、 添加、编辑和删除用户(1)用户帐户和职能概述

    您可以在 App Store Connect 的“用户和访问”部分管理用户.添加沙盒测试员以及管理 API 密钥. 用户职能决定了用户对 App Store Connect 和 Apple Devel ...

  7. 开启和安装Kubernetes 基于Docker For Windows

    0.最近发现,Docker For Windows Stable在Enable Kubernetes这个问题上是有Bug的,建议切换到Edge版本,并且采用下文AliyunContainerServi ...

  8. JavaScript中什么是包装对象?

    存取字符串.数字或布尔值的属性时,创建的临时对象称为包装对象.包装对象只是偶尔用来区分字符串值和字符串对象.数字和数值对象以及布尔值和布尔对象.由于字符串.数字和布尔值的属性都是只读的,并且不能给它们 ...

  9. 微信小程序压缩图片并上传到服务器(拿去即用)

    这里注意一下,图片压缩后的宽度是画布宽度的一半 canvasToTempFilePath 创建画布的时候会有一定的时间延迟容易失败,这里加setTimeout来缓冲一下 这是单张图片压缩,多张的压缩暂 ...

  10. poi导出excel改变标题颜色

    在excelutil类里面添加 public class ExcelUtil { public static Workbook fillExcelData(ResultSet rs, Workbook ...