Created
February 20, 2019 18:02
-
-
Save pourya2374/8e95a15d3963afa7713ac722179edb41 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import base64 | |
import json | |
import pytz | |
from datetime import datetime | |
import pyDes as pyDes | |
import requests | |
class Sadad: | |
MERCHANT_ID = '{your_merchant_id}' | |
TERMINAL_ID = '{your_terminal_id}' | |
TERMINAL_KEY = '{your_terminal_key}' | |
BASE_PAYMENT_URL = 'https://sadad.shaparak.ir/VPG/Purchase' | |
PAYMENT_REQUEST_URL = 'https://sadad.shaparak.ir/VPG/api/v0/Request/PaymentRequest' | |
PAYMENT_VERIFY_URL = 'https://sadad.shaparak.ir/VPG/api/v0/Advice/Verify' | |
def __init__(self, amount, order_id, return_url): | |
self.order_id = order_id | |
self.return_url = return_url | |
self.amount = amount * 10 # change to rial | |
self.sign_data = self.gen_sign_data() | |
self.token = None | |
self.payment_url = None | |
def payment_request(self): | |
data = json.dumps({ | |
'MerchantId': Sadad.MERCHANT_ID, | |
'TerminalId': Sadad.TERMINAL_ID, | |
'Amount': self.amount, | |
'OrderId': self.order_id, | |
'LocalDateTime': Sadad.get_local_time(), | |
'ReturnUrl': self.return_url, | |
'SignData': self.sign_data}) | |
response = requests.post( | |
Sadad.PAYMENT_REQUEST_URL, | |
data=data, | |
headers={"Content-Type": "application/json", "Content-Length": str(len(data))} | |
) | |
if response.status_code != 200: | |
raise Exception('Gateway HTTP error: {}\ntext: {}'.format(response.status_code, response.text)) | |
response = json.loads(response.text) | |
if response['ResCode'] != '0': | |
raise Exception('Sadad error: {}\ntext: {}'.format(response['ResCode'], response['Description'])) | |
self.token = response['Token'] | |
self.payment_url = self.gen_pay_url() | |
return self.token | |
@staticmethod | |
def verify_payment(token): | |
# todo: add tenacity package for retrying | |
data = json.dumps({'SignData': Sadad.encrypt_3des(token), 'Token': token}) | |
response = requests.post( | |
Sadad.PAYMENT_VERIFY_URL, | |
data=data, | |
headers={'Content-Type': 'application/json', 'Content-Length': str(len(data))} | |
) | |
if response.status_code != 200: | |
raise Exception('Gateway HTTP error: {}\ntext: {}'.format(response.status_code, response.text)) | |
return json.loads(response.text) | |
def gen_sign_data(self): | |
text = '{};{};{}'.format(self.TERMINAL_ID, self.order_id, self.amount) | |
return Sadad.encrypt_3des(text) | |
def gen_pay_url(self): | |
return '{}?Token={}'.format(Sadad.BASE_PAYMENT_URL, self.token) | |
@staticmethod | |
def get_local_time(): | |
return datetime.now(pytz.timezone('Asia/Tehran')).strftime('%m/%d/%Y %I:%M:%S %p') | |
@staticmethod | |
def encrypt_3des(text): | |
key = base64.b64decode(Sadad.TERMINAL_KEY) | |
des = pyDes.triple_des(key, mode=pyDes.ECB, padmode=pyDes.PAD_PKCS5) | |
encrypted_string = des.encrypt(text) | |
base64_encoded = base64.b64encode(encrypted_string) | |
return base64_encoded.decode('ascii') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment