繁体   English   中英

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

[英]Paypal Smart buttons with Javascript and fetch to a PHP page

我遇到了一些 Javascript 代码的间歇性问题,我似乎无法解决,希望能得到任何帮助。

我有一个露营地预订页面,它使用 Paypal 智能按钮来实现付款。 In part of the Paypal Javascript 'create order' code I extract the entered customer details, populate a form using Javascript and then use fetch to post the info to a server side PHP page which inserts the info into a database.

问题是这似乎失败了 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM