diff --git a/.gitignore b/.gitignore index e23c54a..a430a46 100644 --- a/.gitignore +++ b/.gitignore @@ -144,4 +144,5 @@ cython_debug/ .idea/ #example.py file -example.py \ No newline at end of file +example.py +sdk_dev.py \ No newline at end of file diff --git a/paypayopa/client.py b/paypayopa/client.py index be34867..8b221a6 100644 --- a/paypayopa/client.py +++ b/paypayopa/client.py @@ -12,12 +12,10 @@ from pkg_resources import DistributionNotFound from types import ModuleType -from .constants import URL, HTTP_STATUS_CODE, ERROR_CODE +from .constants import URL, HTTP_STATUS_CODE from . import resources -from .errors import ServerError - def capitalize_camel_case(string): return "".join(map(str.capitalize, string.split('_'))) @@ -138,7 +136,7 @@ def auth_header(self, api_key, api_secret, header = ":".join(header_list) return "{}:{}".format(auth_type, header) - def request(self, method, path, auth_header, **options): + def request(self, method, path, auth_header, api_id, **options): """ Dispatches a request to the PayPay HTTP API """ @@ -152,71 +150,73 @@ def request(self, method, path, auth_header, **options): (response.status_code < HTTP_STATUS_CODE.REDIRECT)): return response.json() else: - msg = "" - code = "" - print(response.status_code) json_response = response.json() - print(json_response) - if 'resultInfo' in json_response: - if 'message' in json_response['resultInfo']: - msg = json_response['resultInfo']['message'] - if 'code' in json_response['resultInfo']: - code = str(json_response['resultInfo']['code']) - # More error will be returned by API response - if str.upper(code) == ERROR_CODE.SERVER_ERROR: - raise ServerError(msg) - - def get(self, path, params, **options): + resolve_url = "{}?api-id={}&code={}&code-name={}".format( + URL.RESOLVE, + api_id, + json_response['resultInfo']['code'], + json_response['resultInfo']['codeId']) + print("This link should help you to troubleshoot the error: " + resolve_url) + return json_response + + def get(self, path, params, api_id, **options): """ Parses GET request options and dispatches a request """ method = "GET" data, auth_header = self._update_request(None, path, method, options) - return self.request('get', + return self.request("get", path, params=params, auth_header=auth_header, + api_id=api_id, **options) - def post(self, path, data, **options): + def post(self, path, data, api_id, **options): """ Parses POST request options and dispatches a request """ method = "POST" data, auth_header = self._update_request(data, path, method, options) - return self.request('post', + return self.request("post", path, data=data, auth_header=auth_header, + api_id=api_id, **options) - def patch(self, path, data, **options): + def patch(self, path, data, api_id, **options): """ Parses PATCH request options and dispatches a request """ method = "PATCH" data, auth_header = self._update_request(data, path, method, options) - return self.request(method, path, auth_header=auth_header, **options) + return self.request("patch", + path, + auth_header=auth_header, + api_id=api_id, + **options) - def delete(self, path, data, **options): + def delete(self, path, data, api_id, **options): """ Parses DELETE request options and dispatches a request """ method = "DELETE" data, auth_header = self._update_request(data, path, method, options) - return self.request('delete', + return self.request("delete", path, data=data, auth_header=auth_header, + api_id=api_id, **options) - def put(self, path, data, **options): + def put(self, path, data, api_id, **options): """ Parses PUT request options and dispatches a request """ method = "PUT" data, auth_header = self._update_request(data, path, method, options) - return self.request('put', + return self.request("put", path, data=data, auth_header=auth_header, diff --git a/paypayopa/constants/__init__.py b/paypayopa/constants/__init__.py index a9db4c3..fb88bdb 100644 --- a/paypayopa/constants/__init__.py +++ b/paypayopa/constants/__init__.py @@ -1,9 +1,11 @@ from .http_status_code import HTTP_STATUS_CODE from .error_code import ERROR_CODE from .url import URL +from .api_list import API_NAMES __all__ = [ 'HTTP_STATUS_CODE', 'ERROR_CODE', 'URL', + 'API_NAMES', ] diff --git a/paypayopa/constants/api_list.py b/paypayopa/constants/api_list.py new file mode 100644 index 0000000..325fd4f --- /dev/null +++ b/paypayopa/constants/api_list.py @@ -0,0 +1,22 @@ +class API_NAMES(object): + CANCEL_PAYMENT = "v2_cancelPayment" + CAPTURE_PAYMENT = "v2_captureAuthorizedOrder" + CREATE_PAYMENT = "v2_createPayment" + CREATE_QRCODE = "v2_createDynamicQRCode" + DELETE_QRCODE = "v2_deleteDynamicQRCode" + GET_PAYMENT = "v2_getPaymentDetail" + GET_QR_PAYMENT = "v2_getQRPaymentDetails" + GET_REFUND = "v2_getRefundDetails" + REFUND_PAYMENT = "v2_createRefundPayment" + REVERT_AUTHORIZE = "v2_revertAuthorizedOrder" + PREAUTHORIZE_PAYMENT = "v2_createOrderAndAuthorize" + CREATE_CONTINUOUS_PAYMENT = "v1_createSubscriptionPayment" + CREATE_REQUEST_ORDER = "v1_createRequestOrder" + GET_REQUEST_ORDER = "v1_getRequestOrder" + CANCEL_REQUEST_ORDER = "v1_cancelRequestOrder" + REFUND_REQUEST_ORDER = "v1_createRequestOrderRefund" + GET_SECURE_USER_PROFILE = "v2_getSecureUserProfile" + CHECK_BALANCE = "v2_checkWalletBalance" + GET_USER_AUTH_STATUS = "v2_userAuthStatus" + UNLINK_USER = "v2_unlinkUser" + CREATE_QR_SESSION = "v1_qrSession" \ No newline at end of file diff --git a/paypayopa/constants/error_code.py b/paypayopa/constants/error_code.py index c9423d1..c89a540 100644 --- a/paypayopa/constants/error_code.py +++ b/paypayopa/constants/error_code.py @@ -2,3 +2,4 @@ class ERROR_CODE(object): BAD_REQUEST_ERROR = "BAD_REQUEST_ERROR" GATEWAY_ERROR = "GATEWAY_ERROR" SERVER_ERROR = "SERVER_ERROR" + UNAUTHORIZED = "UNAUTHORIZED" diff --git a/paypayopa/constants/url.py b/paypayopa/constants/url.py index 9a29672..6adb909 100644 --- a/paypayopa/constants/url.py +++ b/paypayopa/constants/url.py @@ -1,6 +1,7 @@ class URL(object): SANDBOX_BASE_URL = 'https://stg-api.sandbox.paypay.ne.jp' PRODUCTION_BASE_URL = 'https://api.paypay.ne.jp' + RESOLVE = 'https://developer.paypay.ne.jp/develop/resolve' CODE = "/v2/codes" PAYMENT = "/v2/payments" ACCOUNT_LINK = "/v1/qr/sessions" diff --git a/paypayopa/resources/base.py b/paypayopa/resources/base.py index 9031e52..33d1806 100644 --- a/paypayopa/resources/base.py +++ b/paypayopa/resources/base.py @@ -6,31 +6,31 @@ def __init__(self, client=None): def all(self, data, **kwargs): return self.get_url(self.base_url, data, **kwargs) - def fetch(self, id, url=None, data={}, **kwargs): + def fetch(self, id, url=None, data={}, api_id=None, **kwargs): if(url): self.url = url else: self.url = "{}/{}".format(self.base_url, id) - return self.get_url(self.url, data, **kwargs) + return self.get_url(self.url, data, api_id, **kwargs) - def get_url(self, url, data, **kwargs): - return self.client.get(url, data, **kwargs) + def get_url(self, url, data, api_id, **kwargs): + return self.client.get(url, data, api_id, **kwargs) - def patch_url(self, url, data, **kwargs): - return self.client.patch(url, data, **kwargs) + def patch_url(self, url, data, api_id, **kwargs): + return self.client.patch(url, data, api_id, **kwargs) - def post_url(self, url, data, **kwargs): - return self.client.post(url, data, **kwargs) + def post_url(self, url, data, api_id, **kwargs): + return self.client.post(url, data, api_id, **kwargs) - def put_url(self, url, data, **kwargs): - return self.client.put(url, data, **kwargs) + def put_url(self, url, data, api_id, **kwargs): + return self.client.put(url, data, api_id, **kwargs) - def delete_url(self, url, data, **kwargs): - return self.client.delete(url, data, **kwargs) + def delete_url(self, url, data, api_id, **kwargs): + return self.client.delete(url, data, api_id, **kwargs) - def delete(self, id, url=None, data={}, **kwargs): + def delete(self, id, url=None, data={}, api_id=None, **kwargs): if(url): self.url = url else: self.url = "{}/{}/".format(self.base_url, id) - return self.delete_url(self.url, data, **kwargs) + return self.delete_url(self.url, data, api_id **kwargs) diff --git a/paypayopa/resources/code.py b/paypayopa/resources/code.py index 137f868..07c5326 100644 --- a/paypayopa/resources/code.py +++ b/paypayopa/resources/code.py @@ -1,8 +1,8 @@ from ..resources.base import Resource from ..constants.url import URL +from ..constants.api_list import API_NAMES import datetime - class Code(Resource): def __init__(self, client=None): super(Code, self).__init__(client) @@ -39,18 +39,18 @@ def create_qr_code(self, data=None, **kwargs): if "currency" not in item["unitPrice"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for orderItem.amount.currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.CREATE_QRCODE, **kwargs) def get_payment_details(self, id, **kwargs): url = "{}/{}/{}".format(self.base_url, 'payments', id) if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantPaymentId") - return self.fetch(None, url, **kwargs) + return self.fetch(None, url, None, API_NAMES.GET_QR_PAYMENT, **kwargs) def delete_qr_code(self, id=None, **kwargs): if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for codeId") url = "{}/{}".format(self.base_url, id) - return self.delete(None, url, **kwargs) + return self.delete(None, url, API_NAMES.DELETE_QRCODE, **kwargs) diff --git a/paypayopa/resources/payment.py b/paypayopa/resources/payment.py index 50dd494..d045526 100644 --- a/paypayopa/resources/payment.py +++ b/paypayopa/resources/payment.py @@ -1,5 +1,6 @@ from .base import Resource from ..constants.url import URL +from ..constants.api_list import API_NAMES import datetime @@ -27,21 +28,21 @@ def create(self, data={}, **kwargs): if "currency" not in data["amount"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.CREATE_PAYMENT, **kwargs) def get_payment_details(self, id, **kwargs): url = "{}/{}".format(self.base_url, id) if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantPaymentId") - return self.fetch(None, url, **kwargs) + return self.fetch(None, url, None, API_NAMES.GET_PAYMENT, **kwargs) def cancel_payment(self, id, **kwargs): url = "{}/{}".format(self.base_url, id) if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantPaymentId") - return self.delete(None, url, **kwargs) + return self.delete(None, url, None, API_NAMES.CANCEL_PAYMENT, **kwargs) def refund_payment(self, data={}, **kwargs): url = "{}/".format('/v2/refunds') @@ -62,14 +63,14 @@ def refund_payment(self, data={}, **kwargs): if "currency" not in data["amount"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.REFUND_PAYMENT, **kwargs) def refund_details(self, id=None, **kwargs): if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantRefundId") url = "{}/{}".format('/v2/refunds', id) - return self.fetch(None, url, **kwargs) + return self.fetch(None, url, None, API_NAMES.GET_REFUND, **kwargs) def capture_payment(self, data=None, **kwargs): if data is None: @@ -95,12 +96,12 @@ def capture_payment(self, data=None, **kwargs): if "currency" not in data["amount"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS " "\x1b[0m for currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.CAPTURE_PAYMENT, **kwargs) def create_continuous_payment(self, data=None, **kwargs): if data is None: data = {} - url = "{}/{}".format('v1/subscription', 'payments') + url = "{}/{}".format('/v1/subscription', 'payments') if "requestedAt" not in data: data['requestedAt'] = int(datetime.datetime.now().timestamp()) if "merchantPaymentId" not in data: @@ -118,7 +119,7 @@ def create_continuous_payment(self, data=None, **kwargs): if "currency" not in data["amount"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS " "\x1b[0m for currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.CREATE_CONTINUOUS_PAYMENT, **kwargs) def revert_payment(self, data=None, **kwargs): if data is None: @@ -132,4 +133,4 @@ def revert_payment(self, data=None, **kwargs): if "paymentId" not in data: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantPaymentId") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.REVERT_AUTHORIZE, **kwargs) diff --git a/paypayopa/resources/pending.py b/paypayopa/resources/pending.py index 5375660..49b4867 100644 --- a/paypayopa/resources/pending.py +++ b/paypayopa/resources/pending.py @@ -1,5 +1,6 @@ from .base import Resource from ..constants.url import URL +from ..constants.api_list import API_NAMES import datetime @@ -27,21 +28,21 @@ def create_pending_payment(self, data={}, **kwargs): if "currency" not in data["amount"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.CREATE_REQUEST_ORDER, **kwargs) def get_payment_details(self, id, **kwargs): url = "{}/{}".format(self.base_url, id) if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantPaymentId") - return self.fetch(None, url, **kwargs) + return self.fetch(None, url, None, API_NAMES.GET_REQUEST_ORDER, **kwargs) def cancel_payment(self, id, **kwargs): url = "{}/{}".format(self.base_url, id) if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantPaymentId") - return self.delete(None, url, **kwargs) + return self.delete(None, url, None, API_NAMES.CANCEL_REQUEST_ORDER, **kwargs) def refund_payment(self, data={}, **kwargs): url = "{}/{}".format(self.base_url, 'refunds') @@ -62,11 +63,11 @@ def refund_payment(self, data={}, **kwargs): if "currency" not in data["amount"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.REFUND_REQUEST_ORDER, **kwargs) def refund_details(self, id=None, **kwargs): if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for merchantRefundId") url = "{}/{}".format(self.base_url, id) - return self.fetch(None, url, **kwargs) + return self.fetch(None, url, None, API_NAMES.CANCEL_REQUEST_ORDER, **kwargs) diff --git a/paypayopa/resources/preauth.py b/paypayopa/resources/preauth.py index 7352a24..2f64ef6 100644 --- a/paypayopa/resources/preauth.py +++ b/paypayopa/resources/preauth.py @@ -1,5 +1,6 @@ from .base import Resource from ..constants.url import URL +from ..constants.api_list import API_NAMES import datetime @@ -30,4 +31,4 @@ def pre_authorize_create(self, data={}, **kwargs): if "currency" not in data["amount"]: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for currency") - return self.post_url(url, data, **kwargs) + return self.post_url(url, data, API_NAMES.PREAUTHORIZE_PAYMENT **kwargs) diff --git a/paypayopa/resources/user.py b/paypayopa/resources/user.py index 97ea7dc..5ba20f3 100644 --- a/paypayopa/resources/user.py +++ b/paypayopa/resources/user.py @@ -1,5 +1,6 @@ from ..resources.base import Resource from ..constants.url import URL +from ..constants.api_list import API_NAMES class User(Resource): @@ -15,11 +16,11 @@ def get_authorization_status(self, id, **kwargs): if id is None: raise ValueError("\x1b[31m MISSING QUERY PARAM" " \x1b[0m for userAuthorizationId") - return self.fetch(None, url, params, **kwargs) + return self.fetch(None, url, params, API_NAMES.GET_USER_AUTH_STATUS, **kwargs) def unlink_user_athorization(self, id=None, **kwargs): if id is None: raise ValueError("\x1b[31m MISSING REQUEST PARAMS" " \x1b[0m for codeId") url = "{}/{}".format(self.base_url, id) - return self.delete(None, url, **kwargs) + return self.delete(None, url, API_NAMES.UNLINK_USER **kwargs)