Notify.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System.Text;
  2. using System.Threading.Tasks;
  3. using System.Web.UI;
  4. using WayneCloud.Models.Models;
  5. namespace Wechat.PayAPI
  6. {
  7. /// <summary>
  8. /// 回调处理基类
  9. /// 主要负责接收微信支付后台发送过来的数据,对数据进行签名验证
  10. /// 子类在此类基础上进行派生并重写自己的回调处理过程
  11. /// </summary>
  12. public class Notify
  13. {
  14. public Page page {get;set;}
  15. public Notify(Page page)
  16. {
  17. this.page = page;
  18. }
  19. /// <summary>
  20. /// 接收从微信支付后台发送过来的数据并验证签名
  21. /// </summary>
  22. /// <returns>微信支付后台返回的数据</returns>
  23. public WxPayData GetNotifyData()
  24. {
  25. //接收从微信后台POST过来的数据
  26. System.IO.Stream s = page.Request.InputStream;
  27. int count = 0;
  28. byte[] buffer = new byte[1024];
  29. StringBuilder builder = new StringBuilder();
  30. while ((count = s.Read(buffer, 0, 1024)) > 0)
  31. {
  32. builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
  33. }
  34. s.Flush();
  35. s.Close();
  36. s.Dispose();
  37. Log.Info(this.GetType().ToString(), "Receive data from WeChat : " + builder.ToString());
  38. //转换数据格式并验证签名
  39. WxPayData data = new WxPayData();
  40. try
  41. {
  42. //Abby have issue
  43. data.FromXml(null, builder.ToString());
  44. }
  45. catch(WxPayException ex)
  46. {
  47. //若签名错误,则立即返回结果给微信支付后台
  48. WxPayData res = new WxPayData();
  49. res.SetValue("return_code", "FAIL");
  50. res.SetValue("return_msg", ex.Message);
  51. Log.Error(this.GetType().ToString(), "Sign check error : " + res.ToXml());
  52. page.Response.Write(res.ToXml());
  53. page.Response.End();
  54. }
  55. Log.Info(this.GetType().ToString(), "Check sign success");
  56. return data;
  57. }
  58. //派生类需要重写这个方法,进行不同的回调处理
  59. public virtual async Task ProcessNotify(WxPayConfig config)
  60. {
  61. }
  62. }
  63. }