میخوام یه پکیج گولنگ معرفی کنم برای اتصال به درگاه های بانکی مختلف با تنظیمات متفاوت. چند وقتی میشه که کار نوشتن این پکیج رو شروع کردم و خودم روی پروژه هام دارم استفاده میکنم. این پکیج کاملا ماژولار درست شده که به راحتی میتونید تنظیماتتون رو انجام بدین و چندین درگاه (مثلا چند درگاه زرین پال با شناسه متفاوت) رو روی یک پروژه داشته باشید و با توجه به شرایطی که مدنظرتون هست به هرکدوم که خواستید ارجاع بدید.
پکیج که روی گیت هاب موجوده،لینک مستندات رسمی پکیج این زیر گذاشتم :
https://github.com/mohammadv184/gopayment
این پکیج از درگاه های مختلفی استفاده میکنه که میتونید لیست کاملشو تو این لینک ببینید
برای نصب پکیج کافیه از دستور زیر استفاده کنید:
go get -u github.com/mohammadv184/gopayment
حالا پکیج نصب شده و میتونید استفاده کنید.
برای گام اول باید درگاه پرداخت با تنظیمات خودتون ایجاد کنید و یه جا نگه دارین مثل زیر:
// Configure the Gateway Driver paypingDriver:=&payping.Driver{ Callback: "http://example.test/callback", Token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", } // OR zarinpalDriver:=&zarinpal.Driver{ Callback: "http://example.test/callback", Merchent: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", }
برای گام بعدی ما برای اینکه بتونیم کاربر به صفحه پرداخت منتقل کنیم نیاز به یک کدی داریم که قبلش باید از درگاه موردنظر بگیریم مثل زیر میتونین عمل کنین:
// Create new Payment. payment := gopayment.NewPayment(paypingDriver) // Set Invoice Amount. payment.Amount(1000) // Purchase the invoice. err = payment.Purchase() if err != nil { fmt.Println(err) } // Get Transaction ID transactionID := payment.GetTransactionID()
اول یه payment میسازیم و درایوری که میخوایم پرداخت باهاش صورت بگیره مثلا درایور payping که قبلا ایجاد کردیم رو به عنوان آرگومان اول بهش پاس میدیم , بعد مبلغ فاکتور به تومان با متود Amount مشخص میکنیم و purchase میکنیم اگر عملیات موفق باشه و هیچ اروری بر نگردونه کد تراکنش میگیریم و یه جا نگه میداریم.
حالا میتونیم با متود payURL لینک صفحه پرداخت بگیریم و کاربر بفرستیم برای پرداخت:
// Redirect the user to the bank payment page. payUrl := payment.PayURL() c.Redirect(http.StatusFound, payUrl)
بعد از اینکه کاربر پرداخت رو انجام داد با یکسری پارامتر ها که برای هر درگاه متفاوته برمیگرده به همون آدرس callback که وقتی داشتیم درایور درگاه ایجاد میکردیم مشخص کردیم
حالا باید نتیجه پرداخت چک کنیم و پرداخت تایید کنیم و به کاربر اطلاع بدیم پرداختش موفق بوده یا نه:
refId := c.Query("refId") VerifyRequest:=&payping.VerifyRequest{ Amount: "100", RefID: refID, } if receipt, err := paypingDriver.Verify(VerifyRequest); err == nil { cardNum, _ := receipt.GetDetail("cardNumber") c.JSON(200, gin.H{ "status": "success", "data": receipt.GetReferenceID(), "date": receipt.GetDate().String(), "card": cardNum, "driver": receipt.GetDriver(), }) } else { c.JSON(200, gin.H{ "message": "error " + err.Error(), }) }
کل مراحل پرداخت به اینصورت بود که داخل این ریپو به صورت یک فروشگاه ساده پیاده سازی شده میتونید ببینید.
امیدوارم توضیحاتم مفید بوده باشه. توضیحات تکمیلی رو می تونید توی گیت هاب ببینید. اگه پکیج رو نصب کردین و خوشتون اومد، ستاره یادتون نره! انتقادات و پیشنهادات هم میتونید توی Issue مطرح کنید یا Pull Request بزنید.