Skip to content

Commit 39fadf9

Browse files
committed
Fixed validation logic in PaymentOrder generator
1 parent efc73cf commit 39fadf9

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

QRCoder/PayloadGenerator.cs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2512,6 +2512,13 @@ public override string ToString()
25122512

25132513
public byte[] ToBytes()
25142514
{
2515+
//Setup byte encoder
2516+
//Encode return string as byte[] with correct CharacterSet
2517+
#if !NET35_OR_GREATER
2518+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
2519+
#endif
2520+
var cp = this.characterSet.ToString().Replace("_", "-");
2521+
25152522
//Calculate the seperator
25162523
separator = DetermineSeparator();
25172524

@@ -2523,21 +2530,19 @@ public byte[] ToBytes()
25232530
$"{separator}BIC={mFields.BIC}" +
25242531
$"{separator}CorrespAcc={mFields.CorrespAcc}";
25252532

2533+
//Check length of mandatory field block (-8 => Removing service data block bytes from ret length)
2534+
int bytesMandatoryLen = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(cp), Encoding.UTF8.GetBytes(ret)).Length - 8;
2535+
if (bytesMandatoryLen > 300)
2536+
throw new RussiaPaymentOrderException($"Data too long. Mandatory data must not exceed 300 bytes, but actually is {bytesMandatoryLen} bytes long. Remove additional data fields or shorten strings/values.");
2537+
2538+
25262539
//Add optional fields, if filled
25272540
var optionalFieldsList = GetOptionalFieldsAsList();
25282541
if (optionalFieldsList.Count > 0)
25292542
ret += $"|{string.Join("|", optionalFieldsList.ToArray())}";
25302543
ret += separator;
25312544

2532-
//Encode return string as byte[] with correct CharacterSet
2533-
#if !NET35_OR_GREATER
2534-
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
2535-
#endif
2536-
var cp = this.characterSet.ToString().Replace("_", "-");
2537-
byte[] bytesOut = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(cp), Encoding.UTF8.GetBytes(ret));
2538-
if (bytesOut.Length > 300)
2539-
throw new RussiaPaymentOrderException($"Data too long. Payload must not exceed 300 bytes, but actually is {bytesOut.Length} bytes long. Remove additional data fields or shorten strings/values.");
2540-
return bytesOut;
2545+
return Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(cp), Encoding.UTF8.GetBytes(ret));
25412546
}
25422547

25432548

0 commit comments

Comments
 (0)