PayPal支付
PayPal支付和PayPal-python-SDK使用
2015/8/1 by DKZ
PayPal提供完善的支付接口和文档支持
在构建一个支付系统之前,首先要在PayPal上注册个人高级账号并创建应用,PayPal会提供唯一的clientid和clientsecret供构建支付使用。执行支付之前PayPal要求使用clientid和clientsecret获得一个access token,通过这个access token就可以调用PayPal的支付接口了。
PayPal支付流程主要分为以下三步:
- 创建并向PayPal传送一个支付请求。
- 跳转到PayPal页面,PayPal引导用户完成支付。
- 支付成功跳转至支付处理成功界面或支付失败跳转到支付失败界面。
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为处理失败。