UnionPayRequest.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System;
  2. namespace MySystem.Entity.UnionPay
  3. {
  4. /// <summary>
  5. /// 银联请求报文
  6. /// </summary>
  7. public class UnionPayRequest<T>
  8. {
  9. private static int _sequenceNumber = 0;
  10. /// <summary>
  11. /// 服务商编号,由乐刷分配的接入方唯一标识,明文传输
  12. /// </summary>
  13. public string agentId { get; set; }
  14. /// <summary>
  15. /// 当前代理商编号(操作来源)
  16. /// </summary>
  17. public string currentAgentId { get; set; }
  18. /// <summary>
  19. /// 版本号,目前固定值1.0
  20. /// </summary>
  21. public string version { get; set; } = "1.0";
  22. /// <summary>
  23. /// 请求流水号(yyyyMMddHHmmssSSSXXXXX,其中 XXXXX为5位顺序号,禁止使用UUID等无意义数据)
  24. /// </summary>
  25. public string reqSerialNo { get; set; } = GenerateReqSerialNo();
  26. /// <summary>
  27. /// 签名串
  28. /// </summary>
  29. public string sign { get; set; }
  30. /// <summary>
  31. /// 验签方式,默认true-国密验签,false-MD5验签
  32. /// </summary>
  33. public bool algorithm { get; set; } = true;
  34. /// <summary>
  35. /// 业务数据
  36. /// </summary>
  37. public T data { get; set; }
  38. /// <summary>
  39. /// 生成请求流水号
  40. /// </summary>
  41. /// <returns>格式化的请求流水号</returns>
  42. private static string GenerateReqSerialNo()
  43. {
  44. // 生成当前时间戳部分:yyyyMMddHHmmssSSS
  45. string timestamp = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  46. // 生成5位顺序号,循环递增
  47. int sequence = System.Threading.Interlocked.Increment(ref _sequenceNumber);
  48. if (sequence > 99999)
  49. {
  50. System.Threading.Interlocked.Exchange(ref _sequenceNumber, 1);
  51. sequence = 1;
  52. }
  53. // 组合完整的请求流水号
  54. return $"{timestamp}{sequence.ToString("D5")}";
  55. }
  56. }
  57. /// <summary>
  58. /// 银联请求报文(非泛型版本,兼容旧代码)
  59. /// </summary>
  60. public class UnionPayRequest : UnionPayRequest<object>
  61. {
  62. }
  63. }