function DoReferenceTransaction($billing_agreement_id)
 {
     global $order, $order_total_modules;
     global $currencies;
     $method = "DoReferenceTransaction";
     $parm = "";
     $parm .= "&REFERENCEID=" . $billing_agreement_id;
     // 送付先
     $parm .= "&SHIPTONAME=" . paypal_esacpe_parm($order->delivery['firstname'] . ' ' . $order->delivery['lastname']);
     $parm .= "&SHIPTOSTREET=" . paypal_esacpe_parm($order->delivery['street_address']);
     $parm .= "&SHIPTOSTREET2=" . paypal_esacpe_parm($order->delivery['suburb']);
     $parm .= "&SHIPTOCITY=" . paypal_esacpe_parm($order->delivery['city']);
     $parm .= "&SHIPTOSTATE=" . paypal_esacpe_parm($order->delivery['state']);
     $parm .= "&SHIPTOZIP=" . paypal_esacpe_parm($order->delivery['postcode']);
     $parm .= "&SHIPTOCOUNTRYCODE=" . paypal_esacpe_parm($order->delivery['country']['iso_code_2']);
     $parm .= "&SHIPTOPHONENUM=" . paypal_esacpe_parm($order->delivery['telephone']);
     // 通貨
     if (MODULE_PAYMENT_PAYPAL_EC_CURRENCY == 'USER') {
         $amt = paypal_get_ot_total($order, $order_total_modules);
         $currency = $_SESSION['currency'];
     } else {
         $amt = paypal_get_ot_total($order, $order_total_modules, false);
         $currency = MODULE_PAYMENT_PAYPAL_EC_CURRENCY;
         $amt = number_format(paypal_convert_money_string($amt) * $currencies->get_value($currency), $currencies->get_decimal_places($currency));
         $amt = paypal_convert_money_string($amt);
     }
     // 金額
     //    $tax   = paypal_get_ot_tax($order, $order_total_modules);
     $parm .= "&AMT=" . $amt;
     $parm .= "&CURRENCYCODE=" . paypal_esacpe_parm($currency);
     //    $parm .= "&ITEMAMT=".(paypal_get_ot_subtotal($order, $order_total_modules)-$tax);
     //    $parm .= "&SHIPPINGAMT=".paypal_get_ot_shipping($order, $order_total_modules);
     //    $parm .= "&HANDLINGAMT=".paypal_get_ot_loworderfee($order, $order_total_modules);
     //    $parm .= "&SHIPDISCAMT=".paypal_get_ot_coupon($order, $order_total_modules);
     //    $parm .= "&TAXAMT=".$tax;
     $parm .= "&PAYMENTACTION=" . MODULE_PAYMENT_PAYPAL_EC_SETTLEMENT_TYPE;
     $parm .= "&L_PAYMENTREQUEST_0_NAME0=" . paypal_esacpe_parm(MODULE_PAYMENT_PAYPAL_TEXT_ITEMNAME);
     $parm .= "&L_PAYMENTREQUEST_0_AMT0=" . $amt;
     $parm .= "&L_PAYMENTREQUEST_0_QTY0=1";
     // 商品情報
     //    $no = 0;
     //    foreach($order->products as $product) {
     //      $tax   = 0;//$product['final_price']*$product['tax']/100;
     //      $parm .= "&L_NAME".$no."=".paypal_esacpe_parm($product['name']);
     //      $parm .= "&L_AMT".$no."=".($product['final_price']+$tax);
     //      $parm .= "&L_NUMBER".$no."=".paypal_esacpe_parm($product['model']);
     //      $parm .= "&L_QTY".$no."=".$product['qty'];
     //      $no++;
     //    }
     // API呼び出し
     $resArray = paypal_hash_call($method, $parm);
     $ack = strtoupper($resArray["ACK"]);
     if ($ack == "SUCCESS") {
         // do nothing
     } else {
         global $messageStack;
         $messageStack->add_session('checkout_payment', $resArray['L_LONGMESSAGE0'], 'error');
         zen_redirect(zen_href_link(FILENAME_CHECKOUT_PAYMENT, "", "SSL"));
         exit;
     }
 }
 /**
  * Build the data and actions to process when the "Submit" button is pressed on the order-confirmation screen.
  * This sends the data to the payment gateway for processing.
  * (These are hidden fields on the checkout confirmation page)
  *
  * @return string
  */
 function process_button()
 {
     global $db, $order, $currencies, $currency, $order_total_modules;
     $sql = "INSERT INTO " . TABLE_PAYPAL_SESSION . " (session_id,saved_session,expiry)" . " VALUES (:session_id,:saved_session,:expiry)";
     $sql = $db->bindVars($sql, ':session_id', zen_session_id(), 'string');
     $sql = $db->bindVars($sql, ':saved_session', '', 'string');
     $sql = $db->bindVars($sql, ':expiry', time() + 1 * 60 * 60 * 24 * 2, 'integer');
     $db->Execute($sql);
     $paypal_session_unique_id = $db->Insert_ID();
     $custom = $paypal_session_unique_id . '-' . md5($paypal_session_unique_id . MODULE_PAYMENT_PAYPAL_WPP_CUSTOM_KEY);
     if (MODULE_PAYMENT_PAYPAL_WPP_TEST == 'True') {
         $paypalUrl = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_hosted-payment';
     } else {
         $paypalUrl = 'https://www.paypal.com/cgi-bin/webscr?cmd=_hosted-payment';
     }
     if (MODULE_PAYMENT_PAYPAL_WPP_CURRENCY == 'User Selected Currency') {
         $amt = paypal_get_ot_total($order, $order_total_modules);
         $currency = $_SESSION['currency'];
     } else {
         $amt = paypal_get_ot_total($order, $order_total_modules, false);
         $currency = MODULE_PAYMENT_PAYPAL_WPP_CURRENCY;
         $amt = number_format(paypal_convert_money_string($amt) * $currencies->get_value($currency), $currencies->get_decimal_places($currency));
         $amt = paypal_convert_money_string($amt);
     }
     $_SESSION['paypal_session_unique_id'] = $paypal_session_unique_id;
     $_SESSION['paypal_subtotal'] = $amt;
     $_SESSION['paypal_currency'] = $currency;
     $sql = "UPDATE " . TABLE_PAYPAL_SESSION . " SET saved_session=:saved_session" . " WHERE unique_id='" . (int) $paypal_session_unique_id . "'";
     $sql = $db->bindVars($sql, ':saved_session', base64_encode(serialize($_SESSION)), 'string');
     $db->Execute($sql);
     $billing_country = '';
     if (strcasecmp($order->billing['country']['title'], 'Japan') === 0) {
         $billing_country = 'JP';
     }
     $delivery_country = '';
     if (strcasecmp($order->delivery['country']['title'], 'Japan') === 0) {
         $delivery_country = 'JP';
     }
     $process_button_string = zen_draw_hidden_field('business', MODULE_PAYMENT_PAYPAL_WPP_MERCHANT_ID) . zen_draw_hidden_field('subtotal', $amt) . zen_draw_hidden_field('currency_code', $currency) . zen_draw_hidden_field('buyer_email', $order->customer['email_address']) . zen_draw_hidden_field('billing_country', $billing_country) . zen_draw_hidden_field('billing_zip', str_replace('-', '', $order->billing['postcode'])) . zen_draw_hidden_field('billing_state', $order->billing['state']) . zen_draw_hidden_field('billing_city', $order->billing['city']) . zen_draw_hidden_field('billing_address1', $order->billing['street_address']) . zen_draw_hidden_field('billing_address2', $order->billing['suburb']) . zen_draw_hidden_field('billing_last_name', $order->billing['firstname']) . zen_draw_hidden_field('billing_first_name', $order->billing['lastname']) . zen_draw_hidden_field('country', $delivery_country) . zen_draw_hidden_field('zip', str_replace('-', '', $order->delivery['postcode'])) . zen_draw_hidden_field('state', $order->delivery['state']) . zen_draw_hidden_field('city', $order->delivery['city']) . zen_draw_hidden_field('address1', $order->delivery['street_address']) . zen_draw_hidden_field('address2', $order->delivery['suburb']) . zen_draw_hidden_field('last_name', $order->delivery['firstname']) . zen_draw_hidden_field('first_name', $order->delivery['lastname']) . zen_draw_hidden_field('custom', $custom) . zen_draw_hidden_field('return', zen_href_link(FILENAME_CHECKOUT_SUCCESS_PAYPAL_IPN_WAITING, '', 'SSL')) . zen_draw_hidden_field('paymentaction', MODULE_PAYMENT_PAYPAL_WPP_SETTLEMENT_TYPE) . zen_draw_hidden_field('cancel_return', zen_href_link(FILENAME_CHECKOUT_CONFIRMATION, '', 'SSL')) . zen_draw_hidden_field('paypal_url', $paypalUrl);
     return $process_button_string;
 }