首页 > 解决方案 > 带有 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) {
                                  
                                  
                                  .......

标签: javascriptpaypal

解决方案


不要客户端使用actions.order.create() / .capture()然后记录到数据库,因为如果这样做,不能保证能够在服务器上记录成功的捕获。

相反,为了正确的服务器集成,创建两条路由——一条用于“创建订单”,一条用于“捕获订单”,如此处所述。您的路线应该返回/输出 JSON(并且只有 JSON)。捕获路由应在调用 PayPal 后检查是否成功,并在将 JSON 返回到客户端之前进行任何数据库写入。

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


推荐阅读