ThinkPHP 알 리 페 이 인터페이스 기능 인 스 턴 스 실현

본 고 는 ThinkPHP 가 알 리 페 이 인터페이스 기능 을 실현 하 는 방법 을 실례 로 서술 하 였 다.모두 에 게 참고 하도록 공유 하 다.구체 적 인 분석 은 다음 과 같다.
최근 에 시스템 을 만 들 려 면 온라인 결제 기능 을 실현 해 야 합 니 다.주저 하지 않 고 알 리 페 이의 인터페이스 결제 기능 을 선 택 했 습 니 다.여기 서 저 는 즉시 입금 하 는 인 터 페 이 스 를 사 용 했 습 니 다.구체 적 으로 실현 하 는 절 차 는 다음 과 같 습 니 다.
1.알 리 페 이 인터페이스 팩 다운로드
다운로드 주소:https://b.alipay.com/order/productDetail.htm?productId=2012111200373124&tabId=4#ps-tabinfo-hash
구체 적 으로 다운로드 하 는 방법 에 대해 서 는 잔소리 하지 않 겠 습 니 다~
2.인터페이스 패키지 파일 을 다시 정리 하 는 것 은 비교적 관건 적 인 것 이 라 고 할 수 있 습 니 다.다운로드 한 인터페이스 패키지 파일 은 언어의 소스 코드 가 많 습 니 다.

우 리 는 createdirect_pay_by_user-PHP-UTF-8 이라는 이름 의 인터페이스 파일 에는 다음 과 같은 파일 이 포함 되 어 있 습 니 다.

images 파일 에는 알 리 페 이와 관련 된 표지 의 그림 입 니 다.우 리 는 그 를 잠시 상관 하지 않 습 니 다.lib 파일 은 매우 중요 하고 전체 인터페이스의 핵심 파일 입 니 다.
alipay.config.php 는 관련 매개 변수 설정 파일 입 니 다.
alipayapi.php 는 알 리 페 이 인터페이스 입구 파일 입 니 다.
notify_url.php 는 서버 비동기 알림 페이지 파일 입 니 다.
return_url.php 는 페이지 전환 동기 화 알림 파일 입 니 다.
ThinkpHP 의 프레임 워 크 파일 에서 Extended 를 찾 아 들 어가 서 Vendor 에 들 어 갑 니 다.Vendor 폴 더 에서 새 폴 더 Alipay 는 알 리 페 이 를 제3자 라 이브 러 리 로 도입 한 다음 에 알 리 페 이 인터페이스 파일 패키지 에 있 는 lib 파일 의 모든 파일 을 복사 합 니 다.모두 4 개의 파일 입 니 다.다음 과 같 습 니 다.

현재 위 파일 의 이름 을 바 꿉 니 다.
alipay_core.function.php 이름 바 꾸 기:Corefunction.php;
alipay_md5.function.php 이름 바 꾸 기:Md5function.php;
alipay_notify.class.php 이름 바 꾸 기:Notify.php;
alipay_submit.class.php 이름 바 꾸 기:Submit.php;
그리고 Submit.php 파일 을 열 고 다음 코드 를 제거 합 니 다.
require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");마찬가지 로 Notify.php 파일 을 열 고 다음 두 단락 의 코드 를 require 제거 합 니 다.once("alipay_core.function.php");
require_once("alipay_md5.function.php");왜 상기 두 파일 중의 이 두 단락 의 코드 를 없 애 야 합 니까?프로젝트 에서 인터페이스 파일 을 호출 할 때,나 는 모든 네 개의 핵심 파일 을 vendor 를 통 해 도입 하기 때 문 입 니 다.그래서 더 이상 가 져 올 필요 가 없습니다.
이로써 알 리 페 이 인터페이스 패키지 와 관련 된 핵심 라 이브 러 리 의 정 리 는 기본적으로 끝났다.지금부터 프로젝트 에서 호출 하기;
3.프로젝트 에서 알 리 페 이 인터페이스 호출
호출 두 단계:
1.설정 파일 에서 Conf/Config.php 파일 에서 알 리 페 이 관련 매개 변 수 를 설정 합 니 다.
//         
 
'alipay_config'=>array( 
       'partner' =>'20********50',   // PID; 
    'key'=>'9t***********ie',// Key 
    'sign_type'=>strtoupper('MD5'), 
    'input_charset'=> strtolower('utf-8'), 
    'cacert'=> getcwd().'\\cacert.pem', 
    'transport'=> 'http', 
      ), 
     // , alipay.config.php , ; 
     
'alipay'   =>array( 
 // ,  
'seller_email'=>'[email protected]', 
 
// url, Pay notifyurl ; 
'notify_url'=>'http://www.xxx.com/Pay/notifyurl',  
 
// url, Pay returnurl ; 
'return_url'=>'http://www.xxx.com/Pay/returnurl', 
 
// , User ,myorder , payed( ) 
'successpage'=>'User/myorder?ordtype=payed',    
 
// , User ,myorder , unpay( ) 
'errorpage'=>'User/myorder?ordtype=unpay',  
),
2,새 PayAction 컨트롤 러 코드 는 다음 과 같 습 니 다

class PayAction extends Action{  
       // ,      
       public function _initialize() { 
        vendor('Alipay.Corefunction'); 
        vendor('Alipay.Md5function'); 
        vendor('Alipay.Notify'); 
        vendor('Alipay.Submit');     
    } 
     
    //doalipay  
         
    public function doalipay(){ 
             
       // require_once("alipay.config.php"); 
       // require_once("lib/alipay_submit.class.php"); 
        
       // TP C , $alipay_config; 
       $alipay_config=C('alipay_config');   
 
         
 
        $payment_type = "1"; // // ,  
        $notify_url = C('alipay.notify_url'); //  
        $return_url = C('alipay.return_url'); //  
        $seller_email = C('alipay.seller_email');//  
        $out_trade_no = $_POST['trade_no'];// , ! 
        $subject = $_POST['ordsubject'];  // //  
        $total_fee = $_POST['ordtotal_fee'];   //   //  
        $body = $_POST['ordbody'];  //  
        $show_url = $_POST['ordshow_url'];  //  
        $anti_phishing_key = "";// // submit query_timestamp  
        $exter_invoke_ip = get_client_ip(); // IP   
     
        // ,  
    $parameter = array( 
        "service" => "create_direct_pay_by_user", 
        "partner" => trim($alipay_config['partner']), 
        "payment_type"    => $payment_type, 
        "notify_url"    => $notify_url, 
        "return_url"    => $return_url, 
        "seller_email"    => $seller_email, 
        "out_trade_no"    => $out_trade_no, 
        "subject"    => $subject, 
        "total_fee"    => $total_fee, 
        "body"            => $body, 
        "show_url"    => $show_url, 
        "anti_phishing_key"    => $anti_phishing_key, 
        "exter_invoke_ip"    => $exter_invoke_ip, 
        "_input_charset"    => trim(strtolower($alipay_config['input_charset'])) 
        ); 
        //  
        $alipaySubmit = new AlipaySubmit($alipay_config); 
        $html_text = $alipaySubmit->buildRequestForm($parameter,"post", " "); 
        echo $html_text; 
    } 
         
    function notifyurl(){ 
                  
                //require_once("alipay.config.php"); 
                //require_once("lib/alipay_notify.class.php"); 
                 
                // C , $alipay_config 
        $alipay_config=C('alipay_config'); 
 
        //  
        $alipayNotify = new AlipayNotify($alipay_config); 
        $verify_result = $alipayNotify->verifyNotify(); 
 
        if($verify_result) { 
               //  
                   // ,  
           $out_trade_no   = $_POST['out_trade_no'];      //  
           $trade_no       = $_POST['trade_no'];          //  
           $trade_status   = $_POST['trade_status'];      //  
           $total_fee      = $_POST['total_fee'];         //  
           $notify_id      = $_POST['notify_id'];         // ID。 
           $notify_time    = $_POST['notify_time'];       // 。 yyyy-MM-dd HH:mm:ss。 
           $buyer_email    = $_POST['buyer_email'];       // ; 
                   $parameter = array( 
             "out_trade_no"     => $out_trade_no, // ; 
             "trade_no"     => $trade_no,     // ; 
             "total_fee"     => $total_fee,    // ; 
             "trade_status"     => $trade_status, //  
             "notify_id"     => $notify_id,    // ID。 
             "notify_time"   => $notify_time,  // 。 
             "buyer_email"   => $buyer_email,  // ; 
           ); 
           if($_POST['trade_status'] == 'TRADE_FINISHED') { 
                       // 
           }else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {                           if(!checkorderstatus($out_trade_no)){ 
               orderhandle($parameter);  
                           // , ; 
               } 
            } 
                echo "success";        //  
         }else { 
                //  
                echo "fail"; 
        }     
    } 
     
    function returnurl(){ 
                // , ! 
        $alipay_config=C('alipay_config'); 
        $alipayNotify = new AlipayNotify($alipay_config);//  
        $verify_result = $alipayNotify->verifyReturn(); 
        if($verify_result) { 
            //  
            // ,  
        $out_trade_no   = $_GET['out_trade_no'];      //  
        $trade_no       = $_GET['trade_no'];          //  
        $trade_status   = $_GET['trade_status'];      //  
        $total_fee      = $_GET['total_fee'];         //  
        $notify_id      = $_GET['notify_id'];         // ID。 
        $notify_time    = $_GET['notify_time'];       // 。 
        $buyer_email    = $_GET['buyer_email'];       // ;
             
        $parameter = array( 
            "out_trade_no"     => $out_trade_no,      // ; 
            "trade_no"     => $trade_no,          // ; 
            "total_fee"      => $total_fee,         // ; 
            "trade_status"     => $trade_status,      //  
            "notify_id"      => $notify_id,         // ID。 
            "notify_time"    => $notify_time,       // 。 
            "buyer_email"    => $buyer_email,       //  
        ); 
         
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { 
        if(!checkorderstatus($out_trade_no)){ 
             orderhandle($parameter);  // , ; 
    } 
        $this->redirect(C('alipay.successpage'));// ; 
    }else { 
        echo "trade_status=".$_GET['trade_status']; 
        $this->redirect(C('alipay.errorpage'));// ; 
    } 
}else { 
    //  
    // , alipay_notify.php verifyReturn  
    echo " !"; 
    } 


?>
3.여기 결제 처리 과정 에서 필요 한 함수 가 몇 개 있 습 니 다.저 는 이 함수 들 을 프로젝트 의 Common/common.php 에 썼 습 니 다.이렇게 수 동 으로 호출 하지 않 아 도 이 함수 들 을 직접 사용 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
//Orderlist   ,             ;  
 
//  
// : ; 
// : , true, false; 
function checkorderstatus($ordid){ 
    $Ord=M('Orderlist'); 
    $ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus'); 
    if($ordstatus==1){ 
        return true; 
    }else{ 
        return false;     
    } 

 
//  
// ,  
function orderhandle($parameter){ 
    $ordid=$parameter['out_trade_no']; 
    $data['payment_trade_no']      =$parameter['trade_no']; 
    $data['payment_trade_status']  =$parameter['trade_status']; 
    $data['payment_notify_id']     =$parameter['notify_id']; 
    $data['payment_notify_time']   =$parameter['notify_time']; 
    $data['payment_buyer_email']   =$parameter['buyer_email']; 
    $data['ordstatus']             =1; 
    $Ord=M('Orderlist'); 
    $Ord->where('ordid='.$ordid)->save($data); 
}  
 
// ; 
function getordcode(){ 
    $Ord=M('Orderlist'); 
    $numbers = range (10,99); 
    shuffle ($numbers);  
    $code=array_slice($numbers,0,4);  
    $ordcode=$code[0].$code[1].$code[2].$code[3]; 
    $oldcode=$Ord->where("ordcode='".$ordcode."'")->getField('ordcode'); 
    if($oldcode){ 
        getordcode(); 
    }else{ 
        return $ordcode; 
    } 
}
4.몇 가 지 를 정리 합 니까?
1.인터페이스 패키지 에 있 는 lib 파일 의 파일 을 Vendor 에 복사 한 후에 TP 규범 의 명명 규칙 으로 이름 을 바 꾸 는 것 은 호출 이 편리 하기 위해 서 입 니 다.물론 다른 이름 으로 바 꾸 셔 도 됩 니 다.
2.결제 작업(doalipay)을 수행 하고 비동기 반환 결과(notifyurl)를 처리 하 며 점프 반환 결과(returnurl)세 개의 결제 인터페이스의 핵심 페이지 를 하나의 PayAction 컨트롤 러 에 기록 합 니 다.
3.결 제 를 제출 하 는 페이지 에서 제출 하기 전에 일부 매개 변 수 를 전달 할 내용 을 먼저 도 메 인 을 숨 기 는 방법 으로 조합 할 수 있 습 니 다.예 를 들 어 금액 을 먼저 계산 하고 주문 이름,주문 설명 등 은 먼저 문자열 로 조합 할 수 있 습 니 다.그리고 양식 을 제출 하면 doalipay 방법 에서 전달 파 라 메 터 를 직접 구성 하여 제출 하면 됩 니 다.
4.지불 반환 후의 처 리 는 비동기 와 점프 두 가지 방법 에서 모두 해당 하 는 판단 과 처 리 를 해 야 하기 때문에 이러한 판단 과 처 리 를 사용자 정의 함수 에 기록 하면 함 수 를 호출 하면 코드 가 더욱 명확 해 집 니 다.
5、notify_url 과 returnurl 두 가지 모드 의 반환 url 을 사용 해 야 합 니 다.http://xxxxxxx이러한 절대적 인 경 로 는 알 리 페 이 플랫폼 에서 프로젝트 페이지 로 돌아 가 는 것 이기 때문에 상대 적 인 경 로 를 사용 할 수 없습니다.
상기 코드 는 ThinkpHP 3.0 에서 정상적으로 사 용 됩 니 다!!
thinkpHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.과 을 볼 수 있 습 니 다.
본 고 에서 말 한 것 이 여러분 의 ThinkPHP 프레임 워 크 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기