Package: gopay
GoPay's Python SDK for Payments REST APIRequirementsPython >= 3.8.1dependencies:requestsdeprecatedInstallationThe simplest way to install SDK is to usePIP:pipinstallgopayBasic usageimportgopayfromgopay.enumsimportTokenScope,Language# minimal configurationpayments=gopay.payments({"goid":"{{YOUR-GOID}}","client_id":"{{YOUR-CLIENT-ID}}","client_secret":"{{YOUR-CLIENT-SECRET}}","gateway_url":'https://gw.sandbox.gopay.com/api'})# full configurationpayments=gopay.payments({"goid":"{{YOUR-GOID}}","client_id":"{{YOUR-CLIENT-ID}}","client_secret":"{{YOUR-CLIENT-SECRET}}","gateway_url":'https://gw.sandbox.gopay.com/api'"scope":TokenScope.ALL,"language":Language.CZECH})# Sandbox URL: https://gw.sandbox.gopay.com/api# Production URL: https://gate.gopay.cz/apiConfigurationRequired fieldsRequired fieldData typeDocumentationgoidstringGoID assigned by GoPay (production or sandbox)client_idstringClient ID assigned by GoPay (production or sandbox)client_secretstringClient Secret assigned by GoPay (production or sandbox)gateway_urlstringURL of the environment - production or sandbox (seeDocs)Optional fieldsOptional fieldData typeDefault valueDocumentationscopestringgopay.enums.TokenScope.ALLhttps://doc.gopay.com/#access-tokenlanguagestringgopay.enums.Language.ENGLISHdefault language to use +localization of errorsAvailable methodsAPISDK methodCreate a paymentpayments.create_payment(payment: dict)Get status of a paymentpayments.get_status(payment_id: str | int)Refund a paymentpayments.refund_payment(payment_id: int | str, amount: int)Create a recurring paymentpayments.create_recurrence(payment_id: int | str, payment: dict)Cancel a recurring paymentpayments.void_recurrence(payment_id: int | str)Capture a preauthorized paymentpayments.capture_authorization(payment_id: int | str)Capture a preauthorized payment partiallypayments.capture_authorization_partial(payment_id: int | str, payment: dict)Void a preauthorized paymentpayments.void_authorization(payment_id: int | str)Get payment card detailspayments.get_card_details(card_id: int | str)Delete a saved cardpayments.delete_card(card_id: int | str)Get allowed payment methods for a currencypayments.get_payment_instruments(goid: int | str, currency: gopay.enums.Currency)Get all allowed payment methodspayments.get_payment_instruments_all(goid: int | str)Generate an account statementpayments.get_account_statement(statement_request: dict)SDK response? Has my call succeed?SDK returns wrapped API response. Every method returnsgopay.http.Responseobject. Structure of thejsonshould be same as indocumentation.
SDK throws no exception. Please create an issue if you catch one.response=payments.create_payment(...)ifresponse.success:print(f"Hooray, API returned{response}")returnresponse.json["gw_url"]# url for initiation of gatewayelse:# errors format: https://doc.gopay.com#HTTP-result-codesprint(f"Oops, API returned{response.status_code}:{response}")Property/MethodDescriptionresponse.successChecks if API call was successfulresponse.jsondecoded response, returned objects are converted into a dictionary if possiblemresponse.status_codeHTTP status coderesponse.raw_bodyraw bytes of the reponse contentAre required fields and allowed values validated?Not yet.APIvalidates fieldspretty extensively
so there is no need to duplicate validation in SDK. That's why SDK just calls API which
behavior is well documented indoc.gopay.com.
In the future, we might use Pydantic for parsing and validation.Advanced usageInitiation of the payment gateway# create payment and pass url to template (e.g. Flask, Django)response=payments.create_payment(...)ifresponse.has_succeed():context={'gateway_url':response.json['gw_url'],'embedjs_url':payments.get_embedjs_url}# render templateInline gateway<form action="{{gateway_url}}" method="post" id="gopay-payment-button"><button name="pay" type="submit">Pay</button><script type="text/javascript" src="{{embedjs_url}}"></script></form>Redirect gateway<form action="{{gateway_url}}" method="post"><button name="pay" type="submit">Pay</button></form>Asynchronous initialization using JavaScriptEnumsInstead of hardcoding bank codes string you can use predefined enums.
Check using enums increate-payment exampleTypeDescriptionLanguagePayment language, localization of error messagesToken scopeAuthorization scope forOAuth2Payment enumsEnums for creating paymentResponse enumsResult of creating payment, executing payment operationsCache access tokenAccess token expires after 30 minutes it's expensive to use new token for every request.
By default, tokens are stored in memorygopay.services.DefaultCacheso they are reused as long as the object exists.
But you can implement your cache and store tokens in Memcache, Redis, files, ... It's up to you.Your cache should inherit fromgopay.services.AbstractCacheand implement its methodsget_tokenandset_token.
Be aware that there are twoscopes(TokenScope) and
SDK can be used for different clients (client_id,gateway_url). Sokeypassed to methods is unique identifier (str) that is built for current environment.
Below you can see example implementation of caching tokens in memory:fromgopay.servicesimportAbstractCachefromgopay.httpimportAccessTokenclassMyCache(AbstractCache):def__init__(self):self.tokens:dict[str,AccessToken]={}defget_token(self,key:str)->AccessToken|None:returnself.tokens.get(key)# return None if token doesn't existdefset_token(self,key:str,token:AccessToken)->None:self.tokens[key]=token# register cache in optional service configurationpayments=gopay.payments({...},# your config{"cache":MyCache()})Log HTTP communicationYou can log every request and response from communication with API. Check available loggers below.
Or you can implement your own logger, just implement function that matches the following signature:deflogger(gopay.http.Request,gopay.http.Response)->Any:...# orCallable[[gopay.http.Response,gopay.http.Request],Any]For example:fromgopay.httpimportRequest,Responsedefmy_logger(request:Request,response:Response)->None:print(vars(request))print(vars(response))# register logger in optional service configurationpayments=gopay.payments({...},# your config{"logger":my_logger})The default logger useslogging.debugto log the responses and requests.ContributingContributions from others would be very much appreciated! Sendpull request/issue. Thanks!LicenseCopyright (c) 2023 GoPay.com. MIT Licensed,
seeLICENSEfor details.