diff --git a/src/Plugin/Commerce/PaymentGateway/Payflow.php b/src/Plugin/Commerce/PaymentGateway/Payflow.php
index e823e0d..deb242e 100644
--- a/src/Plugin/Commerce/PaymentGateway/Payflow.php
+++ b/src/Plugin/Commerce/PaymentGateway/Payflow.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\commerce_paypal\Plugin\Commerce\PaymentGateway;
 
+use Drupal\commerce_order\Entity\OrderInterface;
 use Drupal\commerce_payment\CreditCard;
 use Drupal\commerce_payment\Entity\PaymentInterface;
 use Drupal\commerce_payment\Entity\PaymentMethodInterface;
@@ -16,6 +17,7 @@ use Drupal\commerce_price\RounderInterface;
 use Drupal\Component\Datetime\TimeInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\profile\Entity\ProfileInterface;
 use GuzzleHttp\ClientInterface;
 use GuzzleHttp\Exception\RequestException;
 use InvalidArgumentException;
@@ -210,15 +212,124 @@ class Payflow extends OnsitePaymentGatewayBase implements PayflowInterface {
    *   The new parameters.
    */
   protected function getParameters(array $parameters = []) {
-    $defaultParameters = [
+    $default_parameters = [
       'tender' => 'C',
+      'trxtype' => 'S',
       'partner' => $this->getPartner(),
       'vendor' => $this->getVendor(),
       'user' => $this->getUser(),
       'pwd' => $this->getPassword(),
     ];
 
-    return $parameters + $defaultParameters;
+    return $parameters + $default_parameters;
+  }
+
+  /**
+   * Populate the order details into the request parameters array.
+   *
+   * @param array $parameters
+   *   The request parameters.
+   * @param \Drupal\commerce_order\Entity\OrderInterface $order
+   *   The order.
+   *
+   * @return array
+   *   The updated request parameters.
+   */
+  protected function populateOrderParameters(array $parameters, OrderInterface $order) {
+    $default_parameters = [
+      'invnum' => $order->getOrderNumber(),
+      'email' => $order->getEmail(),
+      'billtoemail' => $order->getEmail(),
+    ];
+
+    $customer_id = $order->getCustomerId();
+    if (!empty($customer_id)) {
+      $default_parameters['custcode'] = $order->getCustomerId();
+    }
+
+    $parameters += $default_parameters;
+
+    if ($order->hasField('shipping_profile') && !$order->get('shipping_profile')->isEmpty()) {
+      $shipping_profile = $order->get('shipping_profile')->entity;
+      if ($shipping_profile instanceof ProfileInterface) {
+        $parameters = $this->populateShippingProfileParameters($parameters, $shipping_profile);
+      }
+    }
+
+    $parameters = $this->populateBillingProfileParameters($parameters, $order->getBillingProfile());
+
+    return $parameters;
+  }
+
+  /**
+   * Populate billing profile information into the request parameters.
+   *
+   * @param array $parameters
+   *   The existing request parameters.
+   * @param \Drupal\profile\Entity\ProfileInterface $profile
+   *   The billing profile.
+   *
+   * @return array
+   *   The updated request parameters.
+   */
+  protected function populateBillingProfileParameters(array $parameters, ProfileInterface $profile) {
+    /** @var \Drupal\address\Plugin\Field\FieldType\AddressItem $address */
+    $address = $profile->get('address')->first();
+
+    $default_parameters = [
+      'firstname' => $address->getGivenName(),
+      'lastname' => $address->getFamilyName(),
+      'street' => $address->getAddressLine1(),
+      'city' => $address->getLocality(),
+      'state' => $address->getAdministrativeArea(),
+      'zip' => $address->getPostalCode(),
+      'email' => $profile->getOwner()->getEmail(),
+      'billtofirstname' => $address->getGivenName(),
+      'billtolastname' => $address->getFamilyName(),
+      'billtostreet' => $address->getAddressLine1(),
+      'billtocity' => $address->getLocality(),
+      'billtostate' => $address->getAdministrativeArea(),
+      'billtozip' => $address->getPostalCode(),
+      'billtocountry' => $address->getCountryCode(),
+      'billtoemail' => $profile->getOwner()->getEmail(),
+    ];
+
+    return $parameters + $default_parameters;
+  }
+
+  /**
+   * Populate shipping profile information into the request parameters.
+   *
+   * @param array $parameters
+   *   The existing request parameters.
+   * @param \Drupal\profile\Entity\ProfileInterface $profile
+   *   The shipping profile.
+   *
+   * @return array
+   *   The updated request parameters.
+   */
+  protected function populateShippingProfileParameters(array $parameters, ProfileInterface $profile) {
+    /** @var \Drupal\address\Plugin\Field\FieldType\AddressItem $address */
+    $address = $profile->get('address')->first();
+
+    $default_parameters = [
+      'firstname' => $address->getGivenName(),
+      'lastname' => $address->getFamilyName(),
+      'street' => $address->getAddressLine1(),
+      'city' => $address->getLocality(),
+      'state' => $address->getAdministrativeArea(),
+      'zip' => $address->getPostalCode(),
+      'email' => $profile->getOwner()->getEmail(),
+      'shiptofirstname' => $address->getGivenName(),
+      'shiptolastname' => $address->getFamilyName(),
+      'shiptostreet' => $address->getAddressLine1(),
+      'shiptocity' => $address->getLocality(),
+      'shiptostate' => $address->getAdministrativeArea(),
+      'shiptozip' => $address->getPostalCode(),
+      'shiptocountry' => $address->getCountryCode(),
+    ];
+
+    return $parameters + $default_parameters;
   }
 
   /**
@@ -251,11 +362,11 @@ class Payflow extends OnsitePaymentGatewayBase implements PayflowInterface {
    *   An array of the result values.
    */
   protected function prepareResult($body) {
-    $responseParts = explode('&', $body);
+    $response_parts = explode('&', $body);
 
     $result = [];
-    foreach ($responseParts as $bodyPart) {
-      list($key, $value) = explode('=', $bodyPart, 2);
+    foreach ($response_parts as $response_part) {
+      list($key, $value) = explode('=', $response_part, 2);
       $result[strtolower($key)] = $value;
     }
 
@@ -327,14 +438,16 @@ class Payflow extends OnsitePaymentGatewayBase implements PayflowInterface {
     $this->validatePayment($payment, 'new');
 
     try {
-      $data = $this->executeTransaction([
+      $parameters = [
         'trxtype' => $capture ? 'S' : 'A',
         'amt' => $this->rounder->round($payment->getAmount())->getNumber(),
         'currencycode' => $payment->getAmount()->getCurrencyCode(),
         'origid' => $payment->getPaymentMethod()->getRemoteId(),
         'verbosity' => 'HIGH',
-        // 'orderid' => $payment->getOrderId(),
-      ]);
+      ];
+      $parameters = $this->populateOrderParameters($parameters, $payment->getOrder());
+      $data = $this->executeTransaction($parameters);
+
       if ($data['result'] !== '0') {
         throw new HardDeclineException('Could not charge the payment method. Response: ' . $data['respmsg'], $data['result']);
       }
@@ -391,9 +504,9 @@ class Payflow extends OnsitePaymentGatewayBase implements PayflowInterface {
   public function voidPayment(PaymentInterface $payment) {
     $this->validatePayment($payment, 'authorization');
 
-    $remoteId = $payment->getRemoteId();
+    $remote_id = $payment->getRemoteId();
 
-    if (empty($remoteId)) {
+    if (empty($remote_id)) {
       throw new PaymentGatewayException('Remote authorization ID could not be determined.');
     }
 
@@ -465,25 +578,16 @@ class Payflow extends OnsitePaymentGatewayBase implements PayflowInterface {
    */
   public function createPaymentMethod(PaymentMethodInterface $payment_method, array $payment_details) {
     try {
-      /** @var \Drupal\address\Plugin\Field\FieldType\AddressItem $address */
-      $address = $payment_method->getBillingProfile()->get('address')->first();
-
-      $data = $this->executeTransaction([
+      $parameters = [
         'trxtype' => 'A',
         'amt' => 0,
         'verbosity' => 'HIGH',
         'acct' => $payment_details['number'],
         'expdate' => $this->getExpirationDate($payment_details),
         'cvv2' => $payment_details['security_code'],
-        'billtoemail' => $payment_method->getOwner()->getEmail(),
-        'billtofirstname' => $address->getGivenName(),
-        'billtolastname' => $address->getFamilyName(),
-        'billtostreet' => $address->getAddressLine1(),
-        'billtocity' => $address->getLocality(),
-        'billtostate' => $address->getAdministrativeArea(),
-        'billtozip' => $address->getPostalCode(),
-        'billtocountry' => $address->getCountryCode(),
-      ]);
+      ];
+      $parameters = $this->populateBillingProfileParameters($parameters, $payment_method->getBillingProfile());
+      $data = $this->executeTransaction($parameters);
 
       if ($data['result'] !== '0') {
         throw new HardDeclineException("Unable to verify the credit card: " . $data['respmsg'], $data['result']);
