这是我第一次尝试在我的网站上实施付款,而且几乎没有任何关于paypal的东西我觉得很难掌握。
在我的应用中,用户可以上传他想要翻译的视频。 每个视频都可以翻译成多种语言。 总价格是根据用户选择的视频时长和所请求的语言计算的。
以最简单的方式,我将此代码添加到我的网站
<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>
在paypal中,我将returnUrl配置到我的服务器,付款后,我向用户显示摘要。
我使用这种方法的问题是用户可以从客户端更改数量隐藏字段。尽管我可以在调用returnUrl之后检查服务器中的付费金额,但我不想启用这种情况。
我试着阅读服务器api,但我不确定它能做到我想要的。 我想到了以下流程,并想知道这是否正确以及PayPal是否支持这一点。
流程:
任何帮助都将非常感激。我很难弄清楚文件的流程。
答案 0 :(得分:1)
基本上您要做的是在用户点击付费按钮并获取createOrder
和return_url
后,在后端调用cancel_url
API(请参阅下面的nodejs代码)
从前端使用window.location,例如:window.location.origin +&#39; / success-url&#39;这样在本地服务器上测试时没有问题,
舞台和制作。然后,当用户被重定向到https://example.com/success-url
时,paymentId
和PayerID
将被传递
网址中的payapal,然后从该页面中,您可以在后端调用executeOrder
。
以下是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
www.videotranslate.com
www.videotranslate.com/api/createOrder
进行了AJAX调用
来自您的角度组件/服务(取决于您的设计)redirectUrl
来自后端的createOrder
函数。www.videotranslate.com/success-callback
www.videotranslate.com/api/executeOrder
www.videotranslate.com/cancel-callback
,您可以在这里显示错误
敬酒并要求用户再次付款。