在公司中,支付是必不可缺的的重要系统之一。有的公司如果涉及到境外支付,就一定听说过或使用说PayPal。
PayPal支付的优势就是其业务网络遍布全球。目前PayPal的庞大网络覆盖了全球200多个国家,可提供20多种语言服务,并接受100多种货币付款和56种货币提现。同时,还允许在账户中持有25种货币余额。换句话说,只要付款人拥有一个PayPal账户,他就拥有了在200多个国家进行电子支付购物,并在需要服务的时候享受到母语支持的各种便捷服务。

注册PayPal官网账号:https://www.paypal.com
PayPal开发者平台:https://developer.paypal.com/developer/accounts/

注册成功之后,进去PayPal沙盒应用:https://developer.paypal.com/developer/accounts/
然后PayPal会默认给我们创建两个账号,一个是商家的,一个是个户的。当然也可以点击Create account自己创建需要的账号
分配的默认账号

支付业务

以个人账户对商户进行支付业务。

应用管理页面:https://developer.paypal.com/developer/applications/

这时我们可以发现他给我们默认分配了应用。
分配的默认应用

点击我们的默认应用,我们可以发现应用的client_id和client_secret。
应用的ID和Secret

进入我们的账号设置
进入账号设置

可以得知我们的个人账号和账号密码
个人账号和面膜

修改我们个人账号的金额,让我们有足以的价格进行购买测试
修改个人账户金额

进行购买测试

安装PayPal在python的sdk

1
pip install paypalrestsdk

在djagno中新建一个支付视图views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
url:
path('pay/',payment),#跳转

import paypalrestsdk

def payment(request):
paypalrestsdk.configure({
"mode": "sandbox", # sandbox代表沙盒
"client_id": "你的client_id",
"client_secret": "你的client_secret" })

payment = paypalrestsdk.Payment({
"intent": "sale",
"payer": {
"payment_method": "paypal"},
"redirect_urls": {
"return_url": "http://localhost:8000/palpay/pay/",#支付成功跳转页面
# "return_url": "http://localhost:8000/palpay/pay/?"+'order='+str(snoworder)+'&uid='+str(uid) #进行加参,到修改
"cancel_url": "http://localhost:3000/paypal/cancel/"},#取消支付页面
"transactions": [{
"amount": {
"total": "5.00",
"currency": "USD"},
"description": "这是一个订单测试"}]})

if payment.create():
print("Payment created successfully")
for link in payment.links:
if link.rel == "approval_url":
approval_url = str(link.href)
print("Redirect for approval: %s" % (approval_url))
return redirect(approval_url)
else:
print(payment.error)
return HttpResponse("支付失败")

这里解释一下重点参数,return_url是支付成功后回调的页面,paypal会将一个支付者id回传,然后服务端需要验证支付才能真的完成支付,total是付款金额,精确到分,currency是币种,支持多钟类型的货币。

当Django的服务端创建好支付订单后,重定向到paypal的沙盒环境,这时候一定要使用沙盒的个人账号进行登录和支付。
paypal支付订单
支付完成后,会跳回刚刚传过去的回调页面:http://localhost:8000/palpay/pay/?paymentId=PAYID-L3SYORA3C031930S1733650J&token=EC-9TG269735K620131N&PayerID=ETYYRCDN8C3XJ

这里paypal会传过来三个参数,支付id,token和支付者id,然后因为我要修改参数,所以我对回调网址进行加参,

此时,在回调方法里,我们需要通过支付者id进行确认验证支付

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
url:
path('palpay/pay/',payment_execute),#成功回调

def payment_execute(request):
paymentid = request.GET.get("paymentId") #支付id
payerid = request.GET.get("PayerID") #支付者id
order = request.GET.get('order') #获取订单
uid = request.GET.get('uid')#获取用户id
print('订单ID:%s,支付者ID:%s,雪花订单号:%s,uid:%s'%(paymentid,payerid,order,uid))

payment = paypalrestsdk.Payment.find(paymentid)

if payment.execute({"payer_id": payerid}):
if order and payerid and paymentid:
order_end = int(order[-1])
print('订单号最后一位',order_end)
if int(order_end) < 5 or int(uid[-1]) < 5:
order = OrderOne.objects.filter(order=order).first()
order.status = 2
order.save()
print("修改一表订单状态成功")
return redirect('http://localhost:8080/myorder/')
else:
order = OrderTwo.objects.filter(order=order).first()
order.status = 2
order.save()
print("修改二表订单状态成功")
return redirect('http://localhost:8080/myorder/')
return HttpResponse('未获取到单号,请重新购买')
else:
print(payment.error) # Error Hash
return HttpResponse("支付失败")

这时再看我们的个人账户页面,发现已经扣款成功,说明整个流程已经走完。
购买成功扣款

总结

整个支付流程相对支付宝来说,更加的紧凑,但是做支付安全是第一要务,就个人体验(仅是个人体验)层面来说,支付宝在安全方面做的还是要比Paypal略强一些,起码在信用卡欺诈和盗刷方面风控做的更好,在风险保障和赔付方面都有提供保险,当然由于金融环境的差异较大,并不是说Paypal的风控做的不好,只是机制不同,在国外,如果持卡人的信用卡被盗刷,一般发卡组织会让商家去承担责任,而国内只能在交易环节设置更多的验证,本质上说是要持卡人承担责任。这也是为什么支付宝的风控看起来更好的原因。

最后就是关于费率问题,Paypal官方给出的费率是每笔交易收取3.9%+$0.3(根据你的交易流水,比例可以优惠,具体下限看接入者的月营业额度),不过这可是美刀,不得不说这个费率是相当的高,但是国内做境外支付的电商,一般还是要接入Paypal作为支付方式。支付宝的费率基本上在1.2%左右,具体的费率也看交易流水,有实力的下限可以做到基本没有,单纯的看费率似乎支付宝更有优势,但是别忘记了,这样对比是不科学的,因为凡是接入Paypal的都是看中覆盖外币业务的地区,费率则是投资人该考虑的问题了。

评论





载入天数...载入时分秒...

Blog content follows the Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) License

Use WZH as theme, total visits times