2014-04-25 22 views
1

我的代碼如下。問題是,每個信用號碼。它只提供一個橫斷面的機會。我該如何解決多次橫斷問題從相同的(測試)信用no.//////////////例外情況:在使用beanstream支付網關時支付信息重複匹配?

// Create a credit card object 
$card = new BeanstreamCard(); 
$card->setOwner('Anil Bhattarai'); 
$card->setNumber('40300000100'); 
$card->setExpiryMonth(8); 
$card->setExpiryYear(18); 
$card->setCvd(123); 

// Account billing info 
$billing = new BeanstreamBilling(); 
$billing->setEmail('[email protected]'); 
$billing->setPhone('555-5555'); 
$billing->setName('Anil Bhattarai'); 
$billing->setAddress('987 Cardero Street'); 
$billing->setPostalCode('V6G2G8'); 
$billing->setProvince('BC'); 
$billing->setCountry('CA'); 
$billing->setCity('Vancouver'); 

// Create a billing profile with the card and billing info 
$profile = new BeanstreamProfile('300200320', '6e7550d8304749A7A45A5c9Da8C5a002'); 

$profile->setCard($card); 
$profile->setBilling($billing); 
try { 
    $profile->save(); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 
// Create and process a new transaction using the passcode 
$trans = new BeanstreamTransaction($merchantId); 
$trans->setCustomerCode($profile->getCustomerCode()); 
$trans->setAmount('250.00'); 
$trans->setOrderNumber(time()); 
$trans->setRef('My test charge'); 
$trans->setUsername('rambabu'); 
$trans->setPassword('6M7sO2psXwsk'); 
try { 
    $result = $trans->process(); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 
class BeanstreamBilling { 

    protected $name; 
    protected $email; 
    protected $phone; 
    protected $address; 
    protected $postalCode; 
    protected $province; 
    protected $city; 
    protected $country; 

    public function getName() { 
     return $this->name; 
    } 

    public function setName($name) { 
     $this->name = $name; 
    } 

    public function getEmail() { 
     return $this->email; 
    } 

    public function setEmail($email) { 
     $this->email = $email; 
    } 

    public function getPhone() { 
     return $this->phone; 
    } 

    public function setPhone($phone) { 
     $this->phone = $phone; 
    } 

    public function getAddress() { 
     return $this->address; 
    } 

    public function setAddress($address) { 
     $this->address = $address; 
    } 

    public function getPostalCode() { 
     return $this->postalCode; 
    } 

    public function setPostalCode($postalCode) { 
     $this->postalCode = $postalCode; 
    } 

    public function getCity() { 
     return $this->city; 
    } 

    public function setCity($city) { 
     $this->city = $city; 
    } 

    public function getProvince() { 
     return $this->province; 
    } 

    public function setProvince($province) { 
     $this->province = $province; 
    } 

    public function getCountry() { 
     return $this->country; 
    } 

    public function setCountry($country) { 
     $this->country = $country; 
    } 

    public function toArray() { 
     return array(
      'ordName' => $this->name, 
      'ordEmailAddress' => $this->email, 
      'ordPhoneNumber' => $this->phone, 
      'ordAddress1' => $this->address, 
      'ordPostalCode' => $this->postalCode, 
      'ordCity' => $this->city, 
      'ordProvince' => $this->province, 
      'ordCountry' => $this->country, 
     ); 
    } 

    public function fromArray($map) { 
     $this->setName($map['ordName']); 
     $this->setEmail($map['ordEmailAddress']); 
     $this->setPhone($map['ordPhoneNumber']); 
     $this->setAddress($map['ordAddress1']); 
     $this->setPostalCode($map['ordPostalCode']); 
     $this->setCity($map['ordCity']); 
     $this->setProvince($map['ordProvince']); 
     $this->setCountry($map['ordCountry']); 
    } 
} 

class BeanstreamCard { 

    protected $owner; 
    protected $number; 
    protected $expiryMonth; 
    protected $expiryYear; 
    protected $cvd; 

    public function getOwner() { 
     return $this->owner; 
    } 

    public function setOwner($owner) { 
     $this->owner = $owner; 
    } 

    public function getNumber() { 
     return $this->number; 
    } 

    public function setNumber($number) { 
     $this->number = $number; 
    } 

    public function getExpiryMonth() { 
     return $this->expiryMonth; 
    } 

    public function setExpiryMonth($expiryMonth) { 
     $this->expiryMonth = $expiryMonth; 
    } 

    public function getExpiryYear() { 
     return $this->expiryYear; 
    } 

    public function setExpiryYear($expiryYear) { 
     $this->expiryYear = $expiryYear; 
    } 

    public function getCvd() { 
     return $this->cvd; 
    } 

    public function setCvd($cvd) { 
     $this->cvd = $cvd; 
    } 

    public function toArray() { 
     return array(
      'trnCardOwner' => $this->owner, 
      'trnCardNumber' => $this->number, 
      'trnExpMonth' => $this->expiryMonth, 
      'trnExpYear' => $this->expiryYear, 
      'trnCardCvd' => $this->cvd, 
     ); 
    } 

    public function fromArray($map) { 
     $this->setOwner($map['trnCardOwner']); 
     $this->setNumber($map['trnCardNumber']); 
     $this->setExpiryMonth($map['trnExpMonth']); 
     $this->setExpiryYear($map['trnExpYear']); 
     $this->setCvd($map['trnCardCvd']); 
    } 
} 

class BeanstreamProfile { 

    protected $customerCode; 
    protected $merchantId; 
    protected $passCode; 

    const STATUS_NEW  = 'N'; 
    const STATUS_CLOSE = 'C'; 
    const STATUS_DISABLE = 'D'; 
    const STATUS_ENABLE = 'A'; 

    public function __construct($merchantId, $passCode) { 
     $this->merchantId = $merchantId; 
     $this->passCode = $passCode; 
    } 

    public function getMerchantId() { 
     return $this->merchantId; 
    } 

    public function setMerchantId($merchantId) { 
     $this->merchantId = $merchantId; 
    } 

    public function getPassCode() { 
     return $this->passCode; 
    } 

    public function setPassCode($passCode) { 
     $this->passCode = $passCode; 
    } 

    public function getCustomerCode() { 
     return $this->customerCode; 
    } 

    public function setCustomerCode($customerCode) { 
     $this->customerCode = $customerCode; 
    } 

    public function getBilling() { 
     return $this->billing; 
    } 

    public function setBilling($billing) { 
     $this->billing = $billing; 
    } 

    public function getCard($card) { 
     return $card; 
    } 

    public function setCard($card) { 
     $this->card = $card; 
    } 

    public static function load($merchantId, $passCode, $customerCode) { 
     $params = array(
      'serviceVersion' => '1.1', 
      'responseFormat' => 'QS', 
      'operationType' => 'Q', 
      'merchantId'  => $merchantId, 
      'passCode'  => $passCode, 
      'customerCode' => $customerCode, 
     ); 

     $request = new BeanstreamRequest($params, Beanstream::URL_PROFILE); 
     $response = $request->makeRequest(); 

     throw new BeanstreamInvalidProfileException(); 
    } 

    public function save($statusCode = 'A', $validateCard = false) { 
     $isNew = empty($this->customerCode); 

     $params = array(
      'serviceVersion' => '1.1', 
      'responseFormat' => 'QS', 
      'operationType' => $isNew ? 'N' : 'M', 
      'cardValidation' => (int)$validateCard, 
      'merchantId'  => $this->merchantId, 
      'passCode'  => $this->passCode, 
      'status'   => $statusCode, 
     ); 

     $params += $this->billing->toArray(); 

     if ($isNew) { 
      if (empty($this->card)) { 
       throw new InvalidArgumentException('No credit card data provided.'); 
      } 
      if (empty($this->billing)) { 
       throw new InvalidArgumentException('No billing data provided.'); 
      } 
      $params += $this->card->toArray(); 
     } 
     else { 
      $params['customerCode'] = $this->customerCode; 
     } 
     $request = new BeanstreamRequest($params, Beanstream::URL_PROFILE); 
     $response = $request->makeRequest(); 
     if ($response->getValue('responseCode') == 1) { 
      $this->customerCode = $response->getValue('customerCode'); 
      return TRUE; 
     } 
     else { 
      throw new BeanstreamException($response->getValue('responseCode'), $response->getValue('responseMessage')); 
     } 
    } 

    public function enable() { 
     return $this->save(self::STATUS_ENABLE); 
    } 

    public function disable() { 
     return $this->save(self::STATUS_DISABLE); 
    } 

    public function close() { 
     return $this->save(self::STATUS_CLOSE); 
    } 
} 

class Beanstream { 
    const URL_PROCESS = 'https://www.beanstream.com/scripts/process_transaction.asp'; 
    const URL_PROFILE = 'https://www.beanstream.com/scripts/payment_profile.asp'; 
    const URL_RECUR = 'https://www.beanstream.com/scripts/recurring_billing.asp'; 
} 

class BeanstreamRequest { 

    protected $params; 
    protected $url; 

    public function __construct($params, $url) { 
     $this->url = $url; 
     $this->params = $params; 
    } 

    public function makeRequest() { 
     $ch = curl_init(); 
     $data = http_build_query($this->params, NULL, '&'); 
     curl_setopt($ch, CURLOPT_POST, 1); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt($ch, CURLOPT_URL, $this->url); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
     $response = curl_exec($ch); 
     return new BeanstreamResponse($response); 
    } 
} 

class BeanstreamResponse { 
    protected $map; 

    public function __construct($data) { 
     $this->_parse($data); 
    } 

    protected function _parse($data) { 
     parse_str($data, $this->map); 
    } 

    public function getValue($name) { 
     return !empty($this->map[$name]) ? $this->map[$name] : NULL; 
    } 
} 

class BeanstreamTransaction { 

    const TYPE_PURCHASE  = 'P'; 
    const TYPE_REFUND   = 'R'; 
    const TYPE_VOID_PURCHASE = 'VP'; 
    const TYPE_VOID_REFUND = 'VR'; 
    const TYPE_PURCHASE_AUTH = 'PA'; 

    protected $card; 
    protected $billing; 
    protected $amount; 
    protected $description; 
    protected $requestType = 'BACKEND'; 
    protected $type; 
    protected $url; 
    protected $username; 
    protected $password; 

    public function __construct($merchantId) { 
     $this->merchantId = $merchantId; 
     $this->url = Beanstream::URL_PROCESS; 
     $this->type = self::TYPE_PURCHASE; 
    } 

    public function getType() { 
     return $this->type; 
    } 

    public function setType($type) { 
     $this->type = $type; 
    } 

    public function getCard() { 
     return $this->card; 
    } 

    public function setCard($card) { 
     $this->card = $card; 
    } 

    public function getBilling() { 
     return $this->billing; 
    } 

    public function setBilling($billing) { 
     $this->billing = $billing; 
    } 

    public function getUsername() { 
     return $this->username; 
    } 

    public function setUsername($username) { 
     $this->username = $username; 
    } 

    public function getPassword() { 
     return $this->password; 
    } 

    public function setPassword($password) { 
     $this->password = $password; 
    } 

    public function getAmount() { 
     return $this->amount; 
    } 

    public function setAmount($amount) { 
     if (!is_numeric($amount)) { 
      throw new InvalidArgumentException('Invalid amount.'); 
     } 
     $this->amount = $amount; 
    } 

    public function getDescription() { 
     return $this->description; 
    } 

    public function setDescription($description) { 
     $this->description = $description; 
    } 

    public function getOrderNumber() { 
     return $this->orderNumber; 
    } 

    public function setOrderNumber($orderNumber) { 
     $this->orderNumber = $orderNumber; 
    } 

    public function getRef() { 
     return $this->ref; 
    } 

    public function setRef($ref) { 
     $this->ref = $ref; 
    } 

    public function getUrl() { 
     return $this->url; 
    } 

    public function setUrl($url) { 
     $this->url = $url; 
    } 

    public function getCustomerCode() { 
     return $this->customerCode; 
    } 

    public function setCustomerCode($customerCode) { 
     $this->customerCode = $customerCode; 
    } 

    protected function getParams() { 
     return array(
      'requestType' => $this->requestType, 
      'merchant_id' => $this->merchantId, 
      'trnType' => $this->type, 
      'trnOrderNumber' => $this->orderNumber, 
      'trnAmount' => $this->amount, 
      'ref1' => $this->ref, 
      'username' => $this->username, 
      'password' => $this->password, 
     ); 
    } 

    public function process() { 
     $params = $this->getParams(); 
     if (!empty($this->customerCode)) { 
      $params['customerCode'] = $this->customerCode; 
     } 
     else { 
      if (!empty($this->billing)) { 
       $params += $this->billing->toArray(); 
      } 
      if (!empty($this->card)) { 
       $params += $this->card->toArray(); 
      } 
     } 
     $request = new BeanstreamRequest($params, Beanstream::URL_PROCESS); 
     return $request->makeRequest(); 
    } 
} 

class BeanstreamException extends Exception { 

    protected $code; 
    protected $message; 

    public function __construct($code, $message) { 
     $this->code = $code; 
     $this->message = $message; 
    } 

    public function __toString() { 
     return sprintf('%d - %s', $this->code, $this->message); 
    } 
} 

回答

1

最後我做到了,我很分享它,因爲我認爲它可能對其他像我一樣痛苦的人有用。並感謝大家的支持。

<?php 

     $post_variables = Array(
      "errorPage"=>"https://www.beanstream.com/samples/order_form.asp", // ## NOT REQUIRED ## 
      "trnCardNumber"=>"40300000100", //test MC number 
      "trnExpMonth"=>"12", //testing 
      "trnExpYear"=>"12", //testing 
      "trnOrderNumber"=>"1234", 
      "trnAmount"=>"34.00", 
      "trnCardOwner"=>"Anil Bhattarai", 
      "ordAddress1"=>"Pokhara", 
      "ordAddress2"=>"Nepal", 
      "ordCity"=>"Vancouver", 
      "ordProvince"=>"BC", 
      "ordPostalCode"=>"V6G2G8", 
      "ordName"=>"Khachang khuchung", 
      "ordEmailAddress"=>"[email protected]", 
      "ordPhoneNumber"=>"555-5555", 
      "ordCountry"=>"CA", 
      //**************************************************************************** 
      "merchant_id"=>"300200320" // << FILL THIS IN WITH YOUR MERCH ID NUMBER ## 
      //**************************************************************************** 
     ); 

     // ## MODIFY THIS TEXT TO SUIT YOUR NEEDS ## 
     echo ' <div class="BS"> <h3>Please read the following information, and click the button to continue.</h3> <p>You will be directed to a secure payment form hosted by Beanstream, where you may pay for your order using VISA or Mastercard. Once we receive confirmation of payment from Beanstream, we will ship your order. Thank you.</p> </div>'; 

     echo '<label><h4>Proceed to Credit Card Processing &rarr;</h4></label> '; 
     foreach($post_variables as $name => $value) { 
      echo '<input type="hidden" id="'.$name.'" name="'.$name.'" value="'.htmlspecialchars($value).'" />'; 
     } 


     ?> 

     <div id="ram"> 

     </div> 
     <div id="sam"></div> 

     <input type="button" id="pay" value="make a payment"/>  
    <script> 
     $("#pay").click(function(e) 
       { 
        var cardnumber=$('#ocard').val(); 
        var trnExpMonth=$('#expiry_month').val(); 
        var trnExpYear=$('#expiry_year').val(); 
        var trnOrderNumber=$('#ordrrno').val(); 
        var trnCardOwner=$('#oname').val(); 
        var trnAmount='<?php echo $_SESSION['grandTotal']; ?>'; 
        var merchant_id='<?php echo $_SESSION['merchant']; ?>'; 
        var trnEmailAddress='<?php echo $_SESSION['myemail']; ?>'; 
        alert(trnAmount); 
        var pdata = {}; 
        pdata["errorPage"] = "https://www.beanstream.com/samples/order_form.asp"; 
        pdata["trnCardNumber"] = cardnumber; 
        pdata["trnExpMonth"] = trnExpMonth; 
        pdata["trnExpYear"] = trnExpYear; 
        pdata["trnOrderNumber"] = trnOrderNumber; 
        pdata["trnAmount"] = trnAmount; 
        pdata["trnCardOwner"] = trnCardOwner; 
        pdata["merchant_id"] = merchant_id; 
        pdata["trnEmailAddress"]=trnEmailAddress;, 
        $.ajax(
         { 
          url : "https://www.beanstream.com/scripts/process_transaction.asp", 
          type: "POST", 
          data : pdata, 
          success:function(data, textStatus, jqXHR) 
          { 
           $('#ram').html("<b>hello</b>"+data); 
           if (data.indexOf('Transaction Approved') >= 0) { 
            console.log(data); 
            parser=new DOMParser(); 
            htmlDoc=parser.parseFromString(data, "text/html"); 
            var table = htmlDoc.body.children[0].children[0].rows[0].cells[0].children[3].children[0].rows[0].cells[1].children[0].innerHTML; 
            //alert(table.rows[0].cells[0].innerHTML) 
            alert(table); 

           } else { 

           }; 
          }, 
          error: function(jqXHR, textStatus, errorThrown) 
          { 

          } 
         }); 
        e.preventDefault(); //STOP default action 
       }); 
      </script> 

enter code here

1
<form action="https://www.beanstream.com/scripts/process_transaction.asp" method="post"> 
    <input type="text" name="merchant_id" value="YOUR-MERCHANT-ID" /> 
    <input type="text" name="trnAmount" value="5.00" /> 
    <input type="text" name="paymentMethod" value="CC" /> 
    <input type="text" name="trnCardOwner" value="John Doe" /> 
    <input type="text" name="trnCardType" value="VI" /> 
    <input type="text" name="trnCardNumber" value="40300000100" /> 
    <input type="text" name="trnExpMonth" value="01" /> 
    <input type="text" name="trnExpYear" value="17" /> 
    <input type="text" name="trnCardCvd" value="123" /> 

    <input type="submit" id="submitButton" value="Submit Payment"> 
+2

基礎知識是這樣的,但我不想將它重定向到beanstream的網站,所以我可以使我的應用程序在移動瀏覽器中可靠。 –

1
$billing = new BeanstreamBilling(); 
$billing->setEmail('[email protected]'); 
$billing->setPhone('555-5555'); 
$billing->setName('Anil Bhattarai'); 
$billing->setAddress('987 Cardero Street'); 
$billing->setPostalCode('V6G2G8'); 
$billing->setProvince('BC'); 
$billing->setCountry('CA'); 
$billing->setCity('Vancouver'); 

我覺得有什麼錯here.So請刪除此部分,並嘗試,它會解決這個問題。