כך סולקים באמצעות PHP

הסבר ודוגמאות לסליקת כרטיסי אשראי באמצעות PHP ו-Curl עם דוגמה של שירות הסליקה טרנזילה.

סליקה בכרטיס אשראי היא דבר שמשום מה די מפחיד מתכנתים והאמת היא שאני לא יודע למה. במאמר הזה אני אסביר מעט על העקרונות של הסליקה ואדגים סליקה של טרנזילה. כמובן שאפשר להשתמש בהדגמות על מנת להשתמש בשירותי הסליקה של כל חברה אחרת (ויש המון).

ראשית, מהי סליקה? סליקה היא שם כולל לאימות ואילוץ עסקאות של כרטיסי אשראי ברשת האינטרנט. או הפעולות שמתרחשות מאחורי הקלעים בין השלב שבו הלקוח מכניס את פרטי כרטיס האשראי ועד לשלב שבו אתה מקבל את הכסף. על מנת לקחת מספר כרטיס אשראי של לקוח ולעשות איתו משהו אנחנו חייבים חשבון בחברת סליקה. יש לא מעט חברות סליקה בשוק וכל עוסק מורשה יכול ליצור איתן קשר ולאחר בדיקה והסברים ליצור שם חשבון. עם יצירת החשבון אתם מקבלים שם משתמש שמזהה אתכם במערכת וסיסמה.

אימות מול אילוץ

אימות כרטיס אשראי הוא בעצם בדיקת כרטיס האשראי על מנת לבדוק שהוא תקין ושהפרטים הקשורים אליו כמו שם בעל הכרטיס, מספר ה-CCV (מספר הבטחון מאחורי הכרטיס) ומספר תעודת הזהות של בעל הכרטיס נכונים. וכמובן בדיקה שהכרטיס תקין ובתוקף. אימות לא גובה מהלקוח כסף ולא גורם לו להיות מחויב.

אילוץ הוא הפעולה שמעבירה כסף מבעל כרטיס האשראי אל הכיס שלנו. ניתן לבצע אילוץ ללא אימות וניתן לבצע אילוץ לאחר אימות.

הדרך המקובלת באתרים קטנים היא לבצע אימות באמצעות סליקה ולאחר משלוח המוצר, לבצע אילוץ ידני באמצעות המערכת.

ביצוע אימות

על מנת לבצע אימות, כל מה שעלינו לעשות זה לשלוח את פרטי כרטיס האשראי ופרטים נוספים אל שרת הסליקה. שרת הסליקה מחזיר אישור (או במידה ויש בעיה כלשהי, מחזיר את סיבת הבעיה). האישורים ושמות הפרמטרים תלויים בשירות הסליקה.

אני אדגים באמצעות טרנזילה. טרנזילה מבקשת לתהליך האימות את הפרמטרים הבאים:

supplier
sum
price
cname
amount
address
city
zipCode
email
cardNum
eYear
eMonth
cvv2
myid

כאשר כל פרמטר צריך שיכיל את המידע הרלוונטי. cvv2 צריך להכיל את ה-CVV של הכרטיס, myid צריך להכיל את מספר תעודת הזהות של בעל הכרטיס וכך הלאה – לפי מה שמערכת הסליקה רוצה.
במקרה של טרנזילה יש בקשה לעוד שני פרמטרים עם הערכים הבאים:
task=Doverify
tranmode=V

על מנת לשלוח את הפרמטרים באמצעות Curl, אנו צריכים להכין מחרוזת טקסט ארוכה שלהם – בדיוק כמו בטופס. משהו כמו:


supplier=SUPPNUMBER&sum=10.00&price=5.00&cname=מוצרכלשהו&amount=1&address=רחוב שקר כלשהו 100&city=פתח תקוה[email protected]&cardNum=XXXXXXXXXXX&eYear=2015&eMonth=12&first_name=רן&last_name=בר-זיק&cvv2=732&myid=33444447&task=Doverify&tranmode=V

את הפרמטרים האלו אנו יכולים לשלוח אל טרנזילה באמצעות Curl. אני הסברתי איך להשתמש ב-CURL וב-PHP באופן מאד מפורט במאמר על CURL וב-PHP. כך יראה הקוד למשל:


$host = 'https://secure5.tranzilla.com/31.cgi'

$params = 'supplier=SUPPNUMBER&sum=10.00&price=5.00&cname=מוצרכלשהו&amount=1&address=רחוב שקר כלשהו 100&city=פתח תקוה[email protected]&cardNum=XXXXXXXXXXX&eYear=2015&eMonth=12&first_name=רן&last_name=בר-זיק&cvv2=732&myid=33444447&task=Doverify&tranmode=V';

$curl_connection = curl_init();
curl_setopt($curl_connection, CURLOPT_URL, $host);
curl_setopt($curl_connection, CURLOPT_POST, 1);
curl_setopt($curl_connection, CURLOPT_FAILONERROR, true);
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $params);
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, 0);

// actual curl execution perfom
$result = curl_exec($curl_connection);

// on error - exit with error message
$error = curl_error($curl_connection);
if(!empty($error)) {
	die($error);
}
curl_close($curl_connection);

במידה והכנסנו את כל הפרמטרים באופן תקין, אנו נקבל תשובה. התשובה שאנו מקבלים מטרנזילה היא קוד מסוים כאשר '000' נחשב לקוד תקין ושאר הקודים הם קודים של שגיאות. כאשר טרנזילה מפרטת את הקודים של השגיאות. ניתן לבנות מערכת קטנה של switch-case כדי שתציג בפני הלקוח באופן מובן את השגיאה. במידה והתשובה '000' אנחנו נדפיס אישור ונוכל לראות את האימות במערכת. לאחר אספקת המוצר ללקוח אנו נוכל ללחוץ על אילוץ ולסיים עם העסקה כשכולם מאושרים.

באופן עקרוני ההדגמה כאן נעשתה על פי טרנזילה, אבל עם קצת שינויים ניתן להתאים אותה לכל שירות סליקה אחר כגון 'paypal' ואחרים.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

גלילה לראש העמוד