参考网址: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. QT如何修改字符编码格式

    编辑-Select Encoding,然后在弹出窗口中修改字符编码.                      

  2. 从Linux 2.6.8内核的一个TSO/NAT bug引出的网络问题排查观点(附一个skb的优化点)

    梦中没有错与对,梦中没有恨和悔...最好闭上你的嘴.这样才算可爱...我不会说:这不公道,我不能接受.我会用朴素的文字记录点点滴滴,早上4点多起来,一气呵成最近的收获与评价,愤慨与忏悔. 四年多前的一 ...

  3. Javascript MVC 学习笔记(三) 视图和模板

    模板 Javascript中模板的核心概念是,将包括模板变量的HTML片段和Javascript对象做合并.把模板变量替换为对象中的属性值. 书中讲到了几种库作为模板引擎,可是链接失效了.能够在这里下 ...

  4. 调试JDK源代码-一步一步看HashMap怎么Hash和扩容

    调试JDK源代码-一步一步看HashMap怎么Hash和扩容 调试JDK源代码-ConcurrentHashMap实现原理 调试JDK源代码-HashSet实现原理 调试JDK源代码-调试JDK源代码 ...

  5. Fedora下克隆Octopress博客

    我在自己的github上搭建了一个Octopress博客(http://songlee24.github.io/),用于不定期的写一些学习笔记和心得体会.但是有时候由于换了电脑或者重装了linux系统 ...

  6. Java Web开发基础(1)-Servlet

    概述 Servlet技术是对webserver的扩展,要理解这个,可能先了解一下什么是Webserver以及它的功能,特别是它的不足是非常有帮助的,可參考:点击打开链接.另外.Servlet也是一个用 ...

  7. 数学之路-python计算实战(17)-机器视觉-滤波去噪(中值滤波)

    Blurs an image using the median filter. C++: void medianBlur(InputArray src, OutputArray dst, int ks ...

  8. 【剑指offer】斐波那契序列与跳台阶

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/25337983 剑指offer上的第9题,简单题,在九度OJ上測试通过. 主要注意下面几点: ...

  9. Linux ALSA声卡驱动之六:ASoC架构中的Machine

    前面一节的内容我们提到,ASoC被分为Machine.Platform和Codec三大部分,其中的Machine驱动负责Platform和Codec之间的耦合以及部分和设备或板子特定的代码,再次引用上 ...

  10. C# winform通过按钮上移下移 解决了datasource绑定问题

    事件代码: private void btn_frmDicType_MoveUp_Click(object sender, EventArgs e) { int lstLength = this.ls ...