using System; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; using Alipay.AopSdk.Core.Parser; using Alipay.AopSdk.Core.Util; namespace Alipay.AopSdk.Core { public class AlipayMobilePublicMultiMediaClient : IAopClient { public const string APP_ID = "app_id"; public const string FORMAT = "format"; public const string METHOD = "method"; public const string TIMESTAMP = "timestamp"; public const string VERSION = "version"; public const string SIGN_TYPE = "sign_type"; public const string ACCESS_TOKEN = "auth_token"; public const string SIGN = "sign"; public const string TERMINAL_TYPE = "terminal_type"; public const string TERMINAL_INFO = "terminal_info"; public const string PROD_CODE = "prod_code"; public const string APP_AUTH_TOKEN = "app_auth_token"; private readonly string appId; private readonly string charset; private string format; private readonly string privateKeyPem; private readonly string serverUrl; private readonly string signType = "RSA"; private string version; private readonly WebUtils webUtils; public string Version { get => version != null ? version : "1.0"; set => version = value; } public string Format { get => format != null ? format : "json"; set => format = value; } public T PageExecute(IAopRequest request) where T : AopResponse { throw new NotImplementedException(); } public T PageExecute(IAopRequest request, string session, string reqMethod) where T : AopResponse { throw new NotImplementedException(); } public T SdkExecute(IAopRequest request) where T : AopResponse { throw new NotImplementedException(); } public Task PageExecuteAsync(IAopRequest request) where T : AopResponse { throw new NotImplementedException(); } public Task PageExecuteAsync(IAopRequest request, string accessToken, string reqMethod) where T : AopResponse { throw new NotImplementedException(); } public Task ExecuteAsync(IAopRequest request) where T : AopResponse { throw new NotImplementedException(); } public Task ExecuteAsync(IAopRequest request, string accessToken) where T : AopResponse { throw new NotImplementedException(); } public Task ExecuteAsync(IAopRequest request, string accessToken, string appAuthToken) where T : AopResponse { throw new NotImplementedException(); } private AopResponse DoGet(AopDictionary parameters, Stream outStream) { return AsyncHelper.RunSync(async () => await DoGetAsync(parameters, outStream)); } private async Task DoGetAsync(AopDictionary parameters, Stream outStream) { AlipayMobilePublicMultiMediaDownloadResponse response = null; var url = serverUrl; if (parameters != null && parameters.Count > 0) if (url.Contains("?")) url = url + "&" + WebUtils.BuildQuery(parameters, charset); else url = url + "?" + WebUtils.BuildQuery(parameters, charset); var client = webUtils.ConnectionPool.GetClient(); var query=new Uri(url).Query; var resp = await client.GetAsync(query); if (resp.StatusCode == HttpStatusCode.OK) { var body = await resp.Content.ReadAsStringAsync(); IAopParser tp = new AopJsonParser(); response = tp.Parse(body, charset); } else { response = new AlipayMobilePublicMultiMediaDownloadResponse(); } return response; } /// /// 把响应流转换为文本。 /// /// 响应流对象 /// 编码方式 /// 响应文本 public void GetResponseAsStream(Stream outStream, HttpWebResponse rsp) { var result = new StringBuilder(); Stream stream = null; StreamReader reader = null; BinaryWriter writer = null; try { // 以字符流的方式读取HTTP响应 stream = rsp.GetResponseStream(); reader = new StreamReader(stream); writer = new BinaryWriter(outStream); //stream.CopyTo(outStream); var length = Convert.ToInt32(rsp.ContentLength); var buffer = new byte[length]; var rc = 0; while ((rc = stream.Read(buffer, 0, length)) > 0) outStream.Write(buffer, 0, rc); outStream.Flush(); outStream.Close(); } finally { // 释放资源 if (reader != null) reader.Close(); if (stream != null) stream.Close(); if (rsp != null) rsp.Close(); } } #region DefaultAopClient Constructors public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem) { this.appId = appId; this.privateKeyPem = privateKeyPem; this.serverUrl = serverUrl; webUtils = new WebUtils(serverUrl); } public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem, string format) : this(serverUrl, appId, privateKeyPem) { this.format = format; } public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem, string format, string charset) : this(serverUrl, appId, privateKeyPem, format) { this.charset = charset; } public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem, string format, string version, string signType) : this(serverUrl, appId, privateKeyPem, format) { this.version = version; this.signType = signType; } #endregion #region IAopClient Members public T Execute(IAopRequest request) where T : AopResponse { return Execute(request, null); } public T Execute(IAopRequest request, string accessToken) where T : AopResponse { return Execute(request, accessToken, null); } public T Execute(IAopRequest request, string accessToken, string appAuthToken) where T : AopResponse { var multiMediaDownloadRequest = (AlipayMobilePublicMultiMediaDownloadRequest) request; // 添加协议级请求参数 var txtParams = new AopDictionary(request.GetParameters()); txtParams.Add(METHOD, request.GetApiName()); txtParams.Add(VERSION, Version); txtParams.Add(APP_ID, appId); txtParams.Add(FORMAT, format); txtParams.Add(TIMESTAMP, DateTime.Now); txtParams.Add(ACCESS_TOKEN, accessToken); txtParams.Add(SIGN_TYPE, signType); txtParams.Add(TERMINAL_TYPE, request.GetTerminalType()); txtParams.Add(TERMINAL_INFO, request.GetTerminalInfo()); txtParams.Add(PROD_CODE, request.GetProdCode()); if (!string.IsNullOrEmpty(appAuthToken)) txtParams.Add(APP_AUTH_TOKEN, appAuthToken); // 添加签名参数 txtParams.Add(SIGN, AopUtils.SignAopRequest(txtParams, privateKeyPem, charset, signType)); var outStream = multiMediaDownloadRequest.stream; var rsp = DoGet(txtParams, outStream); return (T) rsp; } #endregion } }