2017-07-18 39 views
0

这是我第一次尝试在我的网站实施付款,并且贝宝几乎没有什么东西我觉得很难掌握。贝宝 - 从服务器发送金额

在我的应用程序中,用户可以上传他想翻译的视频。每个视频可以翻译成多种语言。 总价是根据用户选择的视频持续时间和请求的语言来计算的。

在最简单的方式可能的,我加入这个代码到我的网站

<form action="https://www.paypal.com/cgi-bin/webscr" method="post"> 
 
     <input type="hidden" name="cmd" value="_xclick"> 
 
     <input type="hidden" name="business" value="myFakeBusinees"> 
 
     <input type="hidden" name="item_name" [value]="transactionId"> 
 
     <input type="hidden" name="currency_code" value="USD"> 
 
     <input type="hidden" name="amount" [value]="totalPrice"> 
 
     <input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" (click)="submit()"> 
 
     <input type="submit" value="Paypal"/> 
 
    </form>

在贝宝我配置了一个RETURNURL到我的服务器,并付款后,我的总结显示用户。

这种方法的问题是用户可以从客户端更改隐藏字段的数量。尽管我可以在调用returnUrl之后检查服务器中的付款金额,但我不想启用这种情况。

我试图读取服务器API,但我不确定它做我想要的。 我想过以下流程,并想知道这是否正确,以及如果贝宝支持这一点。

流量:

  • 用户创建客户的订单。每个订单都有一个transactionId
  • 当用户点击付款按钮时,客户端发送一个带有transactionId的请求到服务器。
  • 服务器计算totalPrice,并发送payapel为此金额创建一个令牌。服务器向客户端返回令牌。
  • 客户收回令牌并正在导航到贝宝。
  • 在贝宝网站,用户选择他的付款方式并付款。贝宝服务器比将这个令牌的确认返回给myserver。
  • 我的服务器根据transactionId检查令牌,如果一切正常,则向用户显示“您的订单已创建”页面。

任何帮助将非常感激。我想要弄明白文件中的流程有点困难。

回答

1

基本上你想要做的是调用API createOrder在后端(见下面的代码的NodeJS),当在付款按钮用户点击并获得return_url并使用了window.location如cancel_url 从前端:window.location的.origin +'/ success-url',以便在本地服务器, 阶段和生产测试时没有问题。然后当用户重定向到https://example.com/success-url时,paymentIdPayerID将通过 payapal传递到URL本身,然后从该页面您可以在您的后端调用executeOrder

这里是链接到documentation

下面是一个示例的NodeJS代码:

exports.createOrder = (data, callback) => { 
    /* First step when user clicks 'Pay with paypal' on place-order screen */ 
    var create_payment_json = { 
    "intent": "sale", 
    "payer": { 
     "payment_method": "paypal" 
    }, 
    "redirect_urls": { 
     "return_url": data.return_url, 
     "cancel_url": data.cancel_url 
    }, 
    "transactions": [{ 
     "amount": { 
     "total": getAmountFromNoOFVideos(), 
     "currency": "USD" 
     }, 
     "description": "Video Translation" 
    }] 
    }; 

    paypal.payment.create(create_payment_json, function (error, payment) { 
    if (error) { 
     callback(error); 
    } else { 
     if(payment.payer.payment_method === 'paypal') { 
     for(var i=0; i < payment.links.length; i++) { 
      var link = payment.links[i]; 
      if (link.method === 'REDIRECT') { 
      redirectUrl = link.href; 
      } 
     } 
     } 
     callback(null, redirectUrl, payment.id) 
    } 
    }); 
} 

exports.executeOrder = (data, callback) => { 
    /* Second and final step in place-order screen */ 
    let paymentId = data.paymentId; 
    let PayerID = data.PayerID; 

    var details = { "payer_id": PayerID }; 
    paypal.payment.execute(paymentId, details, function (error, payment) { 
    if (error) { 
     console.log("\x1b[31m", "PAYPAL ERROR: ", error) 
     callback(error); 
    } else { 
     callback(null, true); 
    } 
    }); 
} 

PayPal的流程: - 假设你的网站链接是www.videotranslate.com

  1. 用户点击收费您的网站上的按钮www.videotranslate.com
  2. 您从您的角度成分/服务(根据你的设计)
  3. 在AJAX的成功函数中调用你从createOrder功能redirectUrl 在后台做一个AJAX调用API www.videotranslate.com/api/createOrder
  4. 当用户做出了通过支付宝付款成功PayPal将 用户重定向到www.videotranslate.com/success-callback
  5. 现在这个页面上您从角
  6. 一个AJAX调用API www.videotranslate.com/api/executeOrder如果用户取消了对PayPal付款,PayPal会将用户重定向到 www.videotranslate.com/cancel-callback,在这里您可以显示一个错误 吐司并要求用户再次付款。
+0

首先,非常感谢您的帮助。 可以请你帮我几个问题: 1.谁在调用createOrder?我的客户或PayPal 2.请求的流程是什么 - 谁(客户端,服务器,贝宝)在调用每个函数? 3.如果执行订单执行付款交易,为什么我需要使用createOrder? –

+0

1.您的客户调用'createOrder'。 2我编辑ans来演示流程 – Dhyey