public async Task <T> ExecuteAsync <T>(IUnionPayRequest <T> request, UnionPayOptions options) where T : UnionPayResponse { var version = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion(); var merId = options.MerId; if (options.TestMode && (request is UnionPayGatewayPayFileTransferRequest || request is UnionPayNoRedirectPayFileTransferRequest || request is UnionPayQrCodePayFileTransferRequest || request is UnionPayWapPayFileTransferRequest)) { merId = "700000000000001"; } var txtParams = new UnionPayDictionary(request.GetParameters()) { { VERSION, version }, { ENCODING, options.Encoding }, { SIGNMETHOD, options.SignMethod }, { ACCESSTYPE, options.AccessType }, { MERID, merId } }; if (request.HasEncryptCertId() && options.EncryptCertificate?.key != null) { if (txtParams.TryGetValue(ACCNO, out var accNo)) { if (!string.IsNullOrEmpty(accNo)) { // 对敏感信息加密 txtParams[ACCNO] = UnionPaySignature.EncryptData(accNo, options.EncryptCertificate.key); txtParams.Add(ENCRYPTCERTID, options.EncryptCertificate.certId); } } } UnionPaySignature.Sign(txtParams, options.SignCertificate.certId, options.SignCertificate.key, options.SecureKey); var query = UnionPayUtility.BuildQuery(txtParams); using (var client = _httpClientFactory.CreateClient(nameof(UnionPayClient))) { var body = await client.DoPostAsync(request.GetRequestUrl(options.TestMode), query); var dictionary = ParseQueryString(body); var ifValidateCNName = !options.TestMode; if (!UnionPaySignature.Validate(dictionary, options.RootCertificate.cert, options.MiddleCertificate.cert, options.SecureKey, ifValidateCNName)) { throw new UnionPayException("sign check fail: check Sign and Data Fail!"); } var parser = new UnionPayDictionaryParser <T>(); var rsp = parser.Parse(dictionary); rsp.Body = body; return(rsp); } }
public Task <T> PageExecuteAsync <T>(IUnionPayRequest <T> request, string optionsName) where T : UnionPayResponse { var options = string.IsNullOrEmpty(optionsName) ? _optionsSnapshotAccessor.Value : _optionsSnapshotAccessor.Get(optionsName); var version = string.IsNullOrEmpty(request.GetApiVersion()) ? options.Version : request.GetApiVersion(); var merId = options.MerId; if (options.TestMode && (request is UnionPayGatewayPayFileTransferRequest || request is UnionPayNoRedirectPayFileTransferRequest || request is UnionPayQrCodePayFileTransferRequest || request is UnionPayWapPayFileTransferRequest)) { merId = "700000000000001"; } var txtParams = new UnionPayDictionary(request.GetParameters()) { { VERSION, version }, { ENCODING, options.Encoding }, { SIGNMETHOD, options.SignMethod }, { ACCESSTYPE, options.AccessType }, { MERID, merId } }; if (request.HasEncryptCertId() && options.EncryptCertificate?.key != null) { if (txtParams.TryGetValue(ACCNO, out var accNo)) { if (!string.IsNullOrEmpty(accNo)) { // 对敏感信息加密 txtParams[ACCNO] = UnionPaySignature.EncryptData(accNo, options.EncryptCertificate.key); txtParams.Add(ENCRYPTCERTID, options.EncryptCertificate.certId); } } } UnionPaySignature.Sign(txtParams, options.SignCertificate.certId, options.SignCertificate.key, options.SecureKey); var rsp = Activator.CreateInstance <T>(); var url = request.GetRequestUrl(options.TestMode); //输出post表单 rsp.Body = BuildHtmlRequest(url, txtParams); return(Task.FromResult(rsp)); }