AlipayPaymentProcessor.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. //using System;
  2. //using System.Threading.Tasks;
  3. //using System.Web;
  4. //using Com.Alipay.Domain;
  5. //using Com.Alipay.Business;
  6. //using Com.Alipay;
  7. //using Com.Alipay.Model;
  8. //using System.Collections.Generic;
  9. //using PaymentGatewaySharedLibs;
  10. //using TradeStatus = PaymentGatewaySharedLibs.TradeStatus;
  11. //namespace PaymentGateway.GatewayApp
  12. //{
  13. // public class AlipayPaymentProcessor : IPaymentProcessor
  14. // {
  15. // private readonly NLog.Logger _logger = NLog.LogManager.GetLogger("Main");
  16. // private static volatile Dictionary<AliPayConfig, IAlipayTradeService> clients = new Dictionary<AliPayConfig, IAlipayTradeService>();
  17. // public static IAlipayTradeService Clients(AliPayConfig config)
  18. // {
  19. // if (!clients.ContainsKey(config))
  20. // {
  21. // var newClient = F2FBiz.CreateClientInstance(config.serverUrl,
  22. // config.appId,
  23. // config.merchant_private_key,
  24. // config.version,
  25. // config.sign_type,
  26. // config.alipay_public_key,
  27. // config.charset);
  28. // clients.Add(config, newClient);
  29. // return newClient;
  30. // }
  31. // else
  32. // {
  33. // return clients[config];
  34. // }
  35. // }
  36. // public async Task<GenericProcessResponse> Process(ElectronicOrderModel order)
  37. // {
  38. // order.TradeStatus = TradeStatus.PAYERROR;
  39. // _logger.Info("Alipay is processing order " + order.BillNumber);
  40. // var config = (AliPayConfig)order.Config;
  41. // AlipayTradePayContentBuilder builder = BuildPayContent(order);
  42. // AlipayF2FPayResult payResult = Clients(config).tradePay(builder);
  43. // switch (payResult.Status)
  44. // {
  45. // case ResultEnum.SUCCESS:
  46. // order.TradeStatus = TradeStatus.SUCCESS;
  47. // break;
  48. // case ResultEnum.FAILED:
  49. // _logger.Info("Request failed with result: ResultEnum.FAILED");
  50. // break;
  51. // case ResultEnum.UNKNOWN:
  52. // _logger.Info("Failed due to unknown reason, plesae check your network configuration and cable connection, " +
  53. // "then retry with a new order number");
  54. // break;
  55. // }
  56. // _logger.Info("The final Alipay response is :\r\n" + HttpUtility.UrlDecode(payResult.response?.Body));
  57. // return new GenericProcessResponse()
  58. // {
  59. // AopResponse = payResult.response
  60. // };
  61. // }
  62. // public async Task<GenericProcessResponse> UnifiedOrder(ElectronicOrderModel order)
  63. // {
  64. // order.TradeStatus = TradeStatus.PAYERROR;
  65. // _logger.Info("UnifiedOrder is processing order " + order.BillNumber);
  66. // var config = (AliPayConfig)order.Config;
  67. // AlipayTradePrecreateContentBuilder builder = BuildPrecreateContent(order);
  68. // AlipayF2FPrecreateResult payResult = Clients(config).tradePrecreate(builder);
  69. // switch (payResult.Status)
  70. // {
  71. // case ResultEnum.SUCCESS:
  72. // order.TradeStatus = TradeStatus.SUCCESS;
  73. // break;
  74. // case ResultEnum.FAILED:
  75. // _logger.Info("Request failed with result: ResultEnum.FAILED");
  76. // break;
  77. // case ResultEnum.UNKNOWN:
  78. // _logger.Info("Failed due to unknown reason, plesae check your network configuration and cable connection, " +
  79. // "then retry with a new order number");
  80. // break;
  81. // }
  82. // _logger.Info("The final Alipay response is :\r\n" + HttpUtility.UrlDecode(payResult.response?.Body));
  83. // return new GenericProcessResponse()
  84. // {
  85. // AopResponse = payResult.response
  86. // };
  87. // }
  88. // public async Task<GenericProcessResponse> Return(ElectronicOrderModel order)
  89. // {
  90. // _logger.Info("Alipay is processing refund, BillNumber = " + order.BillNumber);
  91. // AlipayTradeRefundContentBuilder builder = BuildRefundContent(order);
  92. // AlipayF2FRefundResult refundResult = Clients((AliPayConfig)order.Config).tradeRefund(builder);
  93. // //请在这里加上商户的业务逻辑程序代码
  94. // switch (refundResult.Status)
  95. // {
  96. // case ResultEnum.SUCCESS:
  97. // order.TradeStatus = TradeStatus.SUCCESS;
  98. // break;
  99. // case ResultEnum.FAILED:
  100. // _logger.Info("Request failed with result: ResultEnum.FAILED");
  101. // break;
  102. // case ResultEnum.UNKNOWN:
  103. // if (refundResult.response == null)
  104. // {
  105. // _logger.Info("Failed due to unknown reason, plesae check your network configuration and cable connection, " +
  106. // "then retry with a new order number");
  107. // }
  108. // else
  109. // {
  110. // _logger.Info("System error, please try refunding mannualy");
  111. // }
  112. // break;
  113. // }
  114. // _logger.Info("The final Alipay refund response is :\r\n" + refundResult.response?.Body);
  115. // return new GenericProcessResponse()
  116. // {
  117. // AopResponse = refundResult.response
  118. // };
  119. // }
  120. // public async Task<GenericProcessResponse> Query(ElectronicOrderModel order)
  121. // {
  122. // return await Query(order, 1, 2000);
  123. // }
  124. // public async Task<GenericProcessResponse> Query(ElectronicOrderModel order, int count, int interval)
  125. // {
  126. // order.TradeStatus = TradeStatus.PAYERROR;
  127. // _logger.Info("Ali Query is processing order: " + order.BillNumber);
  128. // //商户订单号
  129. // string out_trade_no = order.BillNumber;
  130. // //商户网站订单系统中唯一订单号,必填
  131. // var queryResult = Clients((AliPayConfig)order.Config).tradeLoopQuery(out_trade_no, count, interval);
  132. // if (queryResult.TradeStatus == "TRADE_FINISHED" ||
  133. // queryResult.TradeStatus == "TRADE_SUCCESS")
  134. // {
  135. // order.TradeStatus = TradeStatus.SUCCESS;
  136. // }
  137. // else
  138. // {
  139. // _logger.Info("Failed due to unknown reason, plesae check your network configuration and cable connection, " +
  140. // "then retry with a new order number");
  141. // }
  142. // _logger.Info("Ali Query process complete, result : \r\n" + queryResult != null ? queryResult.Body : "");
  143. // return new GenericProcessResponse()
  144. // {
  145. // AopResponse = queryResult
  146. // };
  147. // }
  148. // public async Task<GenericProcessResponse> Cancel(ElectronicOrderModel cancelOrder)
  149. // {
  150. // _logger.Info("Ali CodePay failure, reverse order " + cancelOrder.BillNumber);
  151. // return new GenericProcessResponse();
  152. // }
  153. // /// <summary>
  154. // /// 构造支付请求数据
  155. // /// </summary>
  156. // /// <returns>请求数据集</returns>
  157. // private AlipayTradePayContentBuilder BuildPayContent(ElectronicOrderModel order)
  158. // {
  159. // //线上联调时,请输入真实的外部订单号。
  160. // string out_trade_no = order.BillNumber;
  161. // var config = (AliPayConfig)order.Config;
  162. // //扫码枪扫描到的用户手机钱包中的付款条码
  163. // AlipayTradePayContentBuilder builder = new AlipayTradePayContentBuilder();
  164. // //收款账号
  165. // builder.seller_id = config.pid;
  166. // //订单编号
  167. // builder.out_trade_no = out_trade_no;
  168. // //支付场景,无需修改
  169. // builder.scene = "bar_code";
  170. // //支付授权码,付款码
  171. // builder.auth_code = order.AuthCode.Trim();
  172. // //订单总金额
  173. // builder.total_amount = order.NetAmount.ToString();
  174. // //参与优惠计算的金额
  175. // //builder.discountable_amount = "";
  176. // //不参与优惠计算的金额
  177. // //builder.undiscountable_amount = "";
  178. // //订单名称
  179. // builder.subject = order.Title;
  180. // //自定义超时时间
  181. // builder.timeout_express = "30m";
  182. // //订单描述
  183. // builder.body = "";
  184. // //门店编号,很重要的参数,可以用作之后的营销
  185. // builder.store_id = order.SiteId;
  186. // //操作员编号,很重要的参数,可以用作之后的营销
  187. // builder.operator_id = order.OperatorId;
  188. // //传入商品信息详情
  189. // List<GoodsInfo> gList = new List<GoodsInfo>();
  190. // order.FuelOrderDetails.ForEach(i =>
  191. // {
  192. // GoodsInfo goods = new GoodsInfo();
  193. // goods.goods_id = i.FuelProductId;
  194. // goods.goods_name = i.FuelProductName;
  195. // goods.price = i.Amount.ToString();
  196. // goods.quantity = i.Qualtity.ToString();
  197. // gList.Add(goods);
  198. // });
  199. // builder.goods_detail = gList;
  200. // //系统商接入可以填此参数用作返佣
  201. // //ExtendParams exParam = new ExtendParams();
  202. // //exParam.sysServiceProviderId = "20880000000000";
  203. // //builder.extendParams = exParam;
  204. // return builder;
  205. // }
  206. // /// <summary>
  207. // /// 构造支付请求数据
  208. // /// </summary>
  209. // /// <returns>请求数据集</returns>
  210. // private AlipayTradePrecreateContentBuilder BuildPrecreateContent(ElectronicOrderModel order)
  211. // {
  212. // //线上联调时,请输入真实的外部订单号。
  213. // string out_trade_no = order.BillNumber;
  214. // var config = (AliPayConfig)order.Config;
  215. // //扫码枪扫描到的用户手机钱包中的付款条码
  216. // var builder = new AlipayTradePrecreateContentBuilder();
  217. // //收款账号
  218. // builder.seller_id = config.pid;
  219. // //订单编号
  220. // builder.out_trade_no = out_trade_no;
  221. // //订单总金额
  222. // builder.total_amount = order.NetAmount.ToString();
  223. // //参与优惠计算的金额
  224. // //builder.discountable_amount = "";
  225. // //不参与优惠计算的金额
  226. // //builder.undiscountable_amount = "";
  227. // //订单名称
  228. // builder.subject = order.Title;
  229. // //自定义超时时间
  230. // builder.timeout_express = "30m";
  231. // //订单描述
  232. // builder.body = "";
  233. // //门店编号,很重要的参数,可以用作之后的营销
  234. // builder.store_id = order.SiteId;
  235. // //操作员编号,很重要的参数,可以用作之后的营销
  236. // builder.operator_id = order.OperatorId;
  237. // //传入商品信息详情
  238. // List<GoodsInfo> gList = new List<GoodsInfo>();
  239. // order.FuelOrderDetails.ForEach(i =>
  240. // {
  241. // GoodsInfo goods = new GoodsInfo();
  242. // goods.goods_id = i.FuelProductId;
  243. // goods.goods_name = i.FuelProductName;
  244. // goods.price = i.Amount.ToString();
  245. // goods.quantity = i.Qualtity.ToString();
  246. // gList.Add(goods);
  247. // });
  248. // builder.goods_detail = gList;
  249. // //系统商接入可以填此参数用作返佣
  250. // //ExtendParams exParam = new ExtendParams();
  251. // //exParam.sysServiceProviderId = "20880000000000";
  252. // //builder.extendParams = exParam;
  253. // return builder;
  254. // }
  255. // /// <summary>
  256. // /// 构造退款请求数据
  257. // /// </summary>
  258. // /// <returns>请求数据集</returns>
  259. // private AlipayTradeRefundContentBuilder BuildRefundContent(ElectronicOrderModel order)
  260. // {
  261. // AlipayTradeRefundContentBuilder builder = new AlipayTradeRefundContentBuilder();
  262. // //支付宝交易号与商户网站订单号不能同时为空
  263. // builder.out_trade_no = order.BillNumber;
  264. // //退款请求单号保持唯一性。
  265. // builder.out_request_no = order.BillNumber + DateTime.Now.ToString();
  266. // //退款金额
  267. // builder.refund_amount = order.NetAmount.ToString();
  268. // builder.refund_reason = "refund from POS";
  269. // return builder;
  270. // }
  271. // }
  272. //}