异步贝宝客户端
aiopaypal的Python项目详细描述
空气瓶
贝宝rest api的异步包装器
设置
$ pip install aiopaypal
依赖关系
- aiohttp
- 所有文件
- pyopenssl
用法
初始值
fromaiopaypalimportPaypalaiopaypal=Paypal(mode='live',client_id='client_id',client_secret='client_secret',)
创建用户订阅
1。创建支付体验(可选)(仅限一次):
payment_experience=awaitaiopaypal.post(url='/v1/payment-experience/web-profiles'json={'name':'Payment profile name','presentation':{'logo_image':'https://brand-logo.png,'brand_name':'Brand Name'},'flow_config':{'landing_page_type':'Billing','user_action':'commit','return_uri_http_method':'GET'},'input_fields':{'no_shipping':1,# No shipping address (digital goods)},'temporary':False})
2。创建帐单计划(在其中指定计划的详细信息)(仅执行一次):
billing_plan=awaitaiopaypal.post(url='/v1/payments/billing-plans',json={"name":'Name of the plan',"description":'Description of the plan',"type":"INFINITE","payment_definitions":[{"name":'Name of the payment,"cycles":"0","frequency":"MONTH","frequency_interval":"1","type":"REGULAR","amount":{"value":str(123),"currency":'usd'},}],"merchant_preferences":{"setup_fee":{"value":str(123),"currency":currency},"auto_bill_amount":"yes",# Default "NO",'return_url':'https://example.com/payment/success-callback','cancel_url':'https://example.com/payment/cancel-callback,"initial_fail_amount_action":"cancel",# Default CONTINUE"max_fail_attempts":"3","auto_bill_amount":"YES",}})
3。创建Webhook以侦听订阅事件(仅执行一次):
hook_profile=awaitaiopaypal.post(url='/v1/notifications/webhooks',json={url='https://example.com/webhook/',event_types=[{'name':'BILLING.SUBSCRIPTION.CANCELLED'},{'name':'BILLING.SUBSCRIPTION.SUSPENDED'},{'name':'BILLING.SUBSCRIPTION.RE-ACTIVATED'},]})
^{str 1}4美元。创建计费协议(将用户绑定到在“2.”创建的计费计划)并执行它:
asyncdefcreate_agreement():returnawaitaiopaypal.post(url='',json={'name':'Agreement name','description':'Agreement Description','start_date':(datetime.datetime.utcnow()+ \ datetime.timedelta(days=1)).isoformat()[:-7]+'Z'# The start date must be no less than 24 hours after the current date as the agreement can take up to 24 hours to activate.'plan':{'id':billing_plan['id']},'payer':{'payment_method':'paypal','payer_info':{'email':'email@email.email'}}})defget_execute_from_response(response):forlinkinresponse['links']:iflink['rel']=='execute':returnlink['href']
4.1创建协议:
@app.route('/create-agreement)asyncdefcreate_agreement():billing_agreement=awaitcreate_agreement()returnmake_user_open(get_execute_from_response(billing_agreement))
4.2成功后激活:
# Second step (user callback)@app.route('/success-callback',methods=['GET'])asyncdeffinalize_agreement(request):token=request.args.get('token')user_id=request['session']['user_id']active_agreement=awaitaiopaypal.post('/v1/payments/billing-agreements/{}/agreement-execute'.format(token),extra_headers={'Content-Type':'application/json'})ifactive_agreement['state'].lower()!='active'and \ active_agreement['state'].lower()!='pending':else:awaitstore_user_agreement_id(user_id,active_agreement['id'])activate_premium_product(user_id)return_to_user('Payment {}'.format(active_agreement['state']))
^{str 1}5美元。听取协议更改:
@app.route('/webhook',methods=['POST','GET'])asyncdefhook(request):try:awaitaiopaypal.verify_from_headers(webhook_id=webhook['id'],# webhook response from "3."event_body=request.body.decode(),headers=headers)exceptPaypalErrorase:logger.exception(e)returnelse:event=request.jsonevent_type=event.get('event_type')agreement_id=event['resource']['id']ifevent_type=='BILLING.SUBSCRIPTION.SUSPENDED':logger.info('Billing agreement {} suspended'.format(agreement_id))awaitsuspend_agreement_by_agreement_id(agreement_id)elifevent_type=='BILLING.SUBSCRIPTION.CANCELLED':logger.info('Billing agreement {} cancelled'.format(agreement_id))awaitcancel_agreement_by_id(agreement_id)elifevent_type=='BILLING.SUBSCRIPTION.RE-ACTIVATED':logger.info('Agreement with ID: {} REACTIVATED'.format(agreement_id))awaitreactivate_agreement_by_id(agreement_id)elifevent_type=='PAYMENT.SALE.PENDING'or \ event_type=='PAYMENT.ORDER.CREATED'or \ event_type=='BILLING.SUBSCRIPTION.CREATED':logger.info('Payment/Subscription Created')else:logger.critical('Got unexpected event type {}'.format(event['resource']['id']))finally:# must return 200, else Paypal won't stop sendingreturnresponse.text('OK')
创建用户付款
... Figured it out? Help others and make a pull request :)
联系方式
我目前是一名自由软件开发人员。喜欢我的工作给我找工作?
想全职雇用我吗?给我发邮件@omarryhan@gmail.com
给我买杯咖啡
比特币:3nmywnkr1lzo8gynxfunzvboziacpea31z
以太坊:0x1e1400c311cd813685fe0f6d29e0f91c1da4675ae
比特币现金:qqzn7rsav6hr3zqcp4829s48hvsvjat4zq7j42wkxd
litecoin:mb5m3ce3je4e8nwgcwofjlvgqjdqpyyejp
paypal:https://paypal.me/omarryhan