>  기사  >  백엔드 개발  >  Apple APP에서 인앱 구매 후 PHP가 서버에서 2차 검증을 처리합니다(프로젝트 경험).

Apple APP에서 인앱 구매 후 PHP가 서버에서 2차 검증을 처리합니다(프로젝트 경험).

不言
不言원래의
2018-04-28 09:33:567890검색

이 글의 내용은 WeChat 코드 스캐닝 결제 API(국내 결제)를 통합한 PHP 프로젝트에 관한 것입니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.

1. Apple APP 서버측 확인 프로세스

1. 사용자가 앱에서 구매를 클릭합니다.

2. 앱이 서버측 인터페이스를 호출하여 3.

4. 사용자가 결제를 위해 비밀번호를 입력합니다.

5. 앱이 결제를 받은 후 결제 바우처가 반환됩니다. 앱은 결제 바우처를 서버로 다시 전송하고 서버 인터페이스

를 호출하여 바우처

가 유효한지 확인합니다.

7. 앱은 서버 측 확인 결과를 받아 사용자의 결제 결과 상태를 피드백합니다.

참고

: Apple Pay 제품의 경우 먼저

itunes Connect

에서 앱 내 구매 항목을 구성해야 합니다. 구성 후 Apple APP에서 Apple Pay를 호출할 때 제품 ID가 생성됩니다. 이를 Apple Store 제품 ID(product_id) 매개변수로 보냅니다. 그러면 애플스토어에서 결제가 진행되는데, 결제가 완료되면 결제 바우처가 APP으로 반환되어 결제가 완료되었음을 알리지만, 일반적으로 결제 확인을 위해 자체 서버(가맹점 서버)를 다시 호출하게 됩니다. 이때 서버에 확인 인터페이스를 작성하고 바우처가 유효한지 확인하고 유효한 경우 그에 따라 주문 상태 및 구매 제품 상태를 수정합니다.

2. 자격 증명 확인 기능

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

Note: iTunes에서 얻어야 하는 확인 기능에 키가 있습니다.

3. 응용 프로그램 데모(ThinkPHP3.2 컨트롤러)

    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. 참고 문서

2. Apple 인앱 구매 프로젝트 구성 프로세스; 애플리케이션 내부 결제(IAP)에 대한 자세한 설명

관련 권장 사항:

PHP 처리 WeChat SDK 차단 사진 업로드

위 내용은 Apple APP에서 인앱 구매 후 PHP가 서버에서 2차 검증을 처리합니다(프로젝트 경험).의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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