به نام خدا

روز ۱۳ به در امسال بود که یه مقاله راجع به تجربه کارم با EBICS منتشر کردم.

توی اون مقاله بیشتر راجع به کلیات صحبت کردم که چی هست و چجوری میتونیم برای شرکت بگیریم.

اما قصد دارم توی این مقاله مفصلا راجع بهش توضیح بدم تا پایان مقاله همراهمون باشید.

فکر میکنم در ابتدا EBICS برای ارتباط شرکت ها (کاربران) با بانک ها و موسسات مالی بود اما بعدا گسترش پیدا کرد و بین خود بانک ها هم استفاده شد.

توی این پروتکل ما همه اطلاعاتی که ارسال میکنیم و دریافت میکنیم در قالب XML هست و یکی از مهمترین مزیت های XML امکان دادن یک سری Attribute به المان های موجود توی اون XML هست در سایر موارد میشه با جیسون مقایسه کرد.

XML از فرمت های قدیمی که قبل از JSON بوده و انصافا یک قالب کامل بوده که تگ ها و المان ها و صفت ها رو میشد درونش جابه جا کرد.

بپردازیم به اصل ماجرا

توی EBICS مثل همه API ها ما یک REQUEST داریم و یک RESPONSE که در این پروتکل قالب هردو به شکل XML هست.

این درخواست و پاسخ ها یک سری قوانین خاصی دارند که باید ابتدا یادبگیریم:

  1. هردرخواست یک کلید تابع دارد مانند INI یا HIV یا Z01 و...
  2. در هر درخواست روت اصلی xml با ebicsRequest شروع می‌شود
  3. تمامی درخواست ها به غیراز INI و HIV حداقل دارای دوبخش header و AuthSignature هستند.
  4. همه درخواست ها در بخش header->mutable یک TransactionPhase دارند که می‌تواند مقادیری مثل Initialisation داشته باشند که نشان دهنده نوع درخواست است مثلا زمانی که یک درخواست با تابع Z01 و از نوع Initialisation برای سرور ارسال می شود سرور متوجه میشود که این درخواست اول است و خود این درخواست سگمنتی از یک درخواست دیگر نیست و اطلاعات چند سگمنت بودن دیتا در این درخواست به سرور داده می‌شود.
  5. در همه درخواست هایی که از نوع Initialisation هستند موارد زیر الزاما باید در header ارسال شوند: 
    1. HostID
    2. TransactionPhase
    3. Nonce برای اینکه با timestamp جمع شود و اگر تکراری بود بدین معناست که درخواست تکراری است و قبلا پردازش شده است پس این یک عدد تصادفی است.
    4. PartnerId
    5. UserID
    6. Product (Optional
    7. OrderDetails->OrderType
    8. BankPubKeyDigest->Authentication هش امضای کلید عمومی A بانک
    9. BankPubKeyDigest->Encryption هش کلید عمومی E بانک
    10. SecurityMedium
  6. همچنین تمامی درخواست ها باید AuthSignature داشته باشند
  7. در صورتی که درخواستی شامل یک فایل یا محتوایی باشد باید در OrderData در قسمت body->DataTransfer قراربگیرد:
    1. دیتایی که درون OrderData قرار میگیرد باید در ابتدا zip شود.
    2. در مرحله دوم توسط یک کلید aes که در کلاینت به صورت تصادفی ساخته می‌شود رمز شود.
    3. کلید aes تولید شده باید با کلید پابلیک E بانک رمز شود و درون فیلدی به نام TransactionKeyقرار بگیرد.
    4. در صورتی که دیتا در فایل های بعدی ادامه دار باشد (یعنی چند سگمنت باشد) با همان کلید TransactionKey داده های بعدی رمزشوند.

AuthSignature چیست؟

وقتی که درخواستی به سمت سرور ارسال می‌شود در هرنوعی که باشد باید این المان نیز درون xml وجود داشته باشد اما این المنت چیست؟

چنانچه توجه کرده باشید المنت هایی مانند header در ebicsRequest تان دارای یک attribute به شکل authentication="true" هستند این یک نشانه است که هش این المنت ها به ترتیب (یعنی به ترتیب موجود بودن در xml پشت هم قرار میگرند بدون فاصله یا اینتر) و پس از هش شدن در فیلدی AuthSignature->SignedInfo->Reference->DigestValue قرار میگیرد پس از آن خود AuthSignature که تا الان شامل DigestValue به همراه اطلاعاتی مثل الگوریتم هش شده است هش شده و توسط کلید خصوصی امضای X امضا می‌شود.

در ادامه با یک مثال از تابع Z01 از نوع Initialisation همراه شما هستیم.

اگر بخوایم همه EBICS رو توی این دوتا دسته جا بدیم به این شکل میشه که درخواست هایی که ارسال میکنیم دو نوع هستند یا DOWNLOAD هستن یا UPLOAD:

  • Download: درخواست هایی که برای دریافت یک محتوا مثل وضعیت آخرین تراکنش ها به سمت سرور بانک ارسال می‌شوند این دسته از درخواست ها، شامل دو درخواست هستند که درخواست اول را Initialisation میگوییم و درخواست دوم را Receipt به معنای اعلام وصول که جواب ما در پاسخ درخواست دوم ارسال می‌شود.
  • Upload: درخواست هایی که یک فایل دیگری نیز در ارسال های بعدی که به شکل متوالی ارسال می‌شوند به درخواست اول پیوست می‌شود مثل درخواست واریز وجه به شماره کارت ها که این مثال ابتدا درخواستی به عنوان مقداردهی اولیه و راه اندازی ارسال می‌شود و درخواست بعدی فایلی که شامل اطلاعات کارت ها برای ارسال وجوه می‌باشد ارسال میگردد.

 

نمونه ای از کد تابع Z01 (یک تابع دانلود) که لیستی از Order هایی که درخواست انتقال وجه آن ها ثبت شده است را برمیگرداند و وضعیت آنها را مشخص میکند. (این XML برای Request است):

<?xml version='1.0' encoding='utf-8'?>
<ebicsRequest
	xmlns="urn:org:ebics:H004"
	xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Version="H004" Revision="1">
	<header authenticate="true">
		<static>
			<HostID>{HOST_ID}</HostID>
			<Nonce>{NONCE}</Nonce>
			<Timestamp>2021-07-15T22:20:45Z</Timestamp>
			<PartnerID>{PARTNER_ID}</PartnerID>
			<UserID>{User_ID}</UserID>
			<Product Language="de">{A_NAME_FOR_CLIENT_SOFTWARE_LIKE_MY_EBICS_CLIENT}</Product>
			<OrderDetails>
				<OrderType>Z01</OrderType>
				<OrderAttribute>DZHNN</OrderAttribute>
				<StandardOrderParams/>
			</OrderDetails>
			<BankPubKeyDigests>
				<Authentication Version="X002" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">L4+2uG2PQgngmr8fN3abe+3ItTUNwWuBhTaOV8QrGHs=</Authentication>
				<Encryption Version="E002" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">9pSaF45gsMgLKJ75rdhroenfRxdayw5pfIj84H7PnL8=</Encryption>
			</BankPubKeyDigests>
			<SecurityMedium>0000</SecurityMedium>
		</static>
		<mutable>
			<TransactionPhase>Initialisation</TransactionPhase>
		</mutable>
	</header>
	<AuthSignature>
		<ds:SignedInfo>
			<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
			<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
			<ds:Reference URI="#xpointer(//*[@authenticate='true'])">
				<ds:Transforms>
					<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
				</ds:Transforms>
				<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<ds:DigestValue>hOD8kzfOkqZtGcN8qARL+T0OX2KUO3VOW+EvqHtC9hs=</ds:DigestValue>
			</ds:Reference>
		</ds:SignedInfo>
		<ds:SignatureValue>lglFWG/82ompM75QR2sLMPtHuwlhwNfdIyRFzqoL+x1WGE0iqaPWIXC4511Y0+lY80tJlNekYeTbOYuHFtFsTz/m+CIFunwYwkQC1piNakE3R35p76Ja+ICjjvHPxZY8IyRDcaffQxfE31GEFVdNuLPsWfFbroTNEZBdIPAhV83a4ULoYq+OgQs0bPcmJsf1qfIfS/FeeuQwCvCleaopNC/xpnfJGpYYL91GpPA/S7e500iQI9oM3FAKd6B6wfpfVKGNrbwHx4472EU1C/M7/cmgK48HTS/rCAfGxkhtJMNJJMFxBnR9So4lUbeqU0ij3+wMYj60Hc0RjotnKSAkJg==</ds:SignatureValue>
	</AuthSignature>
	<body/>
</ebicsRequest>

این درخواست اول است که بانک در پاسخ چنین XMLی را که در زیر آمده است بارمیگرداند:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<ebicsResponse xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="H004" Revision="1" xsi:schemaLocation="urn:org:ebics:H004 ebics_response_H004.xsd">
    <header authenticate="true">
        <static>
            <TransactionID>{TRANSACTION_ID}</TransactionID>
            <NumSegments>1</NumSegments>
        </static>
        <mutable>
            <TransactionPhase>Initialisation</TransactionPhase>
            <SegmentNumber lastSegment="true">1</SegmentNumber>
            <ReturnCode>000000</ReturnCode>
            <ReportText>[EBICS_OK] OK</ReportText>
        </mutable>
    </header>
    <AuthSignature>
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <ds:Reference URI="#xpointer(//*[@authenticate='true'])">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue>44BzG60AHpBznXiVJYcgUupVM12VOFbP/0hoAM0l0Tw=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>LIa05jbo8fHUSVmo7FLCjw+cpWrYAOo1V0ZCPy+Qpy9X0pf0NCVleGG3+/zhxsaOnORJK+sF5o0BEPth+ilbl015zVlRNQnrWVzVy2TrJ334I/oE77xnkYnbVfEPJYnanw8tRWx0GwMPHIn5G/cVK3sseZby58A9Ai7JW+NtkvIMC+hH1fSIMaoo8a5XQpTz4+XZw2FB05QkeCnK11k9K01rYBJwycW67mxoPz/9sM31kQa1EYo80NBWSLxdDfp2XMdW+wE3A+Cq5Jc07qA9BurDUJaDS0DsZhZ2c/HmVEMFRoQ5bEMUrUsL8j50i1Pot2QA33+UF6xfE/qcSFGmPw==</ds:SignatureValue>
    </AuthSignature>
    <body>
        <DataTransfer>
            <DataEncryptionInfo authenticate="true">
                <EncryptionPubKeyDigest Version="E002" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">dE3dK9foSKivfqMPqjbljMe1wFuC9mPatZcG3kGWPkY=</EncryptionPubKeyDigest>
                <TransactionKey>{TRANSACTION_KEY}</TransactionKey>
            </DataEncryptionInfo>
            <OrderData>{DATA}</OrderData>
        </DataTransfer>
        <ReturnCode authenticate="true">000000</ReturnCode>
        <TimestampBankParameter authenticate="true">2016-08-04T11:26:50.250Z</TimestampBankParameter>
    </body>
</ebicsResponse>

در پاسخی که از سمت بانک میاد وقتی نگاه میکنیم یه OrderData داریم که همون پاسخ اصلی ماست که بهش احتیاج داریم و طبق مطالبی که در بالا گفته شد ابتدا TransactionKey رو با کلید خصوصی E خودمون باز میکنیم و اون چیزی که از رمزنگاری حاصل میشه یه کلید AES هست که این OrderData رو باید با اون رمزگشایی کرد. این OrderData یه فایل XML هست.

بعد از اینکه این پاسخ رو از سرور بانک دریافت کردید باید به سرورش بگید که پاسخ رو دریافت کردید بنابراین یه درخواست دیگه Receipt به سرور ارسال میکنیم (<TransactionPhase>Receipt</TransactionPhase>) که به شکل زیر هست:

 

<?xml version='1.0' encoding='utf-8'?>
<ebicsRequest
	xmlns="urn:org:ebics:H004"
	xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Version="H004" Revision="1">
	<header authenticate="true">
		<static>
			<HostID>{HOST_ID}</HostID>
			<TransactionID>{TRANSACTION_ID}</TransactionID>
		</static>
		<mutable>
			<TransactionPhase>Receipt</TransactionPhase>
		</mutable>
	</header>
	<AuthSignature>
		<ds:SignedInfo>
			<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
			<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
			<ds:Reference URI="#xpointer(//*[@authenticate='true'])">
				<ds:Transforms>
					<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
				</ds:Transforms>
				<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<ds:DigestValue>iq2uuDe9qzOAOvLAj9nlG/xZ2+hOFnN530qYlgYO3tY=</ds:DigestValue>
			</ds:Reference>
		</ds:SignedInfo>
		<ds:SignatureValue>JVJsVf0SitpK1q11GwT9cOT5YSWsU3yOrliviG3jXTrg+HL7l53JeVMzMUsVzIRX5/HAJdYyIIa7Ik7/teIcixm7bV0esWRNf7OoEB5o9OplzHgAql4tOfY3jwEDrs13w8/mqShjK8THJjYZnTeubPSS9imYayebAFvYt+GNs+ZOl2a2ggMKN719UxVyUqfSOIkj2T3IfXdtCH7wpaMWxYYFRTcIw6gENArm8PXrsENoa1jCClyCcphTCFCUEw0hJ8FHjnJxhxR48dcykhGgoZRssdpAxQVlr2VLxKUi0KWg886Kw7saDQahCqvr6yzL2YhWXsML/qeo5qqXzrg42g==</ds:SignatureValue>
	</AuthSignature>
	<body>
		<TransferReceipt authenticate="true">
			<ReceiptCode>0</ReceiptCode>
		</TransferReceipt>
	</body>
</ebicsRequest>

توی این درخواست حتما حتما باید TransactionId که توی ریسپانس قبل دریافت کردیم رو توی هدرش قراربدیم تا بانک بفهمه که ما منظورمون از این درخواست برای کدوم پیامه. 

همچنین توی بادی یه TransferReceipt داریم که وقتی کد صفر رو نشون میده یعنی همه چیز اوکیه و به درستی و کاملی همه چیز دریافت شده اما اگه ۱ باشه یعنی مشکلی توی دریافت کامل بوجود اومده.

و در نهایت هم چنین پاسخی رو دریافت میکنیم:

<?xml version="1.0" encoding="UTF-8"?>
<ebicsResponse xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="H004" Revision="1" xsi:schemaLocation="urn:org:ebics:H004 ebics_response_H004.xsd">
    <header authenticate="true">
        <static>
            <TransactionID>{TRANSACTION_ID}</TransactionID>
        </static>
        <mutable>
            <TransactionPhase>Receipt</TransactionPhase>
            <ReturnCode>011000</ReturnCode>
            <ReportText>[EBICS_DOWNLOAD_POSTPROCESS_DONE] Positive acknowledgement received</ReportText>
        </mutable>
    </header>
    <AuthSignature>
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <ds:Reference URI="#xpointer(//*[@authenticate='true'])">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue>Gprf/nyI3IBw2CNEB0Z9EKiv9dkQxif8iigzBq6MLXk=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>PkK/nzimyoWW6zfx2a5fNZkFPrbTPAIZNgNVWQ9FtB1g7ffcGJHgeyPlISPpZ9OZLlnvKCbR+E0hLgsZip2gcvtcKFxBf470n6pj314NezPT+44wQqvGG7u2HvchY1g1y2JmPNaN4gK8bzKSlOnrx9l6U2vhobsJPd8Iyddwmw8ePSU6g0+9eLy+bP6wKMn1HP70lgZbGXrzFR6SjpvyMGkRXurk1mXtYBM5um16gM+g3C/hpCgmDB/RlJVwTU5+4zBQqhW9vnOaVT9P2TATWee8dHh4+Vvitq+3tW7vmZ+hS9+3WYqo7X1mYlYYpfQgXRPLDxvzJhesisAcRi7iRA==</ds:SignatureValue>
    </AuthSignature>
    <body>
        <ReturnCode authenticate="true">000000</ReturnCode>
        <TimestampBankParameter authenticate="true">2016-08-04T11:26:50.250Z</TimestampBankParameter>
    </body>
</ebicsResponse>

دقت کنید که Positive acknowledgement یعنی تصدیق مثبت و Negative acknowledgment یعنی تصدیق منفی (همون کد ۱ که بالا گفتم).

در توابع آپلود نیز فرایند مشابهی را دنبال میکنیم با این تفاوت که به جای دو درخواست Initialisation و Receipt اینبار درخواست Initialisation و Transferرا خواهیم داشت. به علاوه یه سری قانون که برای OrderDataست و در بالا گفته شد.

توضیح نمیدم ولی باید بدم اما خسته ام.

این درخواست Initialisation برای تابع XG1 برای انتقال وجه هست.

<?xml version='1.0' encoding='utf-8'?>
<ebicsRequest
	xmlns="urn:org:ebics:H004"
	xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Version="H004" Revision="1">
	<header authenticate="true">
		<static>
			<HostID>{HOST_ID}</HostID>
			<Nonce>{NONCE}</Nonce>
			<Timestamp>2021-07-16T01:59:22Z</Timestamp>
			<PartnerID>{PARTNER_ID}</PartnerID>
			<UserID>{USER_ID}</UserID>
			<Product Language="de">{CLIENT_NAME}</Product>
			<OrderDetails>
				<OrderType>XG1</OrderType>
				<OrderAttribute>OZHNN</OrderAttribute>
				<StandardOrderParams/>
			</OrderDetails>
			<BankPubKeyDigests>
				<Authentication Version="X002" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">L4+2uG2PQgngmr8fN3abe+3ItTUNwWuBhTaOV8QrGHs=</Authentication>
				<Encryption Version="E002" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">9pSaF45gsMgLKJ75rdhroenfRxdayw5pfIj84H7PnL8=</Encryption>
			</BankPubKeyDigests>
			<SecurityMedium>0000</SecurityMedium>
			<NumSegments>1</NumSegments>
		</static>
		<mutable>
			<TransactionPhase>Initialisation</TransactionPhase>
		</mutable>
	</header>
	<AuthSignature>
		<ds:SignedInfo>
			<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
			<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
			<ds:Reference URI="#xpointer(//*[@authenticate='true'])">
				<ds:Transforms>
					<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
				</ds:Transforms>
				<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<ds:DigestValue>2PGGwCLq83VfikRGDxmSgnQW82n3ChrcClKKb2OpEhs=</ds:DigestValue>
			</ds:Reference>
		</ds:SignedInfo>
		<ds:SignatureValue>{SIGNTURE_VALUE}</ds:SignatureValue>
	</AuthSignature>
	<body>
		<DataTransfer>
			<DataEncryptionInfo authenticate="true">
				<EncryptionPubKeyDigest Version="E002" Algorithm="http://www.w3.org/2001/04/xmlenc#sha256">9pSaF45gsMgLKJ75rdhroenfRxdayw5pfIj84H7PnL8=</EncryptionPubKeyDigest>
				<TransactionKey>{TRANSACTION_KEY}</TransactionKey>
			</DataEncryptionInfo>
			<SignatureData authenticate="true">{SIGNATURE_DATA}</SignatureData>
		</DataTransfer>
	</body>
</ebicsRequest>

همجوری که میبینید اولین تفاوتش باید تابع قبلی اینه که توش body داره و توی بادی هم یه DataTransfer داره (اما اون بالا تو قوانین که گفتم دیتا باید توی OrderData قرار بگیره خبری ازش نیست چون این تابع مقداردهی اولیه است و فقط هش دیتای اصلی رو با کلید A رمز میکنه و بعدش یه فایل xml ایجاد میشه که توضیح کلید و این چیزا رو میده و در نهایت هم کل فایل زیپ میشه و در آخرهم با همون TransactionKey که میسازیم رمزش میکنیم و درون SignatureData قرارش میدیم) توی همین DataEncryptInfo هم یه EncryptionPubKeyDigest داره که کلید پابلیک E بانک رو هش میکنه که دقیقا عین همین توی هدر هم هست و همچنین TransactionKey داریم که یه aes ساختگی کاملا تصادفی توی client (یعنی ما) هست که با کلید E بانک رمز شده  و بانک خودش بازش میکنه تا بتونه محتوای رمز شده توی SignatureData رو بخونه بعد از اون هم توی پیام های بعدی ازش استفاده میکنه. (احتمال میدم بانک ابتدا کلید AESما رو با بازکردن TransactionKey درمیاره و بعد هم  SignatureData رو رمزگشایی میکنه و بعد unzip میکنه و دیتای توشو میخونه و یه فیلدش که مربوط به هش OrderData هست و با امضای A رمزشده رو باز میکنه که احرازهویت کنه ببینه آیا خودم امضاش کردم بعدش که باز کرد احتمالا درخواست بعدی به سرور که شامل OrderData میشه رو هش میکنه و چک میکنه که برابر با این هش باشه)

همچنین دقت کنید که در اینجا یه NumSegments هم توی هدر وجود داره که روی ۱ هست. در ادامه میبینید که باید برای ارسال دیتای بعدی مشخص کنیم که سگمنت چندم هست و آیا آخرین سگمنت هست یا نه.

در ادامه پاسخ بانک رو میبینم:

<?xml version="1.0" encoding="UTF-8"?>
<ebicsResponse xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="H004" Revision="1" xsi:schemaLocation="urn:org:ebics:H004 ebics_response_H004.xsd">
    <header authenticate="true">
        <static>
            <TransactionID>175BA583CB3E7B236EFB4EE1C2D77934</TransactionID>
        </static>
        <mutable>
            <TransactionPhase>Initialisation</TransactionPhase>
            <OrderID>N07G</OrderID>
            <ReturnCode>000000</ReturnCode>
            <ReportText>[EBICS_OK] OK</ReportText>
        </mutable>
    </header>
    <AuthSignature>
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <ds:Reference URI="#xpointer(//*[@authenticate='true'])">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue>u/KaA5lDaToxCW+glILJvliZGyW54BZe6T+6awcRrsE=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>xpNTV+EjBw1rRVPb6uryhQFIjVpatsikqENy8QQU0y7VLolAcm4JyQdoI8Agpl3E+jqMe+UvMEVsTnnB5rgx/OUqJuAl/zRUqN8dlCZABrARTO+iUlfAYOt35AqADrkmbtgjRH0sjr9K1Gs0FTe19C2rLCb3F0Wfm5rNVVv3xST9wOkF5at62QW4dFK8l70/wbE09pMfDKD4bh+NT/zhfuybDBciJqfVcc1+EpL4oQKoIwqHRl2DHZmCQhRjC2pKAxSQnQR8zOTYhH96dMO8iPg+pnLHM5EKzCUCC0ScRKSP+PeGUAcOuCS6IamisN+3mf9/JXs2LF80lqLo8NlJIg==</ds:SignatureValue>
    </AuthSignature>
    <body>
        <ReturnCode authenticate="true">000000</ReturnCode>
        <TimestampBankParameter authenticate="true">2016-08-04T11:26:50.250Z</TimestampBankParameter>
    </body>
</ebicsResponse>

 

حالا باید OrderData رو بسازیم (مثلا توی این تابع که برای انتقال وجه هست باید یه فایل xml بسازیم که فکر میکنم مطابق استانداردهای ارائه شده توسط SWIFT و یا CGI باشه که بهش میگن pain.001 توی این فایل میگه از چه حسابی برای چه حساب هایی چه مبلغی در چه تاریخی واریز بشه)

که فایل ما چنین چیزی میشه:

<?xml version='1.0' encoding='utf-8'?>
<Document
	xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd">
	<CstmrCdtTrfInitn>
		<GrpHdr>
			<MsgId>msg2021071601592211460f0e7fa1c057</MsgId>
			<CreDtTm>2021-07-16T01:59:22.114+00:00</CreDtTm>
			<NbOfTxs>1</NbOfTxs>
			<CtrlSum>71.00</CtrlSum>
			<InitgPty>
				<Nm>Company Name</Nm>
			</InitgPty>
		</GrpHdr>
		<PmtInf>
			<PmtInfId>pmt2021071601592211460f0e7fa1c06b</PmtInfId>
			<PmtMtd>TRF</PmtMtd>
			<NbOfTxs>1</NbOfTxs>
			<CtrlSum>71.00</CtrlSum>
			<PmtTpInf>
				<SvcLvl>
					<Cd>SEPA</Cd>
				</SvcLvl>
			</PmtTpInf>
			<ReqdExctnDt>2021-07-17</ReqdExctnDt>
			<Dbtr>
				<Nm>Company Name</Nm>
			</Dbtr>
			<DbtrAcct>
				<Id>
					<IBAN>{IBAN_OF_COMPANY}</IBAN>
				</Id>
			</DbtrAcct>
			<DbtrAgt>
				<FinInstnId>
					<BIC>{BIC_OF_COMPAY}</BIC>
				</FinInstnId>
			</DbtrAgt>
			<ChrgBr>SLEV</ChrgBr>
			<CdtTrfTxInf>
				<PmtId>
					<InstrId>pii102021071601592211560f0e7fa1c30c</InstrId>
					<EndToEndId>pete102021071601592211560f0e7fa1c31</EndToEndId>
				</PmtId>
				<Amt>
					<InstdAmt Ccy="EUR">71.00</InstdAmt>
				</Amt>
				<CdtrAgt>
					<FinInstnId>
						<BIC>{BIC}</BIC>
					</FinInstnId>
				</CdtrAgt>
				<Cdtr>
					<Nm>{NAME}</Nm>
				</Cdtr>
				<CdtrAcct>
					<Id>
						<IBAN>{IBAN}</IBAN>
					</Id>
				</CdtrAcct>
				<RmtInf>
					<Ustrd>{RESION{</Ustrd>
				</RmtInf>
			</CdtTrfTxInf>
		</PmtInf>
	</CstmrCdtTrfInitn>
</Document>

این فایل برای انتقال ۷۱ یورو به حساب {IBAN} هست.

این فایل به همین شکل در ابتدا zip میشود تا حجم کمتری اشغال کند و در مرحله بعد توسط TransactionKey که در مرحله پیش ساختیم رمزگذاری میشود و در یک رکوئست به شکل زیر قرار میگرد:

<?xml version='1.0' encoding='utf-8'?>
<ebicsRequest
	xmlns="urn:org:ebics:H004"
	xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Version="H004" Revision="1">
	<header authenticate="true">
		<static>
			<HostID>{HOST_ID}</HostID>
			<TransactionID>175BA583CB3E7B236EFB4EE1C2D77934</TransactionID>
		</static>
		<mutable>
			<TransactionPhase>Transfer</TransactionPhase>
			<SegmentNumber lastSegment="true">1</SegmentNumber>
		</mutable>
	</header>
	<AuthSignature>
		<ds:SignedInfo>
			<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
			<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
			<ds:Reference URI="#xpointer(//*[@authenticate='true'])">
				<ds:Transforms>
					<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
				</ds:Transforms>
				<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<ds:DigestValue>kW6zX855vsJoCeZUqsUGAPAXfgGWZCWRsCxazIQl4aQ=</ds:DigestValue>
			</ds:Reference>
		</ds:SignedInfo>
		<ds:SignatureValue>IDEDEgJul1MQvAdSU8JdkdeAatoV5ofEF7Gg4ZY9TnqoUE3SR1+7mP8uPThEEDe7ACTazy/oUTPnPKaa4EMGYf7xJ9Wd9U4GnKBU+LM3wDkgp/MzylZPxy2XLrIgg3ZtVbKJXZydz0B9BBc3t3pEMGOM2jJ/yPJhU9CEG4CRipmg/ZucTmOmVMKC78zlD15/7ySYMos8OsGvRv6vjdrgxsLn9AmDIXBaL2MJ9B9/uJ3MGT7Cm+OKWHviv9ohGB/Oho3cbws3tW3thLkLA7yReGLdbO3pDrsXRJmN6qz/+PZXslHxbTZHswFmWazgiI3yXHr5Zlnj24hPH6VYexhmgw==</ds:SignatureValue>
	</AuthSignature>
	<body>
		<DataTransfer>
			<OrderData>q1ulQvhoViRLezcLg4F1KrMLkQK3Qlm/ENJKZclsw7aMXWiRFbxWAt2t18SB4H4rZn03kO7QqDVjllmecHQi8NuKnkdOFcy51CEwMsFGU5MKWZpylU8r7NVs67fXAfMoBjb7K2N20QT/AjaWKUzWBQv9u7InC6oFqMGwZuzR/dc/KGJoijooAb5+nv4nA/gGflWQXdfTc1JlI+E06hWb9QxEvIPDImfiMymQZC9JgEUOTVEX5UT6AYliXU9pnA5PVF57SWbSFcXfjtLr0zwd0whWHpdSjyaJ1Yd8ZliBuwwitjn/YyKtnuJn+BfMNwUqjmAP5aaoLnYkMJgfxOklKhtXinsgcbL7xv2p4J3aHsbDG8y39NfcYUjyGrGvxGjQX2ADNYABxieocuUk/zJWQNp2jqaaCo5cR6jGIdV/lmaWiTlLfORKs946mc8DurmDB3ra17vG9uO+X9Cz/i8uMNKCw/brYGZPvJprgbgxLD0ssPxVQ4jtXjWRMtUbDwD9RapauhH5GzY5HTTlSivzsYAnJD+/oPiIJwaHjNZSvuQ54FbzFTRSuQFESw8/HUHHk0FTLOVwf0rE8AXkECgDaAvPEVL5Kkjqk7nFgKfqO1Vc1/CYmu3LLkPxMDOkMT8pO0nmej/xWb3vc/QqkXrRuOvUGDYqvN4tQS/6MhPs/ID+RRaIzsrwhi2EkY0eF1l6UP+TCaFcspF8pL9oimzWCTjwdIoN8LJ3IWLsd2qz3CCNELLYtRqkrj24JPUiR5eQoc4VtWGZxnYLmRtGd4/WlRh2y3+BlH5izTmTXO2CTZiy3HTN2D/YTenKwMSGszd0Z7lqBrSul7sT5iEPQ1okG43sqBMYfGMQLc/CnPSe33A=</OrderData>
		</DataTransfer>
	</body>
</ebicsRequest>

و در نهایت هم سرور چنین پاسخی را برای ما میفرستد:

<?xml version="1.0" encoding="UTF-8"?>
<ebicsResponse xmlns="urn:org:ebics:H004" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="H004" Revision="1" xsi:schemaLocation="urn:org:ebics:H004 ebics_response_H004.xsd">
    <header authenticate="true">
        <static>
            <TransactionID>175BA583CB3E7B236EFB4EE1C2D77934</TransactionID>
        </static>
        <mutable>
            <TransactionPhase>Transfer</TransactionPhase>
            <SegmentNumber lastSegment="true">1</SegmentNumber>
            <OrderID>N07G</OrderID>
            <ReturnCode>000000</ReturnCode>
            <ReportText>[EBICS_OK] OK</ReportText>
        </mutable>
    </header>
    <AuthSignature>
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
            <ds:Reference URI="#xpointer(//*[@authenticate='true'])">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                <ds:DigestValue>kX1e8lfHrfn6/rrzdnGtTVyyOspG/jYOP9/ycM4Il5g=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>v3Gmi2RppCGTBK16pQR77u2jgM1/yVzuclsa8j2PdyAd0VCzlVFcUvf6AAiPfCCmPnDDOszJpwl6+z2BP2rgYgtzvuzOjNwi0aIuFo6/+BV02usJoXB5HPkOFXvXCemqHCNO7I+PGjHL7DsEDSLEQLTooABhEWPYYDoSlFkv4d4HLJGjKgFIvWhZYVilRV0rEKkDjYwSm+Z8LJhwfXlhJdT2QV8mZKuUKtW8EVhRUY7Vu3KVuLOWrBzGSDaFW1Mvid53NaCa+trayx0cQ80UIaw05uLpSO3uLi8maTSgCJ1cEMnmlT6KYEGDPs48h+yCKxMBSMO6/nHuvKtNbVlB1w==</ds:SignatureValue>
    </AuthSignature>
    <body>
        <ReturnCode authenticate="true">000000</ReturnCode>
        <TimestampBankParameter authenticate="true">2016-08-04T11:26:50.250Z</TimestampBankParameter>
    </body>
</ebicsResponse>