Maison  >  Article  >  développement back-end  >  PHP gère la vérification secondaire sur le serveur après les achats intégrés dans Apple APP (expérience du projet)

PHP gère la vérification secondaire sur le serveur après les achats intégrés dans Apple APP (expérience du projet)

不言
不言original
2018-04-28 09:33:567666parcourir

Le contenu de cet article concerne le projet PHP intégrant l'API de paiement par numérisation de code WeChat (paiement domestique). Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

1. Processus de vérification du paiement de l'application Apple au serveur

1. L'utilisateur clique pour acheter dans l'application

2. pour générer une commande

; 3. La fenêtre de paiement apparaît une fois que l'application a obtenu la commande générée avec succès par le serveur

4. 🎜>

5. Une fois que l'application a reçu le paiement, l'application Apple Le bon de paiement renvoyé par le magasin ;

6 L'application renvoie le bon de paiement au serveur et appelle l'interface du serveur

. pour vérifier si le bon

est valide ;

7. L'application obtient le résultat de la vérification côté serveur, indique l'état du résultat de paiement de l'utilisateur.

Remarque

 : Pour les produits payés par Apple, vous devez d'abord configurer l'article d'achat intégré à l'application dans

itunes Connect Après la configuration, un identifiant de produit sera d'abord. généré en conséquence Lorsque vous appelez Apple Pay, vous devez envoyer le paramètre ID de produit (product_id) à l'Apple Store. Ensuite, le processus de paiement est effectué dans l'Apple Store. Une fois le paiement terminé, un bon de paiement est renvoyé à l'APP, indiquant que le paiement est terminé, mais généralement, elle appellera à nouveau son propre serveur (serveur marchand) pour vérifier le paiement. . A ce moment, écrivez une interface de vérification sur le serveur, déterminez si le bon est valide, et s'il est valide, modifiez le statut de la commande et le statut du produit acheté en conséquence, etc. 2. Fonction de vérification des informations d'identification

Remarque
        /**
	 * 验证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(
	            &#39;status&#39;=>false,
	            &#39;message&#39;=>&#39;非法参数&#39;
	            );
	        return $result;
	    }
	    // 请求验证
	    $html = acurl($receipt_data);
	    $data = json_decode($html,true);
	 
	    // 如果是沙盒数据 则验证沙盒模式
	    if($data[&#39;status&#39;]==&#39;21007&#39;){
	        // 请求验证
	        $html = acurl($receipt_data, 1);
	        $data = json_decode($html,true);
	        $data[&#39;sandbox&#39;] = &#39;1&#39;;
	    }
	 
	    if (isset($_GET[&#39;debug&#39;])) {
	        exit(json_encode($data));
	    }
	     
	    // 判断是否购买成功
	    if(intval($data[&#39;status&#39;])===0){
	        $result=array(
	            &#39;status&#39;=>true,
	            &#39;message&#39;=>&#39;购买成功&#39;
	            );
	    }else{
	        $result=array(
	            &#39;status&#39;=>false,
	            &#39;message&#39;=>&#39;购买失败 status:&#39;.$data[&#39;status&#39;]
	            );
	    }
	    return $result;
	}
 : Il y a une clé dans la fonction de vérification qui doit être obtenue à partir d'iTunes.

3. Démonstration d'application (contrôleur ThinkPHP3.2)

4. code d'état standard ;
    public function verify()
    {
    	// 获取订单号
    	$order_no = I(&#39;post.order_no&#39;);
    	// 获取用户id
    	$user_id  = I(&#39;post.uid&#39;);
    	//苹果内购的验证收据
        $apple_receipt = I(&#39;post.apple_receipt&#39;);
        // 判断是否缺少参数
    	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[&#39;status&#39;] ) {     // 凭证验证成功

                // 其他code,修改订单状态、购买商品状态……

                $message = "ok";
                $status  = "200";
            } else {                            // 凭证验证失败
                $status  = "401";
                $message = "验证失败";
            }
    	}
        // 返回接口数据
        $result = array();
        if( !empty($apple_receipt) ) {
        	$result[&#39;verify_result&#39;] = $verify_result[&#39;message&#39;];
        	$result[&#39;apple_receipt&#39;] = $apple_receipt;
        }
        $result[&#39;status&#39;]  = $status;
        $result[&#39;message&#39;] = $message;
        
        $this->response($result,&#39;json&#39;);  //以json方式返回数据
    }

2. Processus de configuration du projet d'achat in-app Apple 3. Explication détaillée du paiement in-app iOS (IAP)

Recommandations associées :

PHP gère l'interception par le SDK WeChat des téléchargements de photos

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn