WxPayNativePay.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. using System.ComponentModel.DataAnnotations.Schema;
  2. using System.Data.Common;
  3. using System.Linq;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Threading.Tasks;
  7. namespace WingPaymentService.Common.WeChat
  8. {
  9. public class WxPayNativePay
  10. {
  11. private WxPayApi _wxPayApi = new WxPayApi();
  12. /// <summary>
  13. /// 获取网站支付链接
  14. /// </summary>
  15. /// <param name="body">商品描述</param>
  16. /// <param name="totalAmount">总金额</param>
  17. /// <param name="outTradeNo">订单信息</param>
  18. /// <param name="attach">附加数据</param>
  19. /// <param name="deviceInfo">设备信息</param>
  20. /// <returns></returns>
  21. public async Task<(string,string)> GetWebPayUrl(string body, int totalAmount, string outTradeNo, string recordCode, string attach, string deviceInfo)
  22. {
  23. WxPayData data = new WxPayData();
  24. data.SetValue("body", body);//商品描述
  25. data.SetValue("attach", attach);//附加数据
  26. data.SetValue("out_trade_no", outTradeNo);//随机字符串
  27. data.SetValue("total_fee", totalAmount);//总金额
  28. //将当前服务器时间转换为北京时间(微信接口只接受北京时间)
  29. var startBeijingTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, TimeZoneInfo.Local.Id, "China Standard Time");
  30. data.SetValue("time_start", startBeijingTime.ToString("yyyyMMddHHmmss"));//交易起始时间
  31. data.SetValue("time_expire", startBeijingTime.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
  32. //data.SetValue("goods_tag", "jjj");//商品标记
  33. data.SetValue("trade_type", "NATIVE");//交易类型
  34. data.SetValue("device_info", deviceInfo);
  35. data.SetValue("pay_record_code", recordCode);
  36. WxPayData result = await _wxPayApi.UnifiedOrder(data);//调用统一下单接口
  37. var errorCode = result.GetValue("err_code_des")?.ToString();
  38. if (!string.IsNullOrWhiteSpace(errorCode))
  39. {
  40. throw new Exception(errorCode);
  41. }
  42. string url = result.GetValue("code_url")?.ToString();//获取二维码链接
  43. return (url, data.ToJson());
  44. }
  45. /// <summary>
  46. /// 获取手机网站支付链接
  47. /// </summary>
  48. /// <param name="body">商品描述</param>
  49. /// <param name="totalAmount">总金额</param>
  50. /// <param name="outTradeNo">订单信息</param>
  51. /// <param name="attach">附加数据</param>
  52. /// <param name="deviceInfo">设备信息</param>
  53. /// <returns></returns>
  54. public async Task<(string,string)> GetWapPayUrl(string body, int totalAmount, string outTradeNo, string recordCode, string attach, string deviceInfo)
  55. {
  56. WxPayData data = new WxPayData();
  57. data.SetValue("body", body);//商品描述
  58. data.SetValue("attach", attach);//附加数据
  59. data.SetValue("out_trade_no", outTradeNo);//随机字符串
  60. data.SetValue("total_fee", totalAmount);//总金额
  61. //将当前服务器时间转换为北京时间(微信接口只接受北京时间)
  62. var startBeijingTime = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, TimeZoneInfo.Local.Id, "China Standard Time");
  63. data.SetValue("time_start", startBeijingTime.ToString("yyyyMMddHHmmss"));//交易起始时间
  64. data.SetValue("time_expire", startBeijingTime.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
  65. //data.SetValue("goods_tag", "jjj");//商品标记
  66. data.SetValue("trade_type", "MWEB");//交易类型
  67. data.SetValue("device_info", deviceInfo);
  68. data.SetValue("pay_record_code", recordCode);
  69. WxPayData result = await _wxPayApi.UnifiedOrder(data);//调用统一下单接口
  70. var errorCode = result.GetValue("err_code_des")?.ToString();
  71. if (!string.IsNullOrWhiteSpace(errorCode))
  72. {
  73. throw new Exception(errorCode);
  74. }
  75. string url = result.GetValue("mweb_url")?.ToString();//wap支付链接
  76. return (url, data.ToJson());
  77. }
  78. /// <summary>
  79. /// 查询订单获取json
  80. /// </summary>
  81. /// <param name="outTradeNo"></param>
  82. /// <returns></returns>
  83. public async Task<WxPayData> OrderQuery(string outTradeNo)
  84. {
  85. WxPayData data = new WxPayData();
  86. data.SetValue("out_trade_no", outTradeNo);//商品描述
  87. WxPayData result = await _wxPayApi.OrderQuery(data);
  88. return result;
  89. }
  90. /// <summary>
  91. /// 查询退款单获取json
  92. /// </summary>
  93. /// <param name="outTradeNo"></param>
  94. /// <returns></returns>
  95. public async Task<string> RefundQuery(string outTradeNo)
  96. {
  97. WxPayData data = new WxPayData();
  98. data.SetValue("out_trade_no", outTradeNo);//商品描述
  99. WxPayData result = await _wxPayApi.RefundQuery(data);
  100. return result.ToJson();
  101. }
  102. /**
  103. * 参数数组转换为url格式
  104. * @param map 参数名与参数值的映射表
  105. * @return URL字符串
  106. */
  107. private string ToUrlParams(SortedDictionary<string, object> map)
  108. {
  109. string buff = "";
  110. foreach (KeyValuePair<string, object> pair in map)
  111. {
  112. buff += pair.Key + "=" + pair.Value + "&";
  113. }
  114. buff = buff.Trim('&');
  115. return buff;
  116. }
  117. }
  118. }