AlipayMobilePublicMultiMediaClient.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using Aop.Api.Parser;
  6. using Aop.Api.Request;
  7. using Aop.Api.Response;
  8. using Aop.Api.Util;
  9. using System.Net;
  10. using System.Threading.Tasks;
  11. namespace Aop.Api
  12. {
  13. public class AlipayMobilePublicMultiMediaClient : IAopClient
  14. {
  15. public const string APP_ID = "app_id";
  16. public const string FORMAT = "format";
  17. public const string METHOD = "method";
  18. public const string TIMESTAMP = "timestamp";
  19. public const string VERSION = "version";
  20. public const string SIGN_TYPE = "sign_type";
  21. public const string ACCESS_TOKEN = "auth_token";
  22. public const string SIGN = "sign";
  23. public const string TERMINAL_TYPE = "terminal_type";
  24. public const string TERMINAL_INFO = "terminal_info";
  25. public const string PROD_CODE = "prod_code";
  26. public const string APP_AUTH_TOKEN = "app_auth_token";
  27. private string version;
  28. private string format;
  29. private string serverUrl;
  30. private string appId;
  31. private string privateKeyPem;
  32. private string signType = "RSA";
  33. private string charset;
  34. private WebUtils webUtils;
  35. public string Version
  36. {
  37. get { return version != null ? version : "1.0"; }
  38. set { version = value; }
  39. }
  40. public string Format
  41. {
  42. get { return format != null ? format : "json"; }
  43. set { format = value; }
  44. }
  45. #region DefaultAopClient Constructors
  46. public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem)
  47. {
  48. this.appId = appId;
  49. this.privateKeyPem = privateKeyPem;
  50. this.serverUrl = serverUrl;
  51. this.webUtils = new WebUtils();
  52. }
  53. public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem, string format)
  54. : this(serverUrl, appId, privateKeyPem)
  55. {
  56. this.format = format;
  57. }
  58. public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem, string format, string charset)
  59. : this(serverUrl, appId, privateKeyPem, format)
  60. {
  61. this.charset = charset;
  62. }
  63. public AlipayMobilePublicMultiMediaClient(string serverUrl, string appId, string privateKeyPem, string format, string version, string signType)
  64. : this(serverUrl, appId, privateKeyPem, format)
  65. {
  66. this.version = version;
  67. this.signType = signType;
  68. }
  69. public void SetTimeout(int timeout)
  70. {
  71. webUtils.Timeout = timeout;
  72. }
  73. #endregion
  74. #region IAopClient Members
  75. public async Task<T> Execute<T>(IAopRequest<T> request) where T : AopResponse
  76. {
  77. return await Execute<T>(request, null);
  78. }
  79. public async Task<T> Execute<T>(IAopRequest<T> request, string accessToken) where T : AopResponse
  80. {
  81. return await Execute<T>(request, accessToken, null);
  82. }
  83. public async Task<T> Execute<T>(IAopRequest<T> request, string accessToken, string appAuthToken) where T : AopResponse
  84. {
  85. AlipayMobilePublicMultiMediaDownloadRequest multiMediaDownloadRequest = ((AlipayMobilePublicMultiMediaDownloadRequest)request);
  86. // 添加协议级请求参数
  87. AopDictionary txtParams = new AopDictionary(request.GetParameters());
  88. txtParams.Add(METHOD, request.GetApiName());
  89. txtParams.Add(VERSION, Version);
  90. txtParams.Add(APP_ID, appId);
  91. txtParams.Add(FORMAT, format);
  92. txtParams.Add(TIMESTAMP, DateTime.Now);
  93. txtParams.Add(ACCESS_TOKEN, accessToken);
  94. txtParams.Add(SIGN_TYPE, signType);
  95. txtParams.Add(TERMINAL_TYPE, request.GetTerminalType());
  96. txtParams.Add(TERMINAL_INFO, request.GetTerminalInfo());
  97. txtParams.Add(PROD_CODE, request.GetProdCode());
  98. if (!string.IsNullOrEmpty(appAuthToken))
  99. {
  100. txtParams.Add(APP_AUTH_TOKEN, appAuthToken);
  101. }
  102. // 添加签名参数
  103. txtParams.Add(SIGN, AopUtils.SignAopRequest(txtParams, privateKeyPem, charset,signType));
  104. Stream outStream = multiMediaDownloadRequest.stream;
  105. AopResponse rsp = await DoGet(txtParams, outStream);
  106. return (T)rsp;
  107. }
  108. #endregion
  109. private async Task<AopResponse> DoGet(AopDictionary parameters, Stream outStream)
  110. {
  111. AlipayMobilePublicMultiMediaDownloadResponse response = null;
  112. string url = this.serverUrl;
  113. System.Console.WriteLine(url);
  114. if (parameters != null && parameters.Count > 0)
  115. {
  116. if (url.Contains("?"))
  117. {
  118. url = url + "&" + WebUtils.BuildQuery(parameters,charset);
  119. }
  120. else
  121. {
  122. url = url + "?" + WebUtils.BuildQuery(parameters,charset);
  123. }
  124. }
  125. HttpWebRequest req = webUtils.GetWebRequest(url, "GET");
  126. req.ContentType = "application/x-www-form-urlencoded;charset=" + charset;
  127. HttpWebResponse rsp = await req.GetResponseAsync() as HttpWebResponse;
  128. if (rsp.StatusCode == HttpStatusCode.OK)
  129. {
  130. if (rsp.ContentType.ToLower().Contains("text/plain"))
  131. {
  132. Encoding encoding = Encoding.GetEncoding(rsp.CharacterSet);
  133. string body = webUtils.GetResponseAsString(rsp,encoding);
  134. IAopParser<AlipayMobilePublicMultiMediaDownloadResponse> tp = new AopJsonParser<AlipayMobilePublicMultiMediaDownloadResponse>();
  135. response = tp.Parse(body, charset);
  136. }else{
  137. GetResponseAsStream(outStream, rsp);
  138. response = new AlipayMobilePublicMultiMediaDownloadResponse();
  139. }
  140. }
  141. return response;
  142. }
  143. /// <summary>
  144. /// 把响应流转换为文本。
  145. /// </summary>
  146. /// <param name="rsp">响应流对象</param>
  147. /// <param name="encoding">编码方式</param>
  148. /// <returns>响应文本</returns>
  149. public void GetResponseAsStream(Stream outStream, HttpWebResponse rsp)
  150. {
  151. StringBuilder result = new StringBuilder();
  152. Stream stream = null;
  153. StreamReader reader = null;
  154. BinaryWriter writer = null;
  155. try
  156. {
  157. // 以字符流的方式读取HTTP响应
  158. stream = rsp.GetResponseStream();
  159. reader = new StreamReader(stream);
  160. writer = new BinaryWriter(outStream);
  161. //stream.CopyTo(outStream);
  162. int length = Convert.ToInt32(rsp.ContentLength);
  163. byte[] buffer = new byte[length];
  164. int rc = 0;
  165. while ((rc=stream.Read(buffer, 0, length)) > 0)
  166. {
  167. outStream.Write(buffer, 0, rc);
  168. }
  169. outStream.Flush();
  170. outStream.Close();
  171. }
  172. finally
  173. {
  174. // 释放资源
  175. if (reader != null) reader.Close();
  176. if (stream != null) stream.Close();
  177. if (rsp != null) rsp.Close();
  178. }
  179. }
  180. public async Task<T> pageExecute<T>(IAopRequest<T> request) where T : AopResponse
  181. {
  182. throw new NotImplementedException();
  183. }
  184. public async Task<T> pageExecute<T>(IAopRequest<T> request, string session, string reqMethod) where T : AopResponse
  185. {
  186. throw new NotImplementedException();
  187. }
  188. public async Task<T> SdkExecute<T>(IAopRequest<T> request) where T : AopResponse
  189. {
  190. throw new NotImplementedException();
  191. }
  192. }
  193. }