javascript - 带有 Javascript 的 Paypal 智能按钮并获取到 PHP 页面
问题描述
我遇到了一些 Javascript 代码的间歇性问题,我似乎无法解决,希望得到任何帮助。
我有一个露营地预订页面,它使用 Paypal 智能按钮进行付款。在 Paypal Javascript“创建订单”代码的一部分中,我提取输入的客户详细信息,使用 Javascript 填充表单,然后使用 fetch 将信息发布到服务器端 PHP 页面,该页面将信息插入数据库。
问题是这似乎失败了 40-50% 的时间,即 Paypal 付款成功,但数据库插入似乎没有被触发。
Javascript代码如下。任何帮助表示赞赏。
谢谢
内维尔
<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.\r\n\r\nPlease 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) {
.......
解决方案
不要在客户端使用actions.order.create() / .capture()
然后记录到数据库,因为如果这样做,不能保证能够在服务器上记录成功的捕获。
相反,为了正确的服务器集成,创建两条路由——一条用于“创建订单”,一条用于“捕获订单”,如此处所述。您的路线应该返回/输出 JSON(并且只有 JSON)。捕获路由应在调用 PayPal 后检查是否成功,并在将 JSON 返回到客户端之前进行任何数据库写入。
将您的两条路线与以下批准流程配对:https ://developer.paypal.com/demo/checkout/#/pattern/server
推荐阅读
- c# - 如何减小行数的边距大小
- scala - Problem in scala for-comprehension de-sugar?
- python - Plotly:不使用 plotly express 时如何设置散点图的标题颜色?
- c++ - 在调用接受数组的方法时,模板数组大小是不好的做法吗?
- flutter - 这个(初始化?)行在颤振示例应用程序颤振中做了什么?
- python - 如何使用 Python 和 Selenium 在 Chrome 中打开具有不同 URL 的新标签页?
- linux - 强制 Linux 排序将带有空格的记录视为单个数据列
- python - 按级别分组列,按其他级别分组其他列
- stata - 与因子变量(stata)交互时将连续变量作为基线
- azure-sql-database - 在 Azure Data Studio (MacBook) 上使用 MDF 文件