Paypal智能按钮与Javascript和获取PHP页面



我在一些Javascript代码中遇到了间歇性问题,我似乎无法解决这个问题,如果有任何帮助,我将不胜感激。

我有一个露营地预订页面,它使用贝宝智能按钮进行支付。在Paypal Javascript"创建订单"代码的一部分中,我提取输入的客户详细信息,使用Javascript填充表格,然后使用fetch将信息发布到服务器端的PHP页面,该页面将信息插入数据库。

问题是,这似乎在40-50%的时间内失败,即Paypal支付成功,但数据库插入似乎没有被触发。

Javascript代码如下。感谢您的帮助。

感谢

Neville

<script>

var fname="";
var sname="";
var email="";
var mobile="";
var invoice_id="";                                      

paypal.Buttons({
createOrder: function(data, actions) {
// This function sets up the details of the transaction, including the amount and line item details.

//1. validate form details, abort if incorrrect
if (validateForm()==false) {
alert("Incorrect Booking form data provided, aborting payment function.rnrnPlease recheck Booking form data and resubmit.");
//actions.disable();
return false;
}

//2. extract customer info from webpage
try {
email = document.forms["bookingform"]["email"].value;
invoice_id=document.forms["bookingform"]["invoice_id"].value;

fname= document.forms["bookingform"]["fname"].value;
sname = document.forms["bookingform"]["sname"].value;
mobile = document.forms["bookingform"]["mobile"].value; 
                          
if (invoice_id=="") {
invoice_id= sname.toUpperCase();
invoice_id=invoice_id+"   ";
invoice_id=invoice_id.substring(0,3)+"-";
invoice_id=invoice_id+(100000 + Math.floor(Math.random() * 900000));
invoice_id=invoice_id.substring(0,10);
document.forms["bookingform"]["invoice_id"].value=invoice_id;
}


var tot_night = document.getElementById('tot_nights').innerHTML;

var tot_amt=document.getElementById("tot_amt").innerHTML;
tot_amt = tot_amt.replace("$", "");
var date_from = document.forms["bookingform"]["date_from"].value;
var date_to = document.forms["bookingform"]["date_to"].value;
var vehicle_rego = document.forms["bookingform"]["vehicle_rego"].value;
var no_adults = document.forms["bookingform"]["no_adults"].value;
var no_children = document.forms["bookingform"]["no_children"].value;
var power = document.forms["bookingform"]["power"].checked;
var tent_hire = document.forms["bookingform"]["tent_hire"].checked;


if (power=='true' || power==true) {
power ="Yes";
} else {
power="No";
}
if (tent_hire=='true' || tent_hire==true) {
tent_hire ="Yes";
} else {
tent_hire="No";
}
                          
var street_address = document.forms["bookingform"]["street_address"].value;
var locality = document.forms["bookingform"]["locality"].value;
var package_type = document.forms["bookingform"]["package_type"].value
var voucher = document.forms["bookingform"]["voucher"].value
var notes = document.forms["bookingform"]["notes"].value

//$('#ref_fld').val(details.id);
$('#ref_fld').val('0');
} catch(err) {}

//3. create form, insert data
var formdata = new FormData(); 

if (formdata) {

try {

formdata.append("post_function","make_booking");

formdata.append("notes", notes);
formdata.append("invoice_id", invoice_id);
formdata.append("voucher", voucher);
formdata.append("package_type", package_type);

street_address=street_address.replace('"', '');
street_address=street_address.replace("'", "");
notes=notes.replace('"', '');
notes=notes.replace("'", "");

formdata.append("locality", locality);
formdata.append("street_address", street_address);
formdata.append("vehicle_rego",vehicle_rego);
formdata.append("trans_id",'0');
formdata.append("tot_amt",tot_amt);
formdata.append("tot_night",tot_night);
formdata.append("tent_hire",tent_hire);
formdata.append("power",power);
formdata.append("no_children",no_children);
formdata.append("no_adults",no_adults);
formdata.append("date_to",date_to);
formdata.append("date_from",date_from);
formdata.append("mobile",mobile);
formdata.append("email",email);
formdata.append("sname",sname);
formdata.append("fname",fname);

} catch(err) {}

//4. post form 

const url = '/includes_macas/mysql_functions.php';
fetch(url, {
method: 'POST',
body: formdata
}).catch(function(error) {
console.log(error); // Display error if there is one.
})

}                                           
                                                                                      
return actions.order.create({
payer: {
name: {
given_name: fname,
surname: sname
},
email_address: email,
phone: {
phone_type: "MOBILE",
phone_number: {
national_number: mobile
}
}
},
purchase_units: [{
invoice_id: invoice_id,
amount: {
value: tot_amt
}
}],      
application_context: {
shipping_preference: "NO_SHIPPING"
}
});
},
onClick: function() {
//$('#wait').show();
},
onApprove: function(data, actions) {


.......

Donot在客户端使用(截至2023年,现在已弃用(actions.order.create() / .capture(),然后记录到数据库中,因为如果这样做,就不能保证能够在服务器上成功记录捕获。

相反,为了进行正确的服务器集成,请创建两个路由——一个用于"创建订单",另一个用于《捕获订单》,如标准集成指南中所述。您的路由应返回/输出JSON(并且仅返回JSON(。捕获路由应该在调用PayPal后检查是否成功,并在向客户端返回JSON之前进行任何数据库写入。

将您的两条路线与此审批流配对:https://developer.paypal.com/demo/checkout/#/pattern/server

最新更新