# 概述

PayPal 是倍受全球亿万用户追捧的国际贸易支付工具

是全球商户和消费者最受欢迎的电子支付方式之一,在跨境交易中有着超过 90% 的卖家和超过 85% 的买家认可并正在使用 PayPal 电子支付业务。当然,PayPal 国际业务体量如此惊人,肯定不是毫无原因的

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

# Python3 + Django2.2 + Vue 集成 PayPal 跨境支付

# PayPal

  1. 首先注册官网账号

https://www.paypal.com

  1. 开发者平台

https://developer.paypal.com/developer/accounts/

  1. 沙盒账号控制页面

https://developer.paypal.com/developer/accounts/

会默认创建两个账号,一个是商户的,另外一个是个人的

  1. 进入应用管理页面,点这里
  • 记录下它的 client_id 和 client_secret,一会要用到

# Django

  1. 安装 paypal 在 python 端的 SDK
pip3 install paypalrestsdk
  1. 生成支付链接
import paypalrestsdk
from django.http import HttpResponse
def get_parpal_url(total_money):
    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:8080/paypal_back/",		# 支付成功跳转页面
            "cancel_url": "http://localhost:3000/paypal/cancel/"},  # 取消支付页面
        "transactions": [{
            "amount": {
                "total": total_money,				# 金额
                "currency": "USD"},
            "description": "Paypal余额充值"}]})
    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 approval_url
    else:
        # print(payment.error)
        return HttpResponse("支付失败")
  1. views.py
from .Paypal import get_parpal_url
import paypalrestsdk
# 支付链接
class PayPalView(APIView):
    def post(self, request):
        uid = request.data.get('uid')
        pay_method = request.data.get('pay_method')
        total_money = int(request.data.get('total_money'))
        parpal_url = get_parpal_url(total_money)	# 调用刚刚写好的函数方法
        return Response({"code": 200, "msg": "返回PayPal支付url", "paypal_url": parpal_url})
  • 支付完成后,会跳回刚刚传过去的回调页面
  • paypal 会传过来三个参数,支付 id,token 和支付者 id
  • 此时,在回调方法里,我们需要通过支付者 id 进行确认验证支付
# 回调
class PayPal_back(APIView):
    def post(self, request):
        uid = request.data.get('uid')
        paymentid = request.data.get("paymentId")  # 订单 id
        payerid = request.data.get("PayerID")  # 支付者 id
        payment = paypalrestsdk.Payment.find(paymentid)
        print(payment)
        if payment.execute({"payer_id": payerid}):
            print("Payment execute successfully")
            return Response("支付成功")
        else:
            print(payment.error)  # Error Hash
            return Response("支付失败")

# vue

  1. 支付页面
<template>
<div>
    
    <div>
        <a-input placeholder="输入充值金额(美元)" type='number' v-model="money" style="width:500px" />
        <a-button type="primary" style="margin-top:20px;" @click="sub">
            确定
        </a-button>
    </div>
</div>
</template>
'
<script>
import {
    post_paypal_url,
} from '@/http/apis'
export default {
    data() {
        return {
            money:'',
            pay_method:''
        }
    },
    mounted(){
        this.pay_method = this.$route.query.pay_method
    },
    methods:{
        sub(){
            let params = {
                "uid":localStorage.getItem('uid'),
                "total_money":this.money,
                "pay_method":this.pay_method,
            }
            post_paypal_url(params).then(res=>{
                // 获取支付链接并跳转
                window.location.href = res.paypal_url
            })
        },
    }
}
</script>
  1. 回调页面
<template>
<div>
    <h1>PayPal回调</h1>
</div>
</template>
<script>
import {
    post_paypal_back,
} from '@/http/apis'
export default {
    data() {
        return {
            query: '',
        }
    },
    mounted() {
        // 支付完成后获取,PayPal 传来的参数,发送给后端
        this.query = this.$route.query
        let params = {
            "uid": localStorage.getItem('uid'),
            'paymentId': this.query.paymentId,
            'PayerID': this.query.PayerID,
        }
        post_paypal_back(params).then(res => {
            console.log(res)
        })
    },
}
</script>

# 演示

更新于

请我喝[茶]~( ̄▽ ̄)~*

Daniel ✨ 微信支付

微信支付

Daniel ✨ 支付宝

支付宝