将变量传递给贝宝结帐中的项目

Posted

技术标签:

【中文标题】将变量传递给贝宝结帐中的项目【英文标题】:Pass variable to item in paypal-checkout 【发布时间】:2020-08-19 08:42:45 【问题描述】:

我几乎在一周前就开始使用 Angular。为了让事情变得简单,我正在尝试实施贝宝结帐。

只要我只通过总金额,结帐就可以正常工作。但我想将几个项目传递给贝宝。

我是这样尝试的:

    import 
      Component,
      OnInit,
      ViewChild,
      Input,
      ElementRef,
      Output,
      EventEmitter
     from "@angular/core";

    declare var paypal;

    @Component(
      selector: "app-payme",
      templateUrl: "./payme.component.html",
      styleUrls: ["./payme.component.scss"]
    )
    export class PaymeComponent implements OnInit 
      @ViewChild("paypal",  static: true ) paypalElement: ElementRef;
      @Input() total: number;
      @Input() cart: [];

      //payCart: [];

      @Output() isPaidFor: EventEmitter<boolean> = new EventEmitter();

      paidFor = false;

      constructor() 

      cartInConsole() 
        console.log("PayPalTotal", this.total);
      

      declareItem() 
        let paypalItem = [];
        for (let i =0 ; i< this.cart.length; i++) 
            let currency = "EUR";
            let quantity = this.cart[i].selectedSize;
            let name = this.cart[i].name;
            let amount = this.cart[i].selectedPrice;
            console.log("DeclareFunction rennt");
            //let pushItem = "quantity": quantity;  
            paypalItem.push("unit_amount": "currency_code": "EUR","value": currency, "amount": amount,"quantity": quantity,"name": name);
           console.log("Declare", paypalItem) 
            return paypalItem
          

         console.log("StackOverFow", paypalItem )
      ;


      ngOnInit() 
        console.log("PayPalCart", this.cart);
        this.declareItem();
        paypal
          .Buttons(
            createOrder: (data, actions) => 
              return actions.order.create(

                
              purchase_units: [
                amount: 
                    currency_code: 'EUR',
                    value: this.total,

                    
                ,
              items: this.paypalItem
            ]
            ,
            onApprove: async (data, actions) => 
              const order = await actions.order.capture();
              this.paidFor = true;
              this.isPaidFor.emit(this.paidFor);
              console.log("Order", order);
            
          )
          .render(this.paypalElement.nativeElement);
      

    

但我得到的回应是:未定义项目。

我的 paypalItem 的 console.log 看起来不错 - 它似乎是一个对象数组,就像它应该的那样。

但是我如何让它将该对象传递给项目或项目?

顺便问一下:是哪一个?物品或物品?几个小时的谷歌搜索得到所有不同的答案,让你怀疑任何事情:-)

提前非常感谢!

更新

我尝试声明 paypalItem,然后在 declareItem 函数中进行设置。不幸的是,结果相同...

现在的代码如下所示:

 import 
  Component,
  OnInit,
  ViewChild,
  Input,
  ElementRef,
  Output,
  EventEmitter
 from "@angular/core";

declare var paypal;

@Component(
  selector: "app-payme",
  templateUrl: "./payme.component.html",
  styleUrls: ["./payme.component.scss"]
)
export class PaymeComponent implements OnInit 
  @ViewChild("paypal",  static: true ) paypalElement: ElementRef;
  @Input() total: number;
  @Input() cart: [];
paypalItem: [];
  //payCart: [];

  @Output() isPaidFor: EventEmitter<boolean> = new EventEmitter();

  paidFor = false;

  constructor() 

  cartInConsole() 
    console.log("PayPalTotal", this.total);
  

  declareItem() 
    let paypalItem = [];
    for (let i =0 ; i< this.cart.length; i++) 
        let currency = "EUR";
        let quantity = this.cart[i].selectedSize;
        let name = this.cart[i].name;
        let amount = this.cart[i].selectedPrice;
        console.log("DeclareFunction rennt");
        //let pushItem = "quantity": quantity;  
        paypalItem.push("unit_amount": "currency_code": "EUR","value": currency, "amount": amount,"quantity": quantity,"name": name);
       console.log("Declare", paypalItem) 
        this.paypalItem = paypalItem;
      

     console.log("StackOverFow", paypalItem )
  ;


  ngOnInit() 
    console.log("PayPalCart", this.cart);
    this.declareItem();
    paypal
      .Buttons(
        createOrder: (data, actions) => 
          return actions.order.create(

            
          purchase_units: [
            amount: 
                currency_code: 'EUR',
                value: this.total,

                
            ,
          items: this.paypalItem
        ]
        ,
        onApprove: async (data, actions) => 
          const order = await actions.order.capture();
          this.paidFor = true;
          this.isPaidFor.emit(this.paidFor);
          console.log("Order", order);
        
      )
      .render(this.paypalElement.nativeElement);
  


还有其他想法吗?

另一个更新:

完整代码在codesandbox

【问题讨论】:

配合您尝试访问 this.paypalItem。它从来没有在类级别的某个地方声明过,那么你想如何获得对它的引用? 【参考方案1】:

在类中没有看到声明为 paypalItem 的变量。声明一个名为paypalItem 的变量,然后在方法declareItem() 中将paypalItem 数组分配给您之前声明的类级别paypalItem


declareItem() 
...
this.paypalItem = paypalItem;

更新

这是您的模型绑定错误。当您添加项目时,Paypal 创建订单需要具有不同所需属性的模型。我在代码中添加了一个示例模型。您可以将您的值映射到您的模型并在那里替换它。

为了进行测试,请在沙箱中将此代码 sn-p 替换为您的代码。可以正常工作。

参考这个。 api documentation for create (items array)

 paypal
      .Buttons(
        createOrder: (data, actions) => 
          // This function sets up the details of the transaction, including the amount and line item details.
          return actions.order.create(
            intent: "CAPTURE",
            purchase_units: [
              
                amount: 
                  currency_code: "EUR",
                  value: "0.02",
                  breakdown: 
                    item_total: 
                      currency_code: "EUR",
                      value: "0.02"
                    
                  
                ,
                items: [
                  
                    name: "item1",
                    unit_amount: 
                      currency_code: "EUR",
                      value: "0.01"
                    ,
                    quantity: "1"
                  ,
                  
                    name: "item2",
                    unit_amount: 
                      currency_code: "EUR",
                      value: "0.01"
                    ,
                    quantity: "1"
                  
                ]
              
            ]
          );
        ,
        onApprove: function(data, actions) 
          // This function captures the funds from the transaction.
          return actions.order.capture().then(function(details) 
            // This function shows a transaction success message to your buyer.
            alert("Transaction completed by " + details.payer.name.given_name);
          );
        
      )
      .render(this.paypalElement.nativeElement);

【讨论】:

我试过了,但结果还是一样...没有定义项目,尽管 console.log 显示了对象。 this.paypalItem = paypalItem; 移出 for 循环。 console.log("StackOverFow", paypalItem ) 会记录数组吗? 否则在 declare() 中删除 declaringlet paypalItem = []this.paypalItem = paypalItem;。改用this.paypalItem.push() 非常感谢您的回答...我尝试了您的所有建议,但错误仍然存​​在。我不确定是导致错误的内置数组还是其他原因。如果我尝试 this.paypalItem.push(),paypal 按钮甚至不会显示在页面上。如果我将 this.paypalItem = paypalItem 移出循环,this.paypalItem 的 console.log 将返回 Object => Object0 =>Amount[Object] =>Quantity, Name。所有这些都具有正确的键和值......我现在完全迷失了...... 如果你能把你的代码上传到stackblitz.com就能帮你:)

以上是关于将变量传递给贝宝结帐中的项目的主要内容,如果未能解决你的问题,请参考以下文章

贝宝集成后端?

如何计算贝宝费用,2.9% +0.30 不适用于某些情况下结帐方法中的变量 FEEMT 不匹配

当用户选择贝宝付款方式时,在结帐表单中禁用 WooCommerce 中的帐单地址

移动网站中的贝宝结帐

运费不包括在 wordpress woocommerce 中的贝宝快递结帐中

贝宝 - 一次结帐中的多项协议