使用Zend_Service_PayPal Component实现定期支付宝付款

时间:2013-01-29 06:52:46

标签: php zend-framework paypal

我使用Zend_Service_PayPal组件实现了PayPal付款,这样可以在付款期间将用户保留在我的网站上。付款代码运作良好。 以下是我实施的代码:

首先,我做了:

$Card = new Zend_Service_PayPal_Data_CreditCard( // Credit card info
                array(
                        $cardtype, // Card type
                        $cardno, // Card number
                        $firstName, // Buyer's first name
                        $lastName, // Buyer's last name
                        $expmonth, // Expiry month
                        $expyear, // Expiry year
                        $cvv)); // CVV2

其次,我创建了:

$pname = new Zend_Service_PayPal_Data_PayerName();
$pname->firstName = $firstName;
$pname->lastName = $lastName;

第三,

$billingAddress = new Zend_Service_PayPal_Data_Address( // Billing address
                $address, // Streed address
                $town, // City
                $country, // County Code
                $postcode);

第四,

$authInfo = new Zend_Service_PayPal_Data_AuthInfo($ppusername,
$pppassword,$ppsignature);

然后,

$paypal = new Zend_Service_PayPal_Nvp($authInfo);

最后我使用了doDirect函数,

$result = $paypal->doDirectPayment($total, $Card, $billingAddress, $pname); 

结果我得到了paypal的回复。

但现在我的要求是修改此代码,以便它还可以处理定期付款。 请建议。我以前从未实施定期付款。

1 个答案:

答案 0 :(得分:0)

您好我为ZF或其他框架制作了代码:

public function processPaymentAction()
{
    $methodName = 'CreateRecurringPaymentsProfile';
    // from nvpHeader function
    $API_Endpoint = 'https://api-3t.sandbox.paypal.com/nvp';
    $version = '65.2';

    // But you can use here your own Sandbox API credentials of Business account
    // and you can get through Payapl Sandbox API Credentials Link on Left.

    $API_UserName = 'platfo_1255077030_biz_api1.gmail.com';
    $API_Password = '1255077037';
    $API_Signature = 'Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf';
    $subject = '';
    global $nvp_Header, $AUTH_token, $AUTH_signature, $AUTH_timestamp;
    $nvpHeaderStr = "";

    //pr($this->data);die;
    //$this->data['User']['paymentType']
    $paymentType = urlencode('Sale');
    $firstName = urlencode("Jaskaran");
    $lastName = urlencode("Singh");
    $creditCardType = urlencode("Visa");
    $creditCardNumber = urlencode("4798720058660243");
    $expDateMonth =urlencode(11);

    // Month must be padded with leading zero
    $padDateMonth = str_pad($expDateMonth, 2, '0', STR_PAD_LEFT);

    $expDateYear = urlencode(2015);
    $cvv2Number = urlencode(962);
    $address1 = urlencode("1 Main St");
    $address2 = urlencode("");
    $city = urlencode("San Jose");
    $state = urlencode("CA");
    $zip = urlencode(95131);
    $amount = urlencode(1.00);

//  $init_amount = urlencode($this->data['User']['pack_price']);

    $currencyCode="USD";

    $profileDesc = urlencode("Welcome to the world of shopping where you get everything");
    $billingPeriod = urlencode("Week");
    $billingFrequency = urlencode(4);
    $totalBillingCycles = urlencode(0);

    ################# Commented as we need to define through Admin ##############

    $profileStartDateDay = 10;
    // Day must be padded with leading zero
    $padprofileStartDateDay = str_pad($profileStartDateDay, 2, '0', STR_PAD_LEFT);

    $profileStartDateMonth = 02;
    // Month must be padded with leading zero
    $padprofileStartDateMonth = str_pad($profileStartDateMonth, 2, '0', STR_PAD_LEFT);

    $profileStartDateYear = 2015;

    $profileStartDate = urlencode($profileStartDateYear . '-' . $padprofileStartDateMonth . '-' . $padprofileStartDateDay . 'T00:00:00Z');

    //string from nvpHeader
    $nvpHeaderStr = "&PWD=".urlencode($API_Password)."&USER=".urlencode($API_UserName)."&SIGNATURE=".urlencode($API_Signature);

    $nvpstr="&AMT=$amount&CREDITCARDTYPE=$creditCardType&ACCT=$creditCardNumber&EXPDATE=". $padDateMonth.$expDateYear."&CVV2=$cvv2Number&FIRSTNAME=$firstName&LASTNAME=$lastName&STREET=$address1&CITY=$city&STATE=$state".
    "&ZIP=$zip&COUNTRYCODE=US&CURRENCYCODE=$currencyCode&PROFILESTARTDATE=$profileStartDate&DESC=$profileDesc&BILLINGPERIOD=$billingPeriod&BILLINGFREQUENCY=$billingFrequency&TOTALBILLINGCYCLES=$totalBillingCycles";

    $nvpstr = $nvpHeaderStr.$nvpstr;
    //check if version is included in $nvpStr else include the version.
    if(strlen(str_replace('VERSION=','', strtoupper($nvpstr))) == strlen($nvpstr)) 
    {
        $nvpstr = "&VERSION=" . urlencode($version) . $nvpstr;
    }
    $nvpreq="METHOD=".urlencode($methodName).$nvpstr;


    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$API_Endpoint);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POST, 1);

    //$nvpreq=”METHOD=”.urlencode($methodName).$nvpStr;

    //setting the nvpreq as POST FIELD to curl
    curl_setopt($ch,CURLOPT_POSTFIELDS,$nvpreq);

    //getting response from server
    $response = curl_exec($ch);

    //convrting NVPResponse to an Associative Array
    $nvpResArray=$this->deformatNVP($response);
    $nvpReqArray=$this->deformatNVP($nvpreq);


    if (curl_errno($ch)) 
    {
        echo "cURL Error";
        die;
        // moving to display page to display curl errors
        $_SESSION['curl_error_no']=curl_errno($ch) ;
        $_SESSION['curl_error_msg']=curl_error($ch);
        //$location = "APIError.php";
        //header("Location: $location");
    } 
    else 
    {
        //closing the curl
        curl_close($ch);
    }

    #### Checking error ###
    if(!empty($nvpResArray))
    {
        if($nvpResArray['ACK'] == 'Failure')
        {
            echo "ERROR : ". $errmsg = $nvpResArray["L_LONGMESSAGE0"];
            echo "<pre>";
            print_r($nvpResArray);
            die;
        }
    }

    // Print this array you will get some necessary info
    ################ Starting data insert##################

    if($nvpResArray['ACK'] == 'Success')
    {
        echo 'Success';
        print_r($nvpResArray);
        die;
        // save data into tables for Recurring Profile
    }



}

############### Function deformatNVP #########
/** This function will take NVPString and convert it to an Associative Array and it will decode the response.
 * It is usefull to search for a particular key and displaying arrays.
 * @nvpstr is NVPString.
 * @nvpArray is Associative Array.
 */
function deformatNVP ($nvpstr)
{
    $intial = 0;
    $nvpArray = array();
    while (strlen($nvpstr)) {
        //postion of Key
        $keypos = strpos($nvpstr, '=');
        //position of value
        $valuepos = strpos($nvpstr, '&') ? strpos($nvpstr, '&') : strlen(
        $nvpstr);
        /*getting the Key and Value values and storing in a Associative Array*/
        $keyval = substr($nvpstr, $intial, $keypos);
        $valval = substr($nvpstr, $keypos + 1, $valuepos - $keypos - 1);
        //decoding the respose
        $nvpArray[urldecode($keyval)] = urldecode($valval);
        $nvpstr = substr($nvpstr, $valuepos + 1, strlen($nvpstr));
    }
    return $nvpArray;
}
function formAutorization ($auth_token, $auth_signature, $auth_timestamp)
{
    $authString = "token=" . $auth_token . ",signature=" . $auth_signature .
     ",timestamp=" . $auth_timestamp;
    return $authString;
}