在此示例中,我们将设置Express服务器集成,以显示如何使用PayPal Node SDK使用PayPal处理付款。为了简洁起见,我们将使用静态JSON结构作为付款明细。
建立用于处理PayPal付款的功能时,我们将遵循三个常规步骤:
我们创建一个JSON对象,其中包含要通过PayPal处理的付款。然后,我们将其发送到PayPal,以获取将用户重定向至的链接,以确认付款。
接下来,我们将用户重定向到PayPal以确认付款。确认后,贝宝会将用户重定向回我们的应用程序。
一旦返回到应用程序,我们将代表用户完成付款。
分解为简单的Node应用程序,我们首先从NPM获取PayPal Node SDK:
npm install paypal-rest-sdk
接下来,我们设置应用程序配置和软件包。
var http = require('http'), paypal = require('paypal-rest-sdk'), bodyParser = require('body-parser'), app = require('express')(); var client_id = 'YOUR APPLICATION CLIENT ID'; var secret = 'YOUR APPLICATION SECRET'; //允许解析JSON主体 app.use(bodyParser.json()); //为沙箱环境配置 paypal.configure({ 'mode': 'sandbox', //沙盒或直播 'client_id': client_id, 'client_secret': secret });
我们对此应用程序有四个要求:
我们服务器的HTTP包。
PayPal Node SDK软件包。
bodyParser包,用于处理JSON编码的正文。
我们服务器的Express框架。
接下来的几行为创建应用程序时获得的客户端ID和密码设置变量。然后,我们进行设置bodyParser以允许使用JSON编码的主体,然后使用应用程序详细信息配置我们的应用程序,并指定我们正在使用的环境(用于生产的环境或用于测试的沙箱)。
现在,让我们创建使用PayPal创建付款请求的途径。
app.get('/create', function(req, res){ //建立PayPal付款要求 var payReq = JSON.stringify({ 'intent':'sale', 'redirect_urls':{ 'return_url':'http://localhost:3000/process', 'cancel_url':'http://localhost:3000/cancel' }, 'payer':{ 'payment_method':'paypal' }, 'transactions':[{ 'amount':{ 'total':'7.47', 'currency':'USD' }, 'description':'This is the payment transaction description.' }] }); paypal.payment.create(payReq, function(error, payment){ if(error){ console.error(error); } else { //捕获HATEOAS链接 var links = {}; payment.links.forEach(function(linkObj){ links[linkObj.rel] = { 'href': linkObj.href, 'method': linkObj.method }; }) //如果存在重定向网址,则重定向用户 if (links.hasOwnProperty('approval_url')){ res.redirect(links['approval_url'].href); } else { console.error('no redirect URI present'); } } }); });
我们要做的第一件事是设置付款请求JSON对象,该对象包含我们提供给PayPal创建付款所需的信息。我们将设置intent为sale,指定重定向URL(PayPal在确认/取消付款后将用户转发到的重定向网址),添加payment_methodofpaypal表示我们将进行PayPal付款,然后指定交易信息供付款人确认。
然后payment.create(...),我们调用,传入我们的payReq对象。这会将创建付款请求发送到PayPal。一旦返回并成功,我们可以遍历返回对象中提供的HATEOAS链接,以提取我们需要将用户重定向到的URL,该URL在标记为approval_url。
如果直接使用HATEOAS链接的格式,可能会导致脆弱的参考代码,因此,我们将遍历所有提供的链接,并将它们放在更好的参考对象中,以防将来发生更改。如果approval_url随后在该对象中找到,我们将重定向用户。
此时,用户将被重定向到PayPal以确认付款。完成后,它们将被重定向回return_url我们在createPayment(...)函数中指定的位置。
为了完成付款,我们现在必须提供处理退货的途径。
app.get('/process', function(req, res){ var paymentId = req.query.paymentId; var payerId = { 'payer_id': req.query.PayerID }; paypal.payment.execute(paymentId, payerId, function(error, payment){ if(error){ console.error(error); } else { if (payment.state == 'approved'){ res.send('payment completed successfully'); } else { res.send('payment not successful'); } } }); });
当用户返回到您的应用程序,将存在将沿着为好,可以派出三名查询字符串参数paymentId,PayerID和token。我们只需要处理前两个。
我们提取参数,然后将PayerID放在一个简单的对象中,以进行付款执行步骤。接下来,调用payment.execute(...),传入这两个参数,以完成付款。
提出请求后,我们将检查是否payment.state将设置为,以查看付款是否成功完成approved。如果是这样,我们可以存储返回的付款对象中需要的东西。
我们的最后一步是初始化服务器,并监听到达我们指定路由的流量。
//创建服务器 http.createServer(app).listen(3000, function () { console.log('Server started: Listening on port 3000'); });
服务器初始化后,将http://localhost:3000/create初始化支付过程。
问题内容: 目标 我正在开发一个运行Linux的简单设备。它具有BLE功能,而我目前正在使用bluez 5.8。 我想使用iPhone在此设备上触发操作。 已经工作的内容: 我可以使iPhone“看到”该设备。 iPhone也连接到设备。 我在linux上设置了这样的蓝牙设备: iOS代码非常简单: 在iPhone上运行此代码时,出现以下日志: 因此,看来iPhone可以正常连接,但看不到任何服务
主要内容:服务端程序,客户端程序本节将带领大家结合咱们前面所学的知识开发一个聊天的示例程序,它可以在几个用户之间相互广播文本消息。 服务端程序 服务端程序中包含 4 个 goroutine,分别是一个主 goroutine 和广播(broadcaster)goroutine,每一个连接里面又包含一个连接处理(handleConn)goroutine 和一个客户写入(clientwriter)goroutine。 广播器(broa
我试图将带有brotli压缩分发版的angular2应用程序部署到Caddy webserver。 有任何例子的球童网络服务器与Brotli压缩支持?
主要内容:Web服务器的工作方式,搭建一个简单的 Web 服务器Go语言里面提供了一个完善的 net/http 包,通过 net/http 包我们可以很方便的搭建一个可以运行的 Web 服务器。同时使用 net/http 包能很简单地对 Web 的路由,静态文件,模版,cookie 等数据进行设置和操作。 Web服务器的工作方式 我们平时浏览网页的时候,会打开浏览器,然后输入网址后就可以显示出想要浏览的内容。这个看似简单的过程背后却隐藏了非常复杂的操作。 对于
你可以在你喜欢的客户端库中尝试 IdentityServer4。我们在 demo.identityserver.io 上有一个测试实例,在主页上你可以找到关于如何配置你的客户端和如何调用一个 API 的介绍。 此外我们还有一个包含大量 IdentityServer 与 Web API 组合演练的仓库(IdentityServer 3 和 4,ASP.NET Core 和 Katana),我们使用该
我按照这个指令创建了一个grpc服务器和客户端:https://docs . Microsoft . com/en-us/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-3.0 当我尝试从客户端调用服务时,客户端会显示以下错误消息:“发生了一个或多个错误。(状态(StatusCode=Unknown,Detail=No Status re