protected virtual IDictionary <string, object> GetTicketRequest(PaymentRequest.TicketRequest request)
 {
     return(new SortedDictionary <string, object>()
     {
         { "appid", _authority.Account.Code },
         { "mch_id", _authority.Code },
         { "now", DateTimeOffset.Now.ToUnixTimeSeconds() },
         { "out_trade_no", request.VoucherCode },
         { "sign_type", "MD5" },
         { "nonce_str", Guid.NewGuid().ToString("N") },
         { "auth_code", request.TicketId },
         { "attach", string.IsNullOrEmpty(request.Extra) ? null : request.Extra },
         { "device_info", request.Place.DeviceId },
         { "spbill_create_ip", request.Place.DeviceIp },
         { "total_fee", request.Amount.Value },
         { "fee_type", request.Amount.Currency },
         { "body", request.Description },
     });
 }
            protected async ValueTask <OperationResult <(string identifier, string payer)> > PayTicketAsync(PaymentRequest.TicketRequest request, CancellationToken cancellation = default)
            {
                var dictionary = this.GetTicketRequest(request);

                if (!dictionary.ContainsKey("sign"))
                {
                    dictionary.TryAdd("sign", Utility.Postmark(dictionary, _authority.Secret));
                }

                var response = await HttpClientFactory.Xml.Client.PostAsync(@"https://api.mch.weixin.qq.com/pay/micropay", dictionary.CreateXmlContent(), cancellation);

                var result = await response.GetXmlContentAsync(cancellation);

                return(result != null && result.TryGetValue("transaction_id", out var id) && id != null?
                       OperationResult.Success((id, result["openid"])) :