Skip to content

Commit

Permalink
documentation actually
Browse files Browse the repository at this point in the history
  • Loading branch information
xerenahmed committed Mar 16, 2022
1 parent 2e6e3a5 commit 43c0797
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 50 deletions.
9 changes: 6 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# PayTR Go
<div style="display:flex;align-items:center;gap:40px;margin-bottom:50px">
<img src="https://user-images.githubusercontent.com/35738714/101142341-869c9d00-3626-11eb-93d5-d70ab6c1ca7b.png" width="128">
<b style="font-size:32px;">X</b>
<img src="https://www.paytr.com/img/general/paytr.svg" width="128" style="height:60px;">
</div>

Dökümantasyon girilecek.
**_example** dizinini inceleyerek kullanımını öğrenebilirsiniz.

![](https://user-images.githubusercontent.com/35738714/101142341-869c9d00-3626-11eb-93d5-d70ab6c1ca7b.png)
2 changes: 2 additions & 0 deletions doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// https://pkg.go.dev/github.com/xerenahmed/paytr
package paytr
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@ module github.com/xerenahmed/paytr

go 1.15

require github.com/gorilla/schema v1.2.0
require (
github.com/go-chi/chi v1.5.4
github.com/gorilla/schema v1.2.0
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs=
github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg=
github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc=
github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU=
5 changes: 2 additions & 3 deletions paytr.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@ import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"github.com/gorilla/schema"
"strconv"
)

var schemaEncoder = schema.NewEncoder()

// HandlePayment paytr tarafından kullanılan bir işlemin size haber verildiği bilgiler.
type HandlePayment struct {
Hash string `schema:"hash,required"`
MerchantId string `schema:"merchant_id"`
Expand All @@ -24,6 +22,7 @@ type HandlePayment struct {
FailedReasonMessage string `schema:"failed_reason_msg"`
}

// Valid Gelen isteğin doğruluğunu kontrol edin.
func (p HandlePayment) Valid(merchantKey, merchantSalt string) bool {
salt := hmac.New(sha256.New, []byte(merchantKey))
salt.Write([]byte(p.MerchantOid + merchantSalt + p.Status + strconv.Itoa(p.TotalAmount)))
Expand Down
78 changes: 40 additions & 38 deletions paytr_token.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,73 +5,75 @@ import (
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"strconv"

"github.com/gorilla/schema"
)

type mode int16

var (
Enable = mode(1)
// Enable ...
Enable = mode(1)
// Disable ...
Disable = mode(0)
)

// Basket siparişteki bir ürünün bilgilerini tutar.
type Basket struct {
Name string
PerCost int
Amount int
}

// PreparePayment
type PreparePayment struct {
// MerchantId PayTR tarafından size verilen Mağaza numarası
MerchantId int `schema:"merchant_id,required"`
MerchantId int `schema:"merchant_id,required"`
// UserIP İstek anında aldığınız müşteri ip numarası. En fazla 39 karakter (ipv4)
UserIP string `schema:"user_ip,required"`
// MerchantOid Satış işlemi için belirlediğiniz benzersizsipariş numarası.
// En fazla 64 karakter, Alfa numerik
MerchantOid string `schema:"merchant_oid,required"`
UserIP string `schema:"user_ip,required"`
// MerchantOid Satış işlemi için belirlediğiniz benzersiz sipariş numarası. En fazla 64 karakter, Alfa numerik
MerchantOid string `schema:"merchant_oid,required"`
// Mail Müşterinin sisteminizde kayıtlı olan eposta adresi.
Mail string `schema:"email,required"`
// PaymentAmount Siparişe ait toplam ödeme tutarının 100 ile çarpılmış hali.
// Örn: 34.56 TL için 3456 gönderilmelidir
PaymentAmount int `schema:"payment_amount,required"`
// token İsteğin sizden geldiğine ve içeriğin değişmediğine emin olmamız
// için oluşturacağınız değerdir.
token string `schema:"paytr_token,required"`
Mail string `schema:"email,required"`
// PaymentAmount Siparişe ait toplam ödeme tutarının 100 ile çarpılmış hali. Örn: 34.56 TL için 3456 gönderilmelidir
PaymentAmount int `schema:"payment_amount,required"`
// token İsteğin sizden geldiğine ve içeriğin değişmediğine emin olmamız için oluşturacağınız değerdir.
token string `schema:"paytr_token,required"`
// basket Müşterinin sepet/sipariş içeriğinin encode olmuş hali
basket string `schema:"user_basket,required"`
basket string `schema:"user_basket,required"`
// basketData Müşterinin sepet/sipariş içeriğinin sade hali
basketData []Basket `schema:"-"`
basketData []Basket `schema:"-"`
// Debug Hata durumunda nedeni açıklaması için 1 yapın. paytr.Enable = 1
Debug mode `schema:"debug_on"`
// NoInstallment Taksit yapılmasını istemiyorsanız,
// sadece tek çekim sunacaksanız 1 yapın. paytr.Enable = 1
NoInstallment mode `schema:"no_installment"`
// MaxInstallment Sayfada görüntülenecek taksit adedini sınırlamak istiyorsanız
// uygun şekilde değiştirin. Sıfır (0) gönderilmesi durumunda yürürlükteki en fazla
// izin verilen taksit geçerli olur.
MaxInstallment int16 `schema:"max_installment"`
Debug mode `schema:"debug_on"`
// NoInstallment Taksit yapılmasını istemiyorsanız sadece tek çekim sunacaksanız 1 yapın. paytr.Enable = 1
NoInstallment mode `schema:"no_installment"`
// MaxInstallment Sayfada görüntülenecek taksit adedini sınırlamak istiyorsanız uygun şekilde değiştirin. Sıfır (0) gönderilmesi durumunda yürürlükteki en fazla izin verilen taksit geçerli olur.
MaxInstallment int16 `schema:"max_installment"`
// UserName Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız ad ve soyad bilgisi.
UserName string `schema:"user_name,required"`
UserName string `schema:"user_name,required"`
// UserAddress Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız adres bilgisi.
UserAddress string `schema:"user_address,required"`
UserAddress string `schema:"user_address,required"`
// UserAddress Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız telefon bilgisi.
UserPhone string `schema:"user_phone,required"`
UserPhone string `schema:"user_phone,required"`
// OkURL Başarılı ödeme sonrası müşterinizin yönlendirileceği sayfa.
OkURL string `schema:"merchant_ok_url,required"`
OkURL string `schema:"merchant_ok_url,required"`
// FailURL Ödeme sürecinde beklenmedik bir hata oluşması durumunda müşterinizin yönlendirileceği sayfa.
FailURL string `schema:"merchant_fail_url,required"`
FailURL string `schema:"merchant_fail_url,required"`
// TimeoutLimit İşlem zaman aşımı süresi - dakika cinsinden.
TimeoutLimit int16 `schema:"timeout_limit,required"`
TimeoutLimit int16 `schema:"timeout_limit,required"`
// Currency İşlemin yapılacağı para birimi. Örn. TL
Currency string `schema:"currency,required"`
Currency string `schema:"currency,required"`
// Test etmek istiyorsanız sanal iframe için bu modu 1 yapın. paytr.Enable = 1
Test mode `schema:"test_mode"`
Test mode `schema:"test_mode"`
}

func (p *PreparePayment) AddBasket(basket ...Basket) {
// AddBasket Siparişe ürün ekler.
func (p *PreparePayment) AddBasket(basket ...Basket) error {
p.basketData = append(p.basketData, basket...)

var basketData []map[int]interface{}
Expand All @@ -84,29 +86,31 @@ func (p *PreparePayment) AddBasket(basket ...Basket) {
}

basketBytes, err := json.Marshal(basketData)

if err != nil {
panic(err)
return fmt.Errorf("basket data marshal error: %v", err)
}
p.basket = base64.StdEncoding.EncodeToString(basketBytes)
return nil
}

// GenerateToken Satın alma ekranının görüntülenmesi için gerekli olan token bilgisini oluşturur.
func (p *PreparePayment) GenerateToken(merchantKey, merchantSalt string) string {
hashStr := strconv.Itoa(p.MerchantId) + p.UserIP + p.MerchantOid + p.Mail + strconv.Itoa(p.PaymentAmount) +
p.basket + strconv.Itoa(int(p.NoInstallment)) + strconv.Itoa(int(p.MaxInstallment)) +
p.Currency + strconv.Itoa(int(p.Test)) + merchantSalt

tokenHmac := hmac.New(sha256.New, []byte(merchantKey))
tokenHmac.Write([]byte(hashStr))

p.token = base64.StdEncoding.EncodeToString(tokenHmac.Sum(nil))
return p.token
}

// FetchToken token alma işlemini yapar
func (p *PreparePayment) FetchToken() (TokenResponse, error) {
var result TokenResponse

form := url.Values{}
schemaEncoder := schema.NewEncoder()
if err := schemaEncoder.Encode(p, form); err != nil {
return result, err
}
Expand All @@ -116,9 +120,7 @@ func (p *PreparePayment) FetchToken() (TokenResponse, error) {
return result, err
}

defer func() {
_ = res.Body.Close()
}()
defer res.Body.Close()

resText, err := ioutil.ReadAll(res.Body)
if err != nil {
Expand Down
16 changes: 11 additions & 5 deletions token_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,25 @@ package paytr

import "fmt"

// TokenResponse Token alma işleminin sonucu döndürür.
type TokenResponse struct {
// İşlem sonucu.
Status string
Token string
// İşlem başarılı ise token bilgisi döndürür.
Token string
// Hata durumunda döndürülecek hata mesajı.
Reason string
}

// Failed Hata varsa sorunu döndürür.
func (p TokenResponse) Failed() (bool, string) {
return p.Status == "failed", p.Reason
}

// IFrame tokenin kullanıldığı bir iframe HTML kodu döndürür.
func (p TokenResponse) IFrame() string {
return fmt.Sprintf(`<script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
<iframe src="https://www.paytr.com/odeme/guvenli/%s" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%s"></iframe>
<script>iFrameResize({}, "#paytriframe");</script>
`, p.Token, "%;")
return fmt.Sprintf(`
<script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
<iframe src="https://www.paytr.com/odeme/guvenli/%s" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%s"></iframe>
<script>iFrameResize({}, "#paytriframe");</script>`, p.Token, "%;")
}

0 comments on commit 43c0797

Please sign in to comment.