如何使用 paypal 的 javascript sdk 从创建订单 api 的响应链接批准订单?

如何解决如何使用 paypal 的 javascript sdk 从创建订单 api 的响应链接批准订单?

我正在尝试在客户端使用 javascript sdk 实现 paypal 高级信用卡和借记卡付款。我使用以下示例作为参考 https://developer.paypal.com/docs/business/checkout/advanced-card-payments/

我已创建订单,收到链接作为响应,如何使用批准 url 链接批准订单,因为用户在执行订单捕获之前使用信用卡详细信息进行付款而无需登录贝宝。

我知道这不是此实现的最佳方法。首先我想尝试一下paypal docs中给出的这个例子。我稍后会在服务器端实现它以避免安全漏洞。

<html>
<head>

  <meta charset="utf-8"/>

  <!-- Optimal rendering on mobile devices. -->
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <!-- Optimal Internet Explorer compatibility -->
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />

  <!-- Sample CSS styles for demo purposes. You can override these styles to match your web page's branding. -->
  <link rel="stylesheet" type="text/css" href="https://www.paypalobjects.com/webstatic/en_US/developer/docs/css/cardfields.css"/>

</head>
<body>

<!-- JavaScript SDK -->
 <script src="https://www.paypal.com/sdk/js?components=buttons,hosted-fields&client-id=abc" 
 data-client-token="xyz">

   

   <div align="center"> or </div>

   <!-- Advanced credit and debit card payments form -->
   <div class="card_container">
     <form id="card-form">

       <label for="card-number">Card Number</label><div id="card-number" class="card_field"></div>
       <div>
         <label for="expiration-date">Expiration Date</label>
         <div id="expiration-date" class="card_field"></div>
       </div>
       <div>
         <label for="cvv">CVV</label><div id="cvv" class="card_field"></div>
       </div>
       <label for="card-holder-name">Name on Card</label>
       <input type="text" id="card-holder-name" name="card-holder-name" autocomplete="off" placeholder="card holder name"/>
       <button value="submit" id="submit" class="btn">Pay</button>
     </form>
   </div>

   <!-- Implementation -->
   <script>
     let orderId;

     // Displays PayPal buttons
     paypal.Buttons({
       style: {
         layout: 'horizontal'
       },createOrder: function(data,actions) {
           return actions.order.create({
             purchase_units: [{
               amount: {
                 value: "1.00"
               }
             }]
           });
         },onApprove: function(data,actions) {
           return actions.order.capture().then(function(details) {
               console.log(details)
             window.location.href = '/success.html';
           });
         }
     }).render("#paypal-button-container");

     // If this returns false or the card fields aren't visible,see Step #1.
     if (paypal.HostedFields.isEligible()) {

       // Renders card fields
       paypal.HostedFields.render({
         // Call your server to set up the transaction
         createOrder: function () {
           return fetch('https://api-m.sandbox.paypal.com/v2/checkout/orders',{
            method: 'post',headers: {
              'Accept': 'application/json','Content-Type': 'application/json','Authorization': 'Bearer wert'
            }
            
          }).then(function(res) {
              return res.json();
          }).then(function(orderData) {
              console.log(orderData)
            orderId = orderData.id;
           
             fetch('https://api-m.sandbox.paypal.com/v2/checkout/orders/' + orderId + '/capture/',{
               method: 'post',headers: {
                    'Accept': 'application/json','Authorization': 'Bearer AGeU7jOKBXFPa0Fe_e9Xv3g','PayPal-Request-Id': '7b92603e-77ed-4896-8e78-5dea2050476a'
                    },"application_context": {
                    "return_url": "https://google.com"
                }
             }).then(function(res) {
               console.log(res)
                return res.json();
             })
            
           // return orderId;
          });
         },onApprove: function(data) {
          console.log(data) 
          return fetch('/my-server/capture-paypal-transaction',{
            headers: {
              'content-type': 'application/json'
            },body: JSON.stringify({
              orderID: data.orderID
            })
          }).then(function(res) {
            return res.json();
          }).then(function(details) {
            alert('Transaction funds captured from ' + details.payer_given_name);
          })

           
         },styles: {
           '.valid': {
            'color': 'green'
           },'.invalid': {
            'color': 'red'
           }
         },fields: {
           number: {
             selector: "#card-number",placeholder: "4111 1111 1111 1111"
           },cvv: {
             selector: "#cvv",placeholder: "123"
           },expirationDate: {
             selector: "#expiration-date",placeholder: "MM/YY"
           }
         }
       }).then(function (cardFields) {
         document.querySelector("#card-form").addEventListener('submit',(event) => {
           event.preventDefault();

           cardFields.submit({
             // Cardholder's first and last name
             cardholderName: document.getElementById('card-holder-name').value,// Billing Address
            //  billingAddress: {
            //    // Street address,line 1
            //    streetAddress: document.getElementById('card-billing-address-street').value,//    // Street address,line 2 (Ex: Unit,Apartment,etc.)
            //    extendedAddress: document.getElementById('card-billing-address-unit').value,//    // State
            //    region: document.getElementById('card-billing-address-state').value,//    // City
            //    locality: document.getElementById('card-billing-address-city').value,//    // Postal Code
            //    postalCode: document.getElementById('card-billing-address-zip').value,//    // Country Code
            //    countryCodeAlpha2: document.getElementById('card-billing-address-country').value
            //  }
           }).then(function (data) {
               console.log(orderId)
               console.log(data);
            fetch('https://api-m.sandbox.paypal.com/v2/checkout/orders/' + orderId + '/capture/','Authorization': 'Bearer AjOKBXFPa0Fe_e9Xv3g'

                    },"application_context": {
                    "return_url": "https://google.com"
                }
             }).then(function(res) {
               console.log(res)
                return res.json();
             }).then(function (orderData) {
               console.log(orderData)
                // Three cases to handle:
                //   (1) Recoverable INSTRUMENT_DECLINED -> call actions.restart()
                //   (2) Other non-recoverable errors -> Show a failure message
                //   (3) Successful transaction -> Show confirmation or thank you

                // This example reads a v2/checkout/orders capture response,propagated from the server
                // You could use a different API or structure for your 'orderData'
                var errorDetail = Array.isArray(orderData.details) && orderData.details[0];

                if (errorDetail && errorDetail.issue === 'INSTRUMENT_DECLINED') {
                  return actions.restart(); // Recoverable state,per:
                  // https://developer.paypal.com/docs/checkout/integration-features/funding-failure/
                }

                if (errorDetail) {
                    var msg = 'Sorry,your transaction could not be processed.';
                    if (errorDetail.description) msg += '\n\n' + errorDetail.description;
                    if (orderData.debug_id) msg += ' (' + orderData.debug_id + ')';
                    return alert(msg); // Show a failure message
                }

                // Show a success message or redirect
                alert('Transaction completed!');
             })
          }).catch(function (err) {
            alert('Payment could not be captured! ' + JSON.stringify(err))
          });
         });
       });
     } else {
       // Hides card fields if the merchant isn't eligible
       document.querySelector("#card-form").style = 'display: none';
     }
   </script>

   </body>
   </html>

执行上述代码段后,将其作为响应

{name: "UNPROCESSABLE_ENTITY",details: [{issue: "ORDER_NOT_APPROVED",…}],…} debug_id: "a63fbc3806995" 详细信息:[{问题:“ORDER_NOT_APPROVED”,...}] 0:{问题:“ORDER_NOT_APPROVED”,...} 链接:[{href: "https://developer.paypal.com/docs/api/orders/v2/#error-ORDER_NOT_APPROVED",...}] 0: {href: "https://developer.paypal.com/docs/api/orders/v2/#error-ORDER_NOT_APPROVED",...} 消息:“无法执行请求的操作、语义不正确或业务验证失败。” name: "UNPROCESSABLE_ENTITY

解决方法

如何使用批准 url 链接批准订单,因为用户在执行订单捕获之前使用信用卡详细信息进行付款而无需登录贝宝。

批准 URL 链接不与 JavaScript SDK 结合使用。

使用托管字段时,审批步骤是卡片字段提交,这会触发 cardFields.submit({

使用托管字段需要服务器端集成以捕获已批准(提交)的付款。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res