> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK لـ Go: KYC وAML والمعاملات

> دليل البدء السريع لحزمة Didit الرسمية لـ Go: استدعاءات مُنمَّطة لواجهات الخادم بمكتبة الدوال القياسية فقط، مع التحقق من webhook وفحص الرموز.

The official Didit module for Go. It needs Go 1.22 or later and uses only the standard library. See the [نظرة عامة على حزم SDK للخادم](https://docs.didit.me/ar/integration/server-sdks/overview.md) for what every SDK shares.

## التثبيت

```bash theme={null}
go get github.com/didit-protocol/sdk-go
```

الوحدة متاحة في [`github.com/didit-protocol/sdk-go` على pkg.go.dev](https://pkg.go.dev/github.com/didit-protocol/sdk-go). ويمكنك الاطلاع على المصدر وسجل التغييرات في [didit-protocol/sdk-go](https://github.com/didit-protocol/sdk-go) على GitHub.

اسم الحزمة هو `didit`. وتوجد حزمة webhook في `github.com/didit-protocol/sdk-go/webhook`، وAuthentication في `.../authentication`، وخيارات العميل في `.../option`.

المثال الموجود في كل صفحة من [مرجع API](https://docs.didit.me/ar/api-reference/overview.md) هو جسم دالة، ويستخدم `context` و`fmt` و`log` من مكتبة Go القياسية وهذه الوحدة.

## إعداد العميل

تقرأ `didit.NewClient()` القيمة `DIDIT_API_KEY` من متغيرات البيئة. مرّر خيارات لتجاوزها، أو لتعيين معرّفات المؤسسة والتطبيق التي تحتاجها الاستدعاءات المرتبطة بالتطبيق (الحالات والشبكات والتقارير التنظيمية). ويمكن أيضًا تطبيق أي خيار على استدعاء واحد.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/option"
)

func main() {
	client := didit.NewClient(
		option.WithAPIKey(os.Getenv("DIDIT_API_KEY")),
		option.WithOrganizationID(os.Getenv("DIDIT_ORGANIZATION_ID")),
		option.WithApplicationID(os.Getenv("DIDIT_APPLICATION_ID")),
		option.WithTimeout(30*time.Second),
		option.WithMaxRetries(2),
	)

	// Options for a single call.
	decision, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{}, option.WithTimeout(5*time.Second))
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(decision.Status)
}
```

الحقول الاختيارية في الطلب هي قيم من نوع `didit.Opt`. عيّنها باستخدام `didit.String` أو `didit.Int` أو `didit.Bool` أو `didit.Float` أو `didit.Some`، واتركها دون تعيين فلا يُرسَل أي شيء.

## إنشاء جلسة

أنشئ [جلسة تحقق](https://docs.didit.me/ar/sessions-api/create-session.md) لسير عمل، ثم أرسل المستخدم إلى عنوان URL الخاص بها.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	session, err := client.Sessions.Create(context.Background(), didit.SessionsCreateParams{
		WorkflowID: "11111111-2222-3333-4444-555555555555",
		VendorData: didit.String("user-123"),
		Callback:   didit.String("https://example.com/verification/done"),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(session.URL)
}
```

## قراءة القرار

عندما ينتهي المستخدم (أو عند وصول الـ webhook)، [اقرأ القرار](https://docs.didit.me/ar/sessions-api/retrieve-session.md). كل نتيجة ميزة هي شريحة (slice) تحتوي على إدخال واحد لكل عقدة في سير العمل.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	decision, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(decision.Status)
	for _, verification := range decision.IDVerifications {
		fmt.Println(verification.Status)
	}
}
```

## التحقق من webhook

مرّر بايتات جسم الطلب الخام وترويسات الطلب. تُرجع `webhook.Verify` القيمة `*didit.WebhookVerificationError` لأي تسليم غير صالح أو غير حديث، وتُرجع حدثًا مُنمّطًا في الحالة الأخرى.

```go theme={null}
package main

import (
	"errors"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/webhook"
)

func main() {
	secret := os.Getenv("DIDIT_WEBHOOK_SECRET")
	http.HandleFunc("POST /webhooks/didit", func(w http.ResponseWriter, r *http.Request) {
		body, err := io.ReadAll(http.MaxBytesReader(w, r.Body, 1<<20))
		if err != nil {
			http.Error(w, "bad body", http.StatusBadRequest)
			return
		}
		event, err := webhook.Verify(body, r.Header, secret)
		var invalid *didit.WebhookVerificationError
		if errors.As(err, &invalid) {
			http.Error(w, string(invalid.Reason), http.StatusBadRequest)
			return
		} else if err != nil {
			http.Error(w, "error", http.StatusInternalServerError)
			return
		}
		if e, ok := event.(*webhook.StatusUpdatedEvent); ok {
			fmt.Println(e.SessionID, e.Status)
		}
		w.WriteHeader(http.StatusOK)
	})
	log.Fatal(http.ListenAndServe(":8080", nil))
}
```

أثناء تدوير السر، أضف السر القديم باستخدام `webhook.WithSecrets`. راجع [Webhooks](https://docs.didit.me/ar/integration/webhooks.md) للاطلاع على الأحداث وآلية التوقيع.

## فحص معاملة

أرسل دفعة أو سحبًا أو تحويلًا بالعملات الرقمية إلى [مراقبة المعاملات](https://docs.didit.me/ar/transaction-monitoring/overview.md)، وتتضمن الاستجابة حالتها ودرجة المخاطر.

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	transaction, err := client.Transactions.Create(context.Background(), didit.TransactionsCreateParams{
		TransactionID:       "txn-1001",
		TransactionCategory: "finance",
		TransactionDetails: didit.TransactionsCreateParamsTransactionDetails{
			Direction: "outbound",
			Amount:    1500,
			Currency:  "EUR",
		},
		Subject: didit.TransactionsCreateParamsSubject{
			EntityType: didit.String("individual"),
			VendorData: "user-123",
			FullName:   "Maria Garcia",
		},
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(transaction.Status, transaction.Score)
}
```

## التحقق من رموز Authentication

تتحقق الحزمة `authentication` من رموز الوصول التي يوقّعها مُصدِر [Authentication](https://docs.didit.me/ar/authentication/overview.md) الخاص بك، وذلك في الخادم الخلفي دون استدعاء Didit لكل طلب. كما تستبدل الرموز، وتجدد الرموز، وتتحقق من الجلسات وتُلغيها، وتُشغّل عمليات التحقق الإضافية.

> [!NOTE]
>
> يُجري التحقق من الرمز الفحوصات الموضحة في [التحقق من رمز على الخادم](https://docs.didit.me/ar/authentication/tokens-and-jwks.md#التحقق-من-رمز-على-الخادم-لديك)، مقارنةً بمُصدِر التطبيق ومفاتيح التوقيع الخاصة به.

```go theme={null}
package main

import (
	"context"
	"errors"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
	"github.com/didit-protocol/sdk-go/authentication"
)

func main() {
	// The publishable key (pk_live_... or pk_test_...) carries your issuer URL.
	auth, err := authentication.NewFromPublishableKey("pk_live_...", authentication.WithClientID("your-application-id"))
	if err != nil {
		log.Fatal(err)
	}

	claims, err := auth.VerifyAccessToken(context.Background(), "the bearer token")
	var invalid *didit.TokenVerificationError
	if errors.As(err, &invalid) {
		fmt.Println("rejected:", invalid.Reason)
		return
	} else if err != nil {
		log.Fatal(err)
	}
	fmt.Println(claims.Subject)
}
```

## الأخطاء

```go theme={null}
package main

import (
	"context"
	"errors"
	"fmt"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	client := didit.NewClient()

	_, err := client.Sessions.RetrieveDecision(context.Background(), "11111111-2222-3333-4444-555555555555",
		didit.SessionsRetrieveDecisionParams{})
	var notFound *didit.NotFoundError
	var status *didit.APIStatusError
	switch {
	case errors.As(err, &notFound):
		fmt.Println("no such session")
	case errors.As(err, &status):
		fmt.Println(status.StatusCode, status.RequestID, status.Body)
	case err != nil:
		fmt.Println("no response:", err)
	}
}
```

## القوائم والملفات

```go theme={null}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/didit-protocol/sdk-go"
)

func main() {
	ctx := context.Background()
	client := didit.NewClient()

	// Lists page through every result.
	iter := client.Sessions.ListAutoPaging(ctx, didit.SessionsListParams{Status: didit.String("Approved")})
	for iter.Next() {
		fmt.Println(iter.Current().SessionID)
	}
	if err := iter.Err(); err != nil {
		log.Fatal(err)
	}

	// Uploads take didit.FileFromPath, FileFromBytes or FileFromReader.
	result, err := client.IDVerification.Verify(ctx, didit.IDVerificationVerifyParams{
		FrontImage: didit.FileFromPath("id-front.jpg"),
		BackImage:  didit.Some(didit.FileFromPath("id-back.jpg")),
	})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result.IDVerification.Status)
}
```

## endpoints غير المتوفرة في Go SDK بعد

الإصدار Go 1.0.1 أُنشئ قبل إضافة هذه الـ endpoints إلى الـ API، لذلك لا توجد له دالة مخصصة لها، ولا تتضمن صفحاتها أمثلة بلغة Go:

* [التحقق من عنوان](https://docs.didit.me/ar/standalone-apis/address-validation.md)
* [حذف المعاملات دفعةً واحدة](https://docs.didit.me/ar/management-api/transactions/delete.md)
* شبكات Travel Rule: [الحصول على الشبكات](https://docs.didit.me/ar/management-api/travel-rule/get-networks.md)، و[طلب الوصول إلى شبكة](https://docs.didit.me/ar/management-api/travel-rule/request-network.md)، و[الحصول على](https://docs.didit.me/ar/management-api/travel-rule/get-network-questionnaire.md) استبيان الشبكة أو [حفظه](https://docs.didit.me/ar/management-api/travel-rule/update-network-questionnaire.md) أو [إرساله](https://docs.didit.me/ar/management-api/travel-rule/submit-network-questionnaire.md)
* إثباتات المحافظ لـ Travel Rule: [عرض إثباتات المحافظ بلقطات الشاشة](https://docs.didit.me/ar/management-api/travel-rule/list-wallet-proofs.md) و[الموافقة على أحدها أو رفضه](https://docs.didit.me/ar/management-api/travel-rule/decide-wallet-proof.md)
* Google Wallet، وهو غير متوفر في أي إصدار 1.0.1 حتى الآن: [بدء التحقق عبر Google Wallet](https://docs.didit.me/ar/api-reference/digital-id-wallets/google-wallet.md) و[إرسال استجابة المحفظة](https://docs.didit.me/ar/standalone-apis/digital-id-wallet-response.md)

كما لا يمكنه إرسال حقول الطلب الأحدث هذه:

* `biometric_consent` و`tags` و`user_state` عند [إنشاء جلسة](https://docs.didit.me/ar/sessions-api/create-session.md)
* `biometric_consent_mode` عند [تحديث إعدادات الـ webhook](https://docs.didit.me/ar/management-api/webhook/update-config.md)
* `beneficiary_vasp` عند [تحديث تحويل Travel Rule](https://docs.didit.me/ar/management-api/travel-rule/update-transfer.md)
* `confirm_delete`، وهو مطلوب عند [حذف تقرير نهائي](https://docs.didit.me/ar/management-api/regulatory-reports/delete.md)
* الحقول الـ16 الأحدث في التحقق من قواعد البيانات، وغير متوفرة في أي إصدار 1.0.1

إلى أن تضيفها إصدارات Go لاحقة، استدعِ هذه الـ endpoints عبر HTTP كما يوضح طلب cURL في كل صفحة. وتتضمن كل صفحة أخرى من صفحات endpoints الخادم في [مرجع API](https://docs.didit.me/ar/api-reference/overview.md) مثالًا بلغة Go للعملية الخاصة بها.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.