PayPal支付

PayPal支付和PayPal-python-SDK使用

2015/8/1 by DKZ

PayPal提供完善的支付接口和文档支持

在构建一个支付系统之前,首先要在PayPal上注册个人高级账号并创建应用,PayPal会提供唯一的clientid和clientsecret供构建支付使用。执行支付之前PayPal要求使用clientid和clientsecret获得一个access token,通过这个access token就可以调用PayPal的支付接口了。

PayPal支付流程主要分为以下三步:

  1. 创建并向PayPal传送一个支付请求。
  2. 跳转到PayPal页面,PayPal引导用户完成支付。
  3. 支付成功跳转至支付处理成功界面或支付失败跳转到支付失败界面。

PayPal-python-SDK介绍及使用

PayPal为开发者提供多种编程语言的SDK,其中封装了PayPal的支付接口,直接供用户调用完成支付。查看更多SDK使用方法和说明

使用clientid和clientsecret获得access token:

import paypalrestsdk
paypalrestsdk.configure({
    'mode': 'sandbox',
    'client_id': 'AQkquBDf1zctJOWGKWUEtKXm6qVhueUEMvXO_-MCI4DQQ4-LWvkDLIN2fGsd',
    'client_secret': 'EL1tVxAjhT7cJimnz5-Nsx9k2reTKSVfErNQF-CmrwJgxRtylkGTKlU4RvrX'
})

其中mode为支付环境,可以选择sandbox沙箱环境供测试使用或live环境进行真实的支付请求。服务器会返回一个json类型值:

{"scope":"https://api.paypal.com/v1/payments/.* email https://api.paypal.com/v1/vault/credit-card openid https://uri.paypal.com/services/invoicing https://api.paypal.com/v1/developer/.* https://api.paypal.com/v1/vault/credit-card/.*","access_token":"A015xIqJSci5-6gjr9Z2KrjXi12zYoNML-xH12oi7w15pjg","token_type":"Bearer","app_id":"APP-80W284485P519543T","expires_in":28800}

其中包括access token。

创建一个支付:

payment = paypalrestsdk.Payment({
    "intent": "sale",
    "payer": {
        "payment_method": "paypal" 
    },
    "redirect_urls": {
        "return_url": "https://devtools-paypal.com/guide/pay_paypal/python?success=true",
        "cancel_url": "https://devtools-paypal.com/guide/pay_paypal/python?cancel=true" 
    },
    "transactions": [ {
        "amount": {
            "total": "12",
            "currency": "USD" 
        },
        "description": "creating a payment" 
    }] 
})
payment.create()

向Payment方法中传递intent、payer、transactions参数,其中payer中包含“paymentmethod”、“returnurl”、“cancelurl”分别对应支付方法、支付成功跳转地址、支付失败跳转地址,可使用的支付方法包括“paypal”PayPal账户和“creditcard”信用卡。Transactions中包含具体的支付订单信息,包括“total”总计、“currency”使用货币、“description”描述等。 payment.create()方法会返回一个boolean值,如果为false则订单创建失败,如果为true服务器会返回json类型的定单详情:

{"id":"PAY-8LP54154BP414945AKUPJ37Y","create_time":"2015-04-03T14:04:47Z","update_time":"2015-04-03T14:04:47Z","state":"created","intent":"sale","payer":{"payment_method":"paypal","payer_info":{"shipping_address":{}}},"transactions":[{"amount":{"total":"12.00","currency":"USD","details":{"subtotal":"12.00"}},"description":"creating a payment","related_resources":[]}],"links":[{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-8LP54154BP414945AKUPJ37Y","rel":"self","method":"GET"},{"href":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=EC-15P25616UF798962P","rel":"approval_url","method":"REDIRECT"},{"href":"https://api.sandbox.paypal.com/v1/payments/payment/PAY-8LP54154BP414945AKUPJ37Y/execute","rel":"execute","method":"POST"}]}

其中“links”数组中的第二个元组包含应跳转的PayPal页面地址。

支付成功处理

用户在PayPal页面中完成支付后,PayPal会自动跳转回之前设定的支付请求成功处理页面并将paymentId和payerID以参数的形式传递给页面。

payment = paypalrestsdk.Payment.find("PAY-57363176S1057143SKE2HO3A")
if payment.execute({"payer_id": "DUFRQ8GWYMJXC"}):
    print("Payment execute successfully")
else:
    print(payment.error)

使用payment.find(paymentId)方法查找订单并使用payment.execute(paymentId,payerID)方法执行订单加入支付用户信息。payment.execute方法会返回一个boolean值,若为true则代表处理成功,false为处理失败。