ホームページ >バックエンド開発 >PHPチュートリアル >PHPはApple APIのアプリ内購入クーポンの検証サンプルコードを実装します

PHPはApple APIのアプリ内購入クーポンの検証サンプルコードを実装します

小云云
小云云オリジナル
2018-03-06 13:24:482501ブラウズ


以下は、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 の書き方が含まれる可能性があるため、分割に関するヘルプが必要な場合は、私のブログを通じて私のグループに参加してください。私はここにいますビアンがそれを解決するのに役立ちます。
関連する推奨事項:

PHP APIインターフェース例の共有について

php APIデータインターフェースの記述例

PHP Alipay開発サービスウィンドウAPI

以上がPHPはApple APIのアプリ内購入クーポンの検証サンプルコードを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。