BarcodePayResponse.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using PaySharp.Alipay.Domain;
  6. using PaySharp.Alipay.Request;
  7. using PaySharp.Core.Request;
  8. namespace PaySharp.Alipay.Response
  9. {
  10. public class BarcodePayResponse : BaseResponse
  11. {
  12. /// <summary>
  13. /// 支付宝交易号
  14. /// </summary>
  15. public string TradeNo { get; set; }
  16. /// <summary>
  17. /// 商户订单号
  18. /// </summary>
  19. public string OutTradeNo { get; set; }
  20. /// <summary>
  21. /// 买家支付宝账号
  22. /// </summary>
  23. public string BuyerLogonId { get; set; }
  24. /// <summary>
  25. /// 订单金额
  26. /// </summary>
  27. public double TotalAmount { get; set; }
  28. /// <summary>
  29. /// 标价币种
  30. /// </summary>
  31. public string TransCurrency { get; set; }
  32. /// <summary>
  33. /// 结算币种
  34. /// </summary>
  35. public string SettleCurrency { get; set; }
  36. /// <summary>
  37. /// 结算金额
  38. /// </summary>
  39. public double SettleAmount { get; set; }
  40. /// <summary>
  41. /// 支付币种
  42. /// </summary>
  43. public string PayCurrency { get; set; }
  44. /// <summary>
  45. /// 支付金额
  46. /// </summary>
  47. public double PayAmount { get; set; }
  48. /// <summary>
  49. /// 结算币种兑换标价币种汇率
  50. /// </summary>
  51. public double SettleTransRate { get; set; }
  52. /// <summary>
  53. /// 标价币种兑换支付币种汇率
  54. /// </summary>
  55. public double TransPayRate { get; set; }
  56. /// <summary>
  57. /// 实收金额
  58. /// </summary>
  59. public double ReceiptAmount { get; set; }
  60. /// <summary>
  61. /// 付款金额
  62. /// </summary>
  63. public double BuyerPayAmount { get; set; }
  64. /// <summary>
  65. /// 集分宝金额
  66. /// </summary>
  67. public double PointAmount { get; set; }
  68. /// <summary>
  69. /// 开票金额
  70. /// </summary>
  71. public double InvoiceAmount { get; set; }
  72. /// <summary>
  73. /// 交易付款时间
  74. /// </summary>
  75. public DateTime GmtPayment { get; set; }
  76. /// <summary>
  77. /// 交易支付使用的资金渠道
  78. /// </summary>
  79. public List<TradeFundBill> FundBillList { get; set; }
  80. /// <summary>
  81. /// 支付宝卡余额
  82. /// </summary>
  83. public double CardBalance { get; set; }
  84. /// <summary>
  85. /// 发生支付交易的商户门店名称
  86. /// </summary>
  87. public string StoreName { get; set; }
  88. /// <summary>
  89. /// 买家支付宝用户号
  90. /// </summary>
  91. public string BuyerUserId { get; set; }
  92. /// <summary>
  93. /// 本交易支付时使用的所有优惠券信息
  94. /// </summary>
  95. public string DiscountGoodsDetail { get; set; }
  96. /// <summary>
  97. /// 本交易支付时使用的所有优惠券信息
  98. /// </summary>
  99. public List<VoucherDetail> VoucherDetailList { get; set; }
  100. /// <summary>
  101. /// 预授权支付模式,该参数仅在信用预授权支付场景下返回。信用预授权支付:CREDIT_PREAUTH_PAY
  102. /// </summary>
  103. public string AuthTradePayMode { get; set; }
  104. /// <summary>
  105. /// 商户传入业务信息,具体值要和支付宝约定
  106. /// 将商户传入信息分发给相应系统,应用于安全,营销等参数直传场景
  107. /// 格式为json格式
  108. /// </summary>
  109. public string BusinessParams { get; set; }
  110. /// <summary>
  111. /// 买家用户类型
  112. /// CORPORATE:企业用户
  113. /// PRIVATE:个人用户
  114. /// </summary>
  115. public string BuyerUserType { get; set; }
  116. /// <summary>
  117. /// 商家优惠金额
  118. /// </summary>
  119. public double MdiscountAmount { get; set; }
  120. /// <summary>
  121. /// 平台优惠金额
  122. /// </summary>
  123. public double DiscountAmount { get; set; }
  124. private Merchant _merchant;
  125. internal override void Execute<TModel, TResponse>(Merchant merchant, Request<TModel, TResponse> request)
  126. {
  127. _merchant = merchant;
  128. var barcodePayRequest = request as BarcodePayRequest;
  129. if (Code == "10000")
  130. {
  131. barcodePayRequest.OnPaySucceed(this, null);
  132. return;
  133. }
  134. if (!string.IsNullOrEmpty(TradeNo))
  135. {
  136. var queryResponse = new QueryResponse();
  137. Task.Run(async () =>
  138. {
  139. queryResponse = await PollQueryTradeStateAsync(
  140. TradeNo,
  141. barcodePayRequest.PollTime,
  142. barcodePayRequest.PollCount);
  143. })
  144. .GetAwaiter()
  145. .GetResult();
  146. if (queryResponse != null)
  147. {
  148. barcodePayRequest.OnPaySucceed(queryResponse, null);
  149. return;
  150. }
  151. else
  152. {
  153. barcodePayRequest.OnPayFailed(this, "支付超时");
  154. return;
  155. }
  156. }
  157. barcodePayRequest.OnPayFailed(this, SubMessage);
  158. }
  159. /// <summary>
  160. /// 轮询查询用户是否支付
  161. /// </summary>
  162. /// <param name="tradeNo">支付宝订单号</param>
  163. /// <param name="pollTime">轮询间隔</param>
  164. /// <param name="pollCount">轮询次数</param>
  165. /// <returns></returns>
  166. private QueryResponse PollQueryTradeState(string tradeNo, int pollTime, int pollCount)
  167. {
  168. for (var i = 0; i < pollCount; i++)
  169. {
  170. var queryRequest = new QueryRequest();
  171. queryRequest.AddGatewayData(new QueryModel
  172. {
  173. TradeNo = tradeNo
  174. });
  175. var queryResponse = SubmitProcess.Execute(_merchant, queryRequest);
  176. if (queryResponse.TradeStatus == "TRADE_SUCCESS")
  177. {
  178. return queryResponse;
  179. }
  180. Thread.Sleep(pollTime);
  181. }
  182. //支付超时,取消订单
  183. var cancelRequest = new CancelRequest();
  184. cancelRequest.AddGatewayData(new CancelModel
  185. {
  186. TradeNo = tradeNo
  187. });
  188. SubmitProcess.Execute(_merchant, cancelRequest);
  189. return null;
  190. }
  191. /// <summary>
  192. /// 轮询查询用户是否支付
  193. /// </summary>
  194. /// <param name="tradeNo">支付宝订单号</param>
  195. /// <param name="pollTime">轮询间隔</param>
  196. /// <param name="pollCount">轮询次数</param>
  197. /// <returns></returns>
  198. private async Task<QueryResponse> PollQueryTradeStateAsync(string tradeNo, int pollTime, int pollCount)
  199. {
  200. return await Task.Run(() => PollQueryTradeState(tradeNo, pollTime, pollCount));
  201. }
  202. }
  203. }