WxpayController.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System;
  2. using System.Collections.Generic;
  3. using Alipay.AopSdk.Core.Util;
  4. using GxPress.Common.AliPay;
  5. using GxPress.Common.WechatPay;
  6. using Microsoft.AspNetCore.Authorization;
  7. using Microsoft.AspNetCore.Mvc;
  8. namespace GxPress.Api.WebControllers
  9. {
  10. [Route("api/web/wxpay")]
  11. [ApiController]
  12. [Authorize]
  13. public class WxpayController : Controller
  14. {
  15. [HttpGet()]
  16. [AllowAnonymous]
  17. public string GetNativePayUrl()
  18. {
  19. var nativePay = new NativePay();
  20. return nativePay.GetPayUrl("111");
  21. }
  22. /// <summary>
  23. /// 回调地址
  24. /// </summary>
  25. [HttpGet("notify")]
  26. [AllowAnonymous]
  27. public string Callback()
  28. {
  29. /* 实际验证过程建议商户添加以下校验。
  30. 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
  31. 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
  32. 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
  33. 4、验证app_id是否为该商户本身。
  34. */
  35. Dictionary<string, string> sArray = GetRequestGet();
  36. //检查openid和product_id是否返回
  37. if (!sArray.Keys.Equals("openid") || !sArray.Keys.Equals("product_id"))
  38. {
  39. WxPayData res = new WxPayData();
  40. res.SetValue("return_code", "FAIL");
  41. res.SetValue("return_msg", "回调数据异常");
  42. return (res.ToXml());
  43. }
  44. //调统一下单接口,获得下单结果
  45. //string openid = notifyData.GetValue("openid").ToString();
  46. sArray.TryGetValue("openid", out var openid);
  47. //string product_id = notifyData.GetValue("product_id").ToString();
  48. sArray.TryGetValue("product_id", out var product_id);
  49. WxPayData unifiedOrderResult = new WxPayData();
  50. try
  51. {
  52. unifiedOrderResult = GxPress.Common.WechatPay.WxPayApi.UnifiedOrder(openid, product_id);
  53. }
  54. catch (Exception ex)//若在调统一下单接口时抛异常,立即返回结果给微信支付后台
  55. {
  56. WxPayData res = new WxPayData();
  57. res.SetValue("return_code", "FAIL");
  58. res.SetValue("return_msg", "统一下单失败");
  59. return (res.ToXml());
  60. }
  61. //若下单失败,则立即返回结果给微信支付后台
  62. if (!unifiedOrderResult.IsSet("appid") || !unifiedOrderResult.IsSet("mch_id") || !unifiedOrderResult.IsSet("prepay_id"))
  63. {
  64. WxPayData res = new WxPayData();
  65. res.SetValue("return_code", "FAIL");
  66. res.SetValue("return_msg", "统一下单失败");
  67. //Log.Error(this.GetType().ToString(), "UnifiedOrder failure : " + res.ToXml());
  68. return (res.ToXml());
  69. //page.Response.End();
  70. }
  71. //统一下单成功,则返回成功结果给微信支付后台
  72. WxPayData data = new WxPayData();
  73. data.SetValue("return_code", "SUCCESS");
  74. data.SetValue("return_msg", "OK");
  75. data.SetValue("appid", WxPayConfig.GetConfig().GetAppID());
  76. data.SetValue("mch_id", WxPayConfig.GetConfig().GetMchID());
  77. data.SetValue("nonce_str", WxPayApi.GenerateNonceStr());
  78. data.SetValue("prepay_id", unifiedOrderResult.GetValue("prepay_id"));
  79. data.SetValue("result_code", "SUCCESS");
  80. data.SetValue("err_code_des", "OK");
  81. data.SetValue("sign", data.MakeSign());
  82. // Log.Info(this.GetType().ToString(), "UnifiedOrder success , send data to WeChat : " + data.ToXml());
  83. return data.ToXml();
  84. }
  85. private Dictionary<string, string> GetRequestPost()
  86. {
  87. Dictionary<string, string> sArray = new Dictionary<string, string>();
  88. ICollection<string> requestItem = Request.Form.Keys;
  89. foreach (var item in requestItem)
  90. {
  91. sArray.Add(item, Request.Form[item]);
  92. }
  93. return sArray;
  94. }
  95. private Dictionary<string, string> GetRequestGet()
  96. {
  97. Dictionary<string, string> sArray = new Dictionary<string, string>();
  98. ICollection<string> requestItem = Request.Query.Keys;
  99. foreach (var item in requestItem)
  100. {
  101. sArray.Add(item, Request.Query[item]);
  102. }
  103. return sArray;
  104. }
  105. }
  106. }