Heim  >  Artikel  >  Backend-Entwicklung  >  PHP übernimmt die sekundäre Überprüfung auf dem Server nach In-App-Käufen in Apple APP (Projekterfahrung)

PHP übernimmt die sekundäre Überprüfung auf dem Server nach In-App-Käufen in Apple APP (Projekterfahrung)

不言
不言Original
2018-04-28 09:33:567890Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Integration der WeChat-Code-Scanning-Zahlungs-API (Inlandszahlung). Jetzt kann ich ihn mit Ihnen teilen

1. Apple APP-Zahlung zum Server-Verifizierungsprozess

1. Der Benutzer klickt zum Kaufen in der App

2 um eine Bestellung zu generieren3. Das Zahlungsfenster erscheint, nachdem die App die Bestellung erfolgreich erhalten hat

4 🎜>

5. Nachdem die App die Zahlung erhalten hat, sendet die Apple-Anwendung den vom Store zurückgegebenen Zahlungsbeleg zurück und ruft die Serverschnittstelle auf um zu überprüfen, ob der Gutschein

gültig ist;

7 Die App erhält das serverseitige Verifizierungsergebnis und gibt dem Benutzer eine Rückmeldung über den Zahlungsergebnisstatus.

Hinweis: Für von Apple bezahlte Produkte müssen Sie zuerst den APP-In-App-Kaufartikel in

itunes Connect

konfigurieren. Nach der Konfiguration wird eine Produkt-ID angezeigt Beim Aufruf von Apple Pay müssen Sie den Parameter Produkt-ID (product_id) an den Apple Store senden. Anschließend wird der Bezahlvorgang im Apple Store durchgeführt. Nach Abschluss der Zahlung wird ein Zahlungsbeleg an die APP zurückgegeben, der anzeigt, dass die Zahlung abgeschlossen ist. In der Regel ruft sie jedoch erneut ihren eigenen Server (Händlerserver) zur Zahlungsüberprüfung auf Schreiben Sie zu diesem Zeitpunkt eine Überprüfungsschnittstelle auf den Server, stellen Sie fest, ob der Gutschein gültig ist, und ändern Sie, falls gültig, den Bestellstatus und den Status des gekauften Produkts usw.

2. Funktion zur Überprüfung der Anmeldeinformationen

        /**
	 * 验证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;
	}

Hinweis

: Es gibt einen Schlüssel in der Überprüfungsfunktion, der von iTunes bezogen werden muss.

3. Anwendungsdemonstration (ThinkPHP3.2-Controller)

    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方式返回数据
    }

4. Referenzdokumente

1. HTTP-Standardstatus Code;

2. Apple-In-App-Kaufprojekt-Konfigurationsprozess 3. Detaillierte Erläuterung der iOS-In-App-Zahlung (IAP)

PHP übernimmt das Abfangen und Hochladen von Fotos durch das WeChat SDK

Das obige ist der detaillierte Inhalt vonPHP übernimmt die sekundäre Überprüfung auf dem Server nach In-App-Käufen in Apple APP (Projekterfahrung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn