Skip to content

Instantly share code, notes, and snippets.

@pourya2374
Created February 20, 2019 18:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pourya2374/8e95a15d3963afa7713ac722179edb41 to your computer and use it in GitHub Desktop.
Save pourya2374/8e95a15d3963afa7713ac722179edb41 to your computer and use it in GitHub Desktop.
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