WxPay.Notify.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. /**
  3. *
  4. * 回调基础类
  5. * @author widyhu
  6. *
  7. */
  8. class WxPayNotify extends WxPayNotifyReply
  9. {
  10. private $config = null;
  11. /**
  12. *
  13. * 回调入口
  14. * @param bool $needSign 是否需要签名返回
  15. */
  16. final public function Handle($config, $needSign = true)
  17. {
  18. $this->config = $config;
  19. $msg = "OK";
  20. //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败
  21. $result = WxpayApi::notify($config, array($this, 'NotifyCallBack'), $msg);
  22. if($result == false){
  23. $this->SetReturn_code("FAIL");
  24. $this->SetReturn_msg($msg);
  25. $this->ReplyNotify(false);
  26. return;
  27. } else {
  28. //该分支在成功回调到NotifyCallBack方法,处理完成之后流程
  29. $this->SetReturn_code("SUCCESS");
  30. $this->SetReturn_msg("OK");
  31. }
  32. $this->ReplyNotify($needSign);
  33. }
  34. /**
  35. *
  36. * 回调方法入口,子类可重写该方法
  37. //TODO 1、进行参数校验
  38. //TODO 2、进行签名验证
  39. //TODO 3、处理业务逻辑
  40. * 注意:
  41. * 1、微信回调超时时间为2s,建议用户使用异步处理流程,确认成功之后立刻回复微信服务器
  42. * 2、微信服务器在调用失败或者接到回包为非确认包的时候,会发起重试,需确保你的回调是可以重入
  43. * @param WxPayNotifyResults $objData 回调解释出的参数
  44. * @param WxPayConfigInterface $config
  45. * @param string $msg 如果回调处理失败,可以将错误信息输出到该方法
  46. * @return true回调出来完成不需要继续回调,false回调处理未完成需要继续回调
  47. */
  48. public function NotifyProcess($objData, $config, &$msg)
  49. {
  50. //TODO 用户基础该类之后需要重写该方法,成功的时候返回true,失败返回false
  51. return false;
  52. }
  53. /**
  54. *
  55. * 业务可以继承该方法,打印XML方便定位.
  56. * @param string $xmlData 返回的xml参数
  57. *
  58. **/
  59. public function LogAfterProcess($xmlData)
  60. {
  61. return;
  62. }
  63. /**
  64. *
  65. * notify回调方法,该方法中需要赋值需要输出的参数,不可重写
  66. * @param array $data
  67. * @return true回调出来完成不需要继续回调,false回调处理未完成需要继续回调
  68. */
  69. final public function NotifyCallBack($data)
  70. {
  71. $msg = "OK";
  72. $result = $this->NotifyProcess($data, $this->config, $msg);
  73. if($result == true){
  74. $this->SetReturn_code("SUCCESS");
  75. $this->SetReturn_msg("OK");
  76. } else {
  77. $this->SetReturn_code("FAIL");
  78. $this->SetReturn_msg($msg);
  79. }
  80. return $result;
  81. }
  82. /**
  83. *
  84. * 回复通知
  85. * @param bool $needSign 是否需要签名输出
  86. */
  87. final private function ReplyNotify($needSign = true)
  88. {
  89. //如果需要签名
  90. if($needSign == true &&
  91. $this->GetReturn_code() == "SUCCESS")
  92. {
  93. $this->SetSign($this->config);
  94. }
  95. $xml = $this->ToXml();
  96. $this->LogAfterProcess($xml);
  97. WxpayApi::replyNotify($xml);
  98. }
  99. }