2011-11-03 2 views
1

내 사이트의 사용자는 아이템 바구니를 주문할 수 있습니다.PayPal의 나의 주문 바구니 확인

이 작업이 끝나면 결제 버튼을 클릭 할 수 있습니다.

PayPal을 사용하여 결제를하고 싶습니다.

사용자가 결제 버튼을 클릭하면 사용자는 PayPal로 리디렉션되고 지불 할 제품의 개요를 볼 수 있습니다.

사용자가 결제 과정을 거치는 경우 사용자는 내 성공 페이지로 리디렉션됩니다.

그러나 나는 성공 페이지가 지불의 트랜잭션 id를 받기를 기대하지만 paypal은 토큰과 payerid 만 되돌려 보냅니다.

function checkoutAction() 
{ 
    $request = $this->getRequest(); 

    require_once(LIB_PATH.'/MFW/Paypal/Flows/Paypal_NVP.php'); 
    $paypal_nvp = new MFW_Paypal_NVP(); 

    // this should normally be filled by looping though the basket items 
    $data = array('L_PAYMENTREQUEST_0_NAME0'=>'Single License', 
        'L_PAYMENTREQUEST_0_NUMBER0'=>'1111-2222-3333-4444-5555-6666-7777-8888', 
        'L_PAYMENTREQUEST_0_AMT0'=>39.99, // or enterprise 299.00 
        'L_PAYMENTREQUEST_0_QTY0'=>1, 
       ); 

    $_SESSION['Payment_Amount'] = 39.99; 

    $result = $paypal_nvp->CallShortcutExpressCheckout(59.98, $data); 

    $ack = strtoupper($result['ACK']); 
    if($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING') { 
     $paypal->RedirectToPayPal($result['TOKEN']); 
     exit(); 
    } 
} 

Paypal_NCP 클래스의 코드 :

function generate_nvp_string($total_value, $data = array()) 
{ 
    $params = array('PAYMENTREQUEST_0_AMT'=>$total_value, 
        'PAYMENTREQUEST_0_PAYMENTACTION'=>$this->payment_type, 
        'RETURNURL'=>$this->return_url, 
        'CANCELURL'=>$this->cancel_url, 
        'PAYMENTREQUEST_0_CURRENCYCODE'=>$this->currency, 
        ); 

    $params = array_merge($params, $data); 

    $nvp_string = ''; 
    foreach($params as $name => $value) { 
     $nvp_string.= '&'.$name.'='.$value; 
    } 

    // example string 
    // &PAYMENTREQUEST_0_AMT=39.99&PAYMENTREQUEST_0_PAYMENTACTION=Sale&RETURNURL=http://return-address&CANCELURL=http://cancel-address&PAYMENTREQUEST_0_CURRENCYCODE=EUR&L_PAYMENTREQUEST_0_NAME0=Single License&L_PAYMENTREQUEST_0_NUMBER0=1111-2222-3333-4444-5555-6666-7777-8888&L_PAYMENTREQUEST_0_AMT0=39.99&L_PAYMENTREQUEST_0_QTY0=1 

    return $nvp_string; 
} 

function CallShortcutExpressCheckout($total_value, $data = array()) 
{ 
    $_SESSION['currencyCodeType'] = $this->currency; 
    $_SESSION['PaymentType'] = $this->payment_type; 

    $result = $this->hash_call('SetExpressCheckout', $this->generate_nvp_string($total_value, $data)); 

    $ack = strtoupper($result['ACK']); 
    if ($ack == 'SUCCESS' || $ack == 'SUCCESSWITHWARNING') { 
     $_SESSION['TOKEN'] = urldecode($result['TOKEN']); 
    } 

    return $result; 
} 

어떻게 할 체크 아웃은하지

<form action="/en/checkout"> 
    <input type="submit" name="submit" value="Checkout"> 
</form> 

내 코드 :

내 체크 아웃 양식은 다음과 같습니다 백 오피스에서 지불을 처리 할 수있는 거래 정보를 얻었습니까? (이 트랜잭션 ID가 필요합니다)

답변

1

당신은 단지 SetExpressCheckout을 호출하고 있습니다. 익스프레스 체크 아웃으로 거래를 완료하려면 GetExpressCheckoutDetails를 호출하여 구매자의 고유 식별자 인 PayerID와 (필수) DoExpressCheckoutPayment를 가져와야합니다.

요약 할 내용 :
Express Checkout을 사용하려면 SetExpressCheckout API를 호출해야합니다. API 호출에서 제품, 금액 및 RETURNURL의 세부 사항을 지정합니다. 이것은 위의 코드에서 수행중인 작업입니다.
이 데이터를 PayPal의 API 엔드 포인트에 게시하면 보답으로 토큰을받습니다. 그런 다음 구매자를 리디렉션하고 다음 URL에 토큰을 추가합니다. https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-XXXXXXX

구매자가 동의하면 RETURNURL에서 지정한 URL로 리디렉션됩니다.
주문 확인을 표시하고 GetExpressCheckoutDetails API **를 호출해야합니다. GetExpressCheckoutDetails를 호출 할 때 토큰을 제공하십시오. GetExpressCheckoutDetails API 응답에서 PayerID를 찾을 수 있습니다.

이제 DoExpressCheckoutPayment를 호출하고 구매자에게 요금을 청구 할 준비가되었습니다. DoExpressCheckoutPayment를 호출 할 때 토큰과 payerID를 모두 포함해야합니다.

IPN과 관련하여 : DoExpressCheckoutPayment에 대한 API 응답에서 TransactionID를 다시 얻으므로 실제로는 더 이상 필요하지 않습니다. IPN은 나중에 트랜잭션을 '추적'하고자 할 때 유용합니다. 예 : 환불/지불 거절 등의 경우 통보 받기
SetEXpressCheckout 및 DoExpressCheckoutPayment에 NOTIFYURL = http : // ....를 포함하면 IPN 스크립트를 설정하기 만하면됩니다.

** PayerID는 RETURNURL의 GET에도 추가됩니다. 원하는 경우 GetExpressCheckoutDetails 호출을 건너 뛸 수 있습니다.

(Why is DoExpressCheckoutPayment required for Paypal?에서 내 대답의 부분 복사)

+0

는 게시,하지만 매우 유망한 보이는 것을 밖으로 시도하지 않았습니다. 나는 그것을 밖으로 시도 갈 것입니다. 나는 어리석은 질문이나 RTFM 매뉴얼 질문을하는 것을 정말로 싫어한다. 하지만 PayPal의 문서는 내 인생에서 만난 최악의 문서입니다. 거기서 아무 것도 찾을 수 없습니다. 예 : 결제 상태를 확인하기 위해 IPN이 필요하지 않습니다. 전자 수표 및 물건 (처리/검증하는 데 약간의 시간이 걸릴 수 있습니다)? – PeeHaa

+1

예, 생성 된 트랜잭션을 추적하려면 IPN을 사용하십시오. 그래도 필요하지는 않습니다. DoExpressCheckoutPayment를 호출하고 ACK = Success 응답을 받으면 PAYMENTSTATUS = Completed 또는 Pending이 표시됩니다. – Robert