Javascript Stripe在本地返回成功的测试事务,但不在活动页面上返回
我已经使用sslw/MAMP-Pro设置了页面,以便在本地服务器上执行测试事务。当提交时,我得到了“信用卡成功收费”,我看到交易通过了Stripe的测试支付数据页面。当上传到服务器(带有有效的SSL证书)时,我得到“错误:调用pay.php处理事务失败”。奇怪的是,事务在Stripe端成功完成。我不明白为什么反应不同。我的PHP错误日志中没有错误,在记录提交的变量时,所有内容都会检查出来 buy-controller.js:Javascript Stripe在本地返回成功的测试事务,但不在活动页面上返回,javascript,php,jquery,Javascript,Php,Jquery,我已经使用sslw/MAMP-Pro设置了页面,以便在本地服务器上执行测试事务。当提交时,我得到了“信用卡成功收费”,我看到交易通过了Stripe的测试支付数据页面。当上传到服务器(带有有效的SSL证书)时,我得到“错误:调用pay.php处理事务失败”。奇怪的是,事务在Stripe端成功完成。我不明白为什么反应不同。我的PHP错误日志中没有错误,在记录提交的变量时,所有内容都会检查出来 buy-controller.js: function stripeResponseHandler(stat
function stripeResponseHandler(status, response)
{
if (response.error)
{
// Stripe.js failed to generate a token. The error message will explain why.
// Usually, it's because the customer mistyped their card info.
// You should customize this to present the message in a pretty manner:
alert(response.error.message);
}
else
{
// Stripe.js generated a token successfully. We're ready to charge the card!
var token = response.id;
var fName = $('#first_name').val();
var lName = $('#last_name').val();
var email = $('#email').val();
// alert(fName);
// alert(lName); WORKS
// We need to know what amount to charge. Assume $20.00 for the tutorial.
// You would obviously calculate this on your own:
var price = 70;
// Make the call to the server-script to process the order.
// Pass the token and non-sensitive form information.
var request = $.ajax ({
type: "POST",
url: "../pay.php",
dataType: "json",
data: {
"stripeToken" : token,
"fName" : fName,
"lName" : lName,
"email" : email,
"price" : price
}
});
request.done(function(msg)
{
if (msg.result === 0)
{
// Customize this section to present a success message and display whatever
// should be displayed to the user.
alert("The credit card was charged successfully!");
}
else
{
// The card was NOT charged successfully, but we interfaced with Stripe
// just fine. There's likely an issue with the user's credit card.
// Customize this section to present an error explanation
alert("The user's credit card failed.");
}
});
request.fail(function(jqXHR, textStatus)
{
// We failed to make the AJAX call to pay.php. Something's wrong on our end.
// This should not normally happen, but we need to handle it if it does.
alert("Error: failed to call pay.php to process the transaction.");
});
}
}
$(document).ready(function()
{
$('#purchase_premium').submit(function(event)
{
// immediately disable the submit button to prevent double submits
$('#purchase_submit').attr("disabled", "disabled");
var fName = $('#first_name').val();
var lName = $('#last_name').val();
var email = $('#email').val();
var cardNumber = $('#cc_number').val();
var cardCVC = $('#cc_cvc').val();
// Boom! We passed the basic validation, so we're ready to send the info to
// Stripe to create a token! (We'll add this code soon.)
Stripe.createToken({
number: cardNumber,
cvc: cardCVC,
exp_month: $('#cc_expiration_month').val(),
exp_year: $('#cc_expiration_year').val()
}, stripeResponseHandler);
});
});
Pay.php
<?php
// Credit Card Billing
require_once('includes/Stripe.php'); // change this path to wherever you put the Stripe PHP library!
// For testing purposes
function createLog ($str) {
$file = 'pay_log.txt';
// The new person to add to the file
$str .= "\n";
// Write the contents to the file,
// using the FILE_APPEND flag to append the content to the end of the file
// and the LOCK_EX flag to prevent anyone else writing to the file at the same time
file_put_contents($file, $str, FILE_APPEND | LOCK_EX);
}
// Helper Function: used to post an error message back to our caller
function returnErrorWithMessage($message)
{
$a = array('result' => 1, 'errorMessage' => $message);
echo json_encode($a);
}
$trialAPIKey = "---"; // These are the SECRET keys!
$liveAPIKey = "---";
Stripe::setApiKey($trialAPIKey); // Switch to change between live and test environments
// Get all the values from the form
$token = $_POST['stripeToken'];
$email = $_POST['email'];
$firstName = $_POST['fName'];
$lastName = $_POST['lName'];
$price = $_POST['price'];
$priceInCents = $price * 100; // Stripe requires the amount to be expressed in cents
try
{
// We must have all of this information to proceed. If it's missing, balk.
if (!isset($token)) throw new Exception("Website Error: The Stripe token was not generated correctly or passed to the payment handler script. Your credit card was NOT charged. Please report this problem to the webmaster.");
if (!isset($email)) throw new Exception("Website Error: The email address was NULL in the payment handler script. Your credit card was NOT charged. Please report this problem to the webmaster.");
if (!isset($firstName)) throw new Exception("Website Error: FirstName was NULL in the payment handler script. Your credit card was NOT charged. Please report this problem to the webmaster.");
if (!isset($lastName)) throw new Exception("Website Error: LastName was NULL in the payment handler script. Your credit card was NOT charged. Please report this problem to the webmaster.");
if (!isset($priceInCents)) throw new Exception("Website Error: Price was NULL in the payment handler script. Your credit card was NOT charged. Please report this problem to the webmaster.");
try
{
// create the charge on Stripe's servers. THIS WILL CHARGE THE CARD!
$charge = Stripe_Charge::create(array(
"amount" => $priceInCents,
"currency" => "usd",
"card" => $token,
"description" => $email)
);
// If no exception was thrown, the charge was successful!
// Here, you might record the user's info in a database, email a receipt, etc.
// Return a result code of '0' and whatever other information you'd like.
// This is accessible to the jQuery Ajax call return-handler in "buy-controller.js"
$array = array('result' => 0, 'email' => $email, 'price' => $price, 'message' => 'Thank you; your transaction was successful!');
echo json_encode($array);
}
catch (Stripe_Error $e)
{
// The charge failed for some reason. Stripe's message will explain why.
$message = $e->getMessage();
returnErrorWithMessage($message);
}
}
catch (Exception $e)
{
// One or more variables was NULL
$message = $e->getMessage();
returnErrorWithMessage($message);
}
?>
关闭pay.php上的错误报告会抑制导致JSON响应无效的警告 您正面临此问题,因为端口80被阻塞。STRIPE不会返回令牌,因此它会抛出一个超时错误,错误为
SSL stream\u socket\u client():无法连接到ssl://api.stripe.com:443
<br />
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: Unable to set verify locations `/nfs/c06/h04/mnt/188388/domains/website.com/html/includes/Stripe/../data/ca-certificates.crt' `(null)' in <b>/nfs/c06/h04/mnt/188388/domains/website.com/html/includes/Stripe/ApiRequestor.php</b> on line <b>340</b><br />
<br />
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: failed to create an SSL handle in <b>/nfs/c06/h04/mnt/188388/domains/website.com/html/includes/Stripe/ApiRequestor.php</b> on line <b>340</b><br />
<br />
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: Failed to enable crypto in <b>/nfs/c06/h04/mnt/188388/domains/website.com/html/includes/Stripe/ApiRequestor.php</b> on line <b>340</b><br />
<br />
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: unable to connect to ssl://api.stripe.com:443 (Unknown error) in <b>/nfs/c06/h04/mnt/188388/domains/website.com/html/includes/Stripe/ApiRequestor.php</b> on line <b>340</b><br />
<br />
<b>Warning</b>: stream_context_get_params() expects parameter 1 to be resource, boolean given in <b>/nfs/c06/h04/mnt/188388/domains/website.com/html/includes/Stripe/ApiRequestor.php</b> on line <b>350</b><br />
<br />
<b>Warning</b>: openssl_x509_export() [<a href='function.openssl-x509-export'>function.openssl-x509-export</a>]: cannot get cert from parameter 1 in <b>/nfs/c06/h04/mnt/188388/domains/website.com/html/includes/Stripe/ApiRequestor.php</b> on line <b>355</b><br />
{"result":0,"email":"timh@blah.com","price":"70","message":"Thank you; your transaction was successful!"}