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"])) :