Home  >  Article  >  Backend Development  >  PHP implements the verification example code of apple API in-app purchase voucher

PHP implements the verification example code of apple API in-app purchase voucher

小云云
小云云Original
2018-03-06 13:24:482483browse


The following is the server-side verification of AppStore in-app purchases. The payment process in the app is completed by the IOS programmer. After the payment is completed, the front-end will obtain the corresponding payment. Voucher, then it is necessary to verify whether the payment was actually made based on the voucher, and then complete the business logic of subsequent product functions. As for verification, there are two types: one is to verify by the front end itself, and the other is to verify through the back end. It can be imagined that most of them will be verified through the backend, so the real sword is shown below:

1. (Encapsulated credential acquisition structure class, the tp framework is used here , it is also very convenient to modify other frameworks here. If you don’t understand, you can leave me a message)
/**
 * 苹果内购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. Because the product design of the company involves financial issues, it is best to be cautious, so before The written token and signature verification are now in effect. If you need to know about the implementation of signature verification and token, you can take a look here.

Please click on the signature verification article, and please click on the token article

Then I will also assign my calling method below, because it is used on tp. If you need to use other frameworks or native ones, you can leave me a message to help modify it. I will attach my calling code below:
<?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);
    }


}

Because it may include the writing method of tp, if you need assistance in splitting, you can join my group through my blog, and I can help solve the problem.

Related recommendations:

PHP’s sharing of API interface examples

php’s api data interface writing examples

PHP Alipay Development Service Window API

The above is the detailed content of PHP implements the verification example code of apple API in-app purchase voucher. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn