资讯专栏INFORMATION COLUMN

PHP验证IOS原生支付是否成功(代码全篇)

fuyi501 / 1743人阅读

摘要:前言原生支付后需要调用服务端接口进行验证检测是否真正的支付成功环境配置建议提成配置参数错误操作成功支付验证苹果支付认证的凭证后的数据环境配置沙箱地址真实运营地址数据组装日志记录操作这两行一定要加,不加会报错误请求有错误数据错

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31035.html

相关文章

  • 2016年终工作总结

    摘要:由于初版需求及开发工作都没有参与,在接手项目后过了遍前端结构发现所有交互及组件都是现撸,并未使用市面上已有的优秀前端框架从我个人角度理解上出发,后续需求变更中当需要实现某些常用组件样式或交互时,基本上都需要现撸或者寻找合适的组件。 2016悄无声息的过去了,再过不久便是农历新年 这几天相对清闲梳理了一下去年所做的工作,希望在新的一年能发展的更好 今年一共研发或升级了五款产品:合伙人、夺...

    hoohack 评论0 收藏0
  • 写给想做前端的你

    摘要:不过细想想,我邮只有前端的选修课啥的,课程也不是那么就业导向。至少目前,很少有大公司完全把作为前后端通用的技术栈。不能把简单看做是在服务端的延展。编译这个思想在前端领域很重要不改变现有的语言环境同时进行最佳的工程实践。 P.S. 喷神请绕道,大神勿喷,不引战,不攻击,不钻牛角尖。 大二时第一次接触前端。许多同学估计都想过要做一个网站,大部分又是从PHP开始的(谁让它是世界上最好的语言呢...

    JerryWangSAP 评论0 收藏0
  • 浅析微信支付:微信支付简单介绍(小程序、公众号、App、H5)

    摘要:本文是浅析微信支付系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。浅析微信支付前篇大纲微信支付是集成在微信客户端的支付功能,用户可以通过手机完成快速的支付流程。目前微信支付支持手机系统有苹果安卓和。 本文是【浅析微信支付】系列文章的第二篇,主要讲解一下普通商户接入的支付方式以及其中的不同之处。 上篇文章讲了本系列的大纲,没有看过的朋友们可以看一下。 浅析微信支...

    shadowbook 评论0 收藏0
  • 原生App与javascript交互之JSBridge接口原理、设计与实现

    摘要:相关参考中与之间相互调用的实现实现了与相同的机制的对象注入漏洞解决方案存在的意义 前期调研 调研对象:支付宝,微信,云之家 调研文档:Android中JS与Java的极简交互库 SimpleJavaJsBridge 设计需求 阅读类型的业务功能页面需要由前端H5实现,需要做到服务端可控; 页面界面更改减少重新发布新版本的频率; 功能页面部分原型需求无法实现,需要原生功能支持; 对未来...

    Lyux 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<