array( 'Type' => 'System', 'Value' => 'Stripe Alipay', ), // a text field type allows for single line text input 'sk_test' => array( 'FriendlyName' => 'Test Secret Key', 'Type' => 'text', 'Size' => '32', 'Default' => '', ), 'pk_test' => array( 'FriendlyName' => 'Test Publishable Key', 'Type' => 'text', 'Size' => '32', 'Default' => '', ), 'sk_live' => array( 'FriendlyName' => 'Live Secret Key', 'Type' => 'text', 'Size' => '32', 'Default' => '', ), 'pk_live' => array( 'FriendlyName' => 'Live Publishable Key', 'Type' => 'text', 'Size' => '32', 'Default' => '', ), // the yesno field type displays a single checkbox option 'force_email' => array( 'FriendlyName' => 'Force Email', 'Type' => 'yesno', 'Description' => 'Forcing users to use account email', ), 'remember_me' => array( 'FriendlyName' => 'Remember Me', 'Type' => 'yesno', 'Description' => 'Specify whether to include the option to "Remember Me" for future purchases', ), 'test_mode' => array( 'FriendlyName' => 'Test Mode', 'Type' => 'yesno', 'Description' => 'Tick to enable test mode', ), ); } /** * Payment link. * * Required by third party payment gateway modules only. * * Defines the HTML output displayed on an invoice. Typically consists of an * HTML form that will take the user to the payment gateway endpoint. * * @param array $params Payment Gateway Module Parameters * * @see http://docs.whmcs.com/Payment_Gateway_Module_Parameters * * @return string */ function stripe_checkout_link($params) { // Gateway Configuration Parameters if ($params['test_mode']) { $s_key = $params['sk_test']; $p_key = $params['pk_test']; } else { $s_key = $params['sk_live']; $p_key = $params['pk_live']; } // Invoice Parameters $invoiceId = $params['invoiceid']; $description = $params["description"]; $amount = $params['amount']; $currencyCode = $params['currency']; if ($currencyCode == 'USD') { $amount = $amount * 100; // cent } else { $amount = 0; // doesn't support other currency } // Client Parameters $firstname = $params['clientdetails']['firstname']; $lastname = $params['clientdetails']['lastname']; $email = $params['clientdetails']['email']; $address1 = $params['clientdetails']['address1']; $address2 = $params['clientdetails']['address2']; $city = $params['clientdetails']['city']; $state = $params['clientdetails']['state']; $postcode = $params['clientdetails']['postcode']; $country = $params['clientdetails']['country']; $phone = $params['clientdetails']['phonenumber']; // System Parameters $companyName = $params['companyname']; $systemUrl = $params['systemurl']; $returnUrl = $params['returnurl']; $langPayNow = $params['langpaynow']; $moduleDisplayName = $params['name']; $moduleName = $params['paymentmethod']; $whmcsVersion = $params['whmcsVersion']; if ($_POST) { $token = $_POST['stripeToken']; Stripe::setApiKey($s_key); try { if (in_array(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2), array('zh', 'cn'))) { $p = '��������'; } else { $p = 'Processing...'; } $payload = array( "amount" => $amount, "currency" => strtolower($currencyCode), "source" => $token, // obtained with Stripe.js "description" => $description ); $charge = Charge::create($payload); logModuleCall($moduleDisplayName, 'Charge::create', $payload, $charge, $charge, array()); $transactionStatus = $charge->paid ? 'Success' : 'Failure'; /** * Validate Callback Invoice ID. * * Checks invoice ID is a valid invoice number. Note it will count an * invoice in any status as valid. * * Performs a die upon encountering an invalid Invoice ID. * * Returns a normalised invoice ID. */ $invoiceId = checkCbInvoiceID($invoiceId, $moduleDisplayName); /** * Check Callback Transaction ID. * * Performs a check for any existing transactions with the same given * transaction number. * * Performs a die upon encountering a duplicate. */ checkCbTransID($charge->id); /** * Log Transaction. * * Add an entry to the Gateway Log for debugging purposes. * * The debug data can be a string or an array. In the case of an * array it will be * * @param string $gatewayName Display label * @param string|array $debugData Data to log * @param string $transactionStatus Status */ $transaction = Stripe_BalanceTransaction::retrieve($charge->balance_transaction); logTransaction($moduleDisplayName, $transaction, $transactionStatus); if ($charge->paid) { /** * Add Invoice Payment. * * Applies a payment transaction entry to the given invoice ID. * * @param int $invoiceId Invoice ID * @param string $transactionId Transaction ID * @param float $paymentAmount Amount paid (defaults to full balance) * @param float $paymentFee Payment fee (optional) * @param string $gatewayModule Gateway module name */ addInvoicePayment( $invoiceId, $charge->id, $transaction->amount / 100, //cent $transaction->fee / 100, //cent basename(__FILE__, '.php') ); } } catch (Stripe_CardError $e) { logTransaction($moduleDisplayName, $e, 'Stripe_CardError'); $p = 'The card was declined.'; } catch (Exception $e) { logTransaction($moduleDisplayName, $e, 'Exception'); $p = 'Something else happened.'; } $htmlOutput = '

' . $p . '

'; } else { if ($params['force_email']) { $force_email = ' data-email="' . $email . '"'; } else { $force_email = ''; } if ($params['remember_me']) { $remember_me = ' data-allow-remember-me="true"'; } else { $remember_me = ' data-allow-remember-me="false"'; } $htmlOutput = '
'; } return $htmlOutput; } /** * Refund transaction. * * Called when a refund is requested for a previously successful transaction. * * @param array $params Payment Gateway Module Parameters * * @see http://docs.whmcs.com/Payment_Gateway_Module_Parameters * * @return array Transaction response status */ function stripe_checkout_refund($params) { // Gateway Configuration Parameters if ($params['test_mode']) { $s_key = $params['sk_test']; } else { $s_key = $params['sk_live']; } // Transaction Parameters $transactionIdToRefund = $params['transid']; $refundAmount = $params['amount']; $currencyCode = $params['currency']; if (substr($transactionIdToRefund, 0, 2) == 'py') { // Alipay doesn't refund processing fee $refundAmount = round($refundAmount - ($refundAmount * 0.029 + 0.3), 2); } if ($currencyCode == 'USD') { $refundAmount = $refundAmount * 100; // cent } else { $refundAmount = 0; // doesn't support other currency } // Client Parameters $firstname = $params['clientdetails']['firstname']; $lastname = $params['clientdetails']['lastname']; $email = $params['clientdetails']['email']; $address1 = $params['clientdetails']['address1']; $address2 = $params['clientdetails']['address2']; $city = $params['clientdetails']['city']; $state = $params['clientdetails']['state']; $postcode = $params['clientdetails']['postcode']; $country = $params['clientdetails']['country']; $phone = $params['clientdetails']['phonenumber']; // System Parameters $companyName = $params['companyname']; $systemUrl = $params['systemurl']; $langPayNow = $params['langpaynow']; $moduleDisplayName = $params['name']; $moduleName = $params['paymentmethod']; $whmcsVersion = $params['whmcsVersion']; // perform API call to initiate refund and interpret result Stripe::setApiKey($s_key); try { $charge = Charge::retrieve($transactionIdToRefund); $payload = array('amount' => $refundAmount); $re = $charge->refunds->create($payload); logModuleCall($moduleDisplayName, '\Stripe\Refund::create', $payload, $re, $re, array()); $transaction = Stripe_BalanceTransaction::retrieve($re->balance_transaction); return array( // 'success' if successful, otherwise 'declined', 'error' for failure 'status' => 'success', // Data to be recorded in the gateway log - can be a string or array 'rawdata' => $transaction, // Unique Transaction ID for the refund transaction 'transid' => $re->id, ); } catch (Exception $e) { return array( // 'success' if successful, otherwise 'declined', 'error' for failure 'status' => 'error', // Data to be recorded in the gateway log - can be a string or array 'rawdata' => $e, ); } }