>  기사  >  백엔드 개발  >  PHP는 Apple API 인앱 구매 바우처의 확인 예제 코드를 구현합니다.

PHP는 Apple API 인앱 구매 바우처의 확인 예제 코드를 구현합니다.

小云云
小云云원래의
2018-03-06 13:24:482486검색


다음은 AppStore 인앱 구매의 서버 측 확인에 관한 것입니다. 결제가 완료된 후 프런트 엔드에서 해당 결제 바우처를 얻습니다. 따라서 바우처를 기반으로 실제로 결제가 이루어졌는지 확인한 후 후속 제품 기능의 비즈니스 로직을 완료해야 합니다. 하나는 프런트 엔드 자체에서 확인하는 것입니다. 다른 하나는 백엔드를 통해 검증하는 것입니다. 많은 문제가 있습니다. 일부는 백엔드를 통해 검증되므로 실제 검은 다음과 같습니다.

1. (캡슐화된 자격 증명 획득 구조 클래스, tp) 여기에서 프레임워크를 사용하는데, 여기에서 다른 프레임워크를 수정하는 것도 매우 편리합니다. 이해가 안 되시면 메시지를 남겨주세요)
/**
 * 苹果内购Api查询接口
 * Class AppleAipController
 * @package Pay\Controller
 */class  AppleAipController extends  Controller{

    /**
     * @var string
     */
    private $sandboxCurl = "https://sandbox.itunes.apple.com/verifyReceipt";    private $formalityCurl = "https://buy.itunes.apple.com/verifyReceipt";    /**
     * @return array
     */
    public function send($encodeStr,$sandboxStatus=0)
    {
        $ch = curl_init();        $data['receipt-data'] =$encodeStr;        $encodeStr =  json_encode($data);        $url = $sandboxStatus?($this->formalityCurl):($this->sandboxCurl);
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        // post数据
        curl_setopt($ch, CURLOPT_POST, 0);        // post的变量
        curl_setopt($ch, CURLOPT_POSTFIELDS, $encodeStr);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);        $output = curl_exec($ch);
        curl_close($ch);        $resut = (Array)json_decode($output,true);        return $resut;
    }
}
2. 회사의 제품 디자인은 금전적인 문제와 관련되어 있으므로 가장 좋습니다. 주의사항은 앞서 작성한 토큰 및 인증이 유효하기 때문입니다. 더 자세한 내용이 필요하신 경우 서명 인증 및 토큰 구현은 여기에서 확인하실 수 있습니다.

서명 인증 글은 클릭하시고, 토큰 글은 클릭해주세요

그런 다음 TP에서 사용되기 때문에 아래에 호출 방법도 추가하겠습니다. 다른 방법을 사용해야 하는 경우 수정을 돕기 위해 프레임워크나 네이티브 측에 메시지를 남겨주시면 아래에 호출한 코드를 첨부하겠습니다. :
<?php/**
 * Created by PhpStorm.
 * User: wyb
 * Date: 2017/8/14
 * Time: 9:57
 */namespace xxxxxxxx;use Common\Tools\Attestation;use Pay\Controller\AppleAipController;use Think\Controller;/**
 * product苹果API内购验证
 * Class CoinApiPayController
 */class  ProductPayController extends  Controller{
    protected $response = [&#39;result&#39; => true, &#39;code&#39; => 10000, &#39;msg&#39; => &#39;&#39;, &#39;AData&#39; => [], &#39;OData&#39; => NULL];    /**
     * 来源数组
     * @var array
     */
    private $targetArray = [&#39;a_sysj&#39;, &#39;i_sysj&#39;, &#39;a_lpds&#39;, &#39;i_lpds&#39;,&#39;a_jjds&#39;,&#39;i_jjds&#39;];    private $testMember =[&#39;9232313&#39;];//定好你们内部测试,人员,若人员比较多的化就做成后台管理的从数据库中取出



    /**
     * @name 检验凭证并分发后续业务的逻辑
     */
    public function credentialsCheckAction()
    {
        IS_POST ||$this->returnError();//判断是否是POST
        $parameters =I(&#39;post.&#39;);//这里最好的相应的参数进行验证,并且使用验签校验,这里我就省略了这部分,还有下面部分最好也放在你封装或者放在你相应的模型内

         $AppleAipController = new  AppleAipController();         $sandboxStatus = in_array($parameters[&#39;member_id&#39;],$thi->testMember)?1:0;         $checkData = $AppleAipController->send($parameters[&#39;encodeStr&#39;],$sandboxStatus);        if($checkData[&#39;status&#39;]==0){            //校验订单号
            if($checkData[&#39;receipt&#39;][&#39;transaction_id&#39;]!=$parameters[&#39;trade_id&#39;]) {                $this->returnErrorData(&#39;20012&#39;, &#39;检验错误【01】&#39;, &#39;21003&#39;);
            }            $productId = &#39;com.ifeimo.&#39;.$orderInfo[&#39;product_id&#39;];            //校验商品ID
            if($checkData[&#39;receipt&#39;][&#39;product_id&#39;] != $productId){                $this->returnErrorData(&#39;20012&#39;, &#39;检验错误【02】&#39;, &#39;21003&#39;);
            }            //校验价格
            $checkPrice = intval(str_replace(&#39;cxzxxxx_&#39;, &#39;&#39;, $checkData[&#39;receipt&#39;][&#39;product_id&#39;]));            if($checkPrice!=$orderInfo[&#39;price&#39;]){                $this->returnErrorData(&#39;20012&#39;, &#39;检验错误【03】&#39;, &#39;21003&#39;);
            }            $result = self::notifyAdd($orderInfo);            $this->response[&#39;msg&#39;]  = &#39;支付成功&#39;;            $status = $checkData[&#39;status&#39;];
        }else{            $status = $checkData[&#39;status&#39;];            $this->response[&#39;status&#39;] = $status;            $this->response[&#39;result&#39;] = false;            $this->response[&#39;msg&#39;]  = &#39;待支付&#39;;
        }        $this->response[&#39;order&#39;] = $orderInfo;        $this->response[&#39;encodeStatus&#39;] = $status;        $this->ajaxReturn($this->response);//返回数据给前端


    }    /**
     * 整合异步发放
     * @param $order
     * @param $time
     * @return int
     */
    private function notifyAdd($order)
    {
     //这里写你相应的分发业务

    }    /**
     * 错误返回
     * @param string $msg 错误提示信息,默认‘请求处理失败’
     */
    private function returnErrorData($code = &#39;20000&#39;, $msg = &#39;请求处理失败&#39;,$status=&#39;21003&#39;){
        $this->response[&#39;result&#39;] = false;        $this->response[&#39;status&#39;] = $status;        $this->response[&#39;code&#39;] = $code;        $this->response[&#39;msg&#39;] = $msg;        $this->ajaxReturn($this->response);
    }


}

tp의 글쓰기 방법이 포함될 수 있기 때문에, 분할에 도움이 필요하시면 제 블로그를 통해 제 그룹에 가입하시면 제가 해결해드릴 수 있습니다.

관련 추천:

API 인터페이스 예제 공유에 대한 PHP

php api 데이터 인터페이스 작성 예제

PHP Alipay 개발 서비스 창 API

위 내용은 PHP는 Apple API 인앱 구매 바우처의 확인 예제 코드를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.