当前位置:   article > 正文

微信支付(下)--回调_代码中微信支付怎么回滚

代码中微信支付怎么回滚

不懂支付的请看我的上一篇文章

里面有个支付回调的设置,当用户支付成功或者失败的时候,微信会回调到这个(抓包是抓不到的,因为没有包),并且微信会给一些参数用于判断是否支付成功的。这里需要用input的来接收。微信给的参数是xml格式的参数。重要,会滴函数里结束后我们也要返回参数给微信,而且也是要xml格式的,不然微信会每隔几十秒通知我们支付是否成功。所以一定得返回,而且返回格式要正确,这是一个坑。上代码

1、新建一个控制器用于做回调的,代码如下

  1. require_once INIT_PATH . "vendor/wxpay/lib/WxPay.Api.php";
  2. require_once INIT_PATH . "vendor/wxpay/lib/WxPay.Notify.php";
  3. require_once INIT_PATH . "vendor/wxpay/log.php";
  4. InitPHP::import('web/components/baseController.php');
  5. class notifyController extends baseController
  6. {
  7. public $initphp_list = [
  8. 'run',
  9. ];
  10. public function run()
  11. {
  12. $notify = new WxPayNotify();
  13. $notify->Handle();
  14. $data = $notify->returnValue();
  15. writeLog(json_encode($data),'wx_callback');
  16. $msg = $data["transaction_id"];
  17. if(!array_key_exists("transaction_id", $data)){
  18. $msg .= "输入参数不正确";
  19. writeLog($msg,'wx_callback');
  20. $notify->SetReturn_code("FAIL");
  21. $notify->SetReturn_msg($msg);
  22. $notify->ReplyNotify(false);
  23. exit;
  24. }
  25. if (empty($data['out_trade_no'])) {
  26. $msg .= '查无订单';
  27. writeLog($msg,'wx_callback');
  28. $notify->SetReturn_code("FAIL");
  29. $notify->SetReturn_msg($msg);
  30. $notify->ReplyNotify(false);
  31. exit;
  32. }
  33. $info = $this->getMemberCardOrderDao()->getOneByField(['order_id' => $data['out_trade_no']]);
  34. if (!isset($info['id'])) {
  35. $msg .= '无订单信息';
  36. writeLog($msg,'wx_callback');
  37. $notify->SetReturn_code("FAIL");
  38. $notify->SetReturn_msg($msg);
  39. $notify->ReplyNotify(false);
  40. exit;
  41. }
  42. if ($info['status'] == 1) {
  43. $msg .= '订单已存在';
  44. writeLog($msg,'wx_callback');
  45. $notify->SetReturn_code("FAIL");
  46. $notify->SetReturn_msg($msg);
  47. $notify->ReplyNotify(false);
  48. exit;
  49. }
  50. $updateData = [
  51. 'status' => 1,
  52. 'pay_time' => time(),
  53. ];
  54. $userInfo = $this->getMemberDao()->getOne($info['uid']);
  55. if (!isset($userInfo['id'])) {
  56. $msg .= '无该会员信息,user_info='.json_encode($info);
  57. writeLog($msg,'wx_callback');
  58. $notify->SetReturn_code("FAIL");
  59. $notify->SetReturn_msg($msg);
  60. $notify->ReplyNotify(false);
  61. exit;
  62. }
  63. $cardTime = (int)$this->getMemberCardOrderDao()->getCardType($info['card_type']);
  64. $this->getMemberCardOrderDao()->update($info['id'],$updateData);
  65. if ($userInfo['card_expire_at'] == '-1') {
  66. $card_expire_at = $cardTime + time();
  67. } else {
  68. $card_expire_at = intval($userInfo['card_expire_at']);
  69. $card_expire_at = $card_expire_at + $cardTime;
  70. }
  71. $this->getMemberDao()->update($userInfo['id'],array('card_expire_at' => $card_expire_at));
  72. $notify->ReplyNotify(false);
  73. exit;
  74. }
  75. /**
  76. *
  77. * @return memberCardOrderDao
  78. * */
  79. private function getMemberCardOrderDao()
  80. {
  81. return InitPHP::getDao('memberCardOrder');
  82. }
  83. }

注意:这里最好的是继承自己的基类,不继承基类,到时插入数据库又不好操作,因为这个是我们不能才微信回调这里跳转,所以这里我改了一下sdk的代码

  1. <?php
  2. /**
  3. *
  4. * 回调基础类
  5. * @author widyhu
  6. *
  7. */
  8. class WxPayNotify extends WxPayNotifyReply
  9. {
  10. private $returnData = [];
  11. /**
  12. *
  13. * 回调入口
  14. */
  15. final public function Handle()
  16. {
  17. //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败
  18. $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);
  19. if($result == false){
  20. $this->SetReturn_code("FAIL");
  21. $this->SetReturn_msg($msg);
  22. $this->ReplyNotify(false);
  23. return;
  24. } else {
  25. //该分支在成功回调到NotifyCallBack方法,处理完成之后流程
  26. $this->SetReturn_code("SUCCESS");
  27. $this->SetReturn_msg("OK");
  28. }
  29. //$this->ReplyNotify($needSign);
  30. }
  31. /**
  32. *
  33. * 回调方法入口,子类可重写该方法
  34. * 注意:
  35. * 1、微信回调超时时间为2s,建议用户使用异步处理流程,确认成功之后立刻回复微信服务器
  36. * 2、微信服务器在调用失败或者接到回包为非确认包的时候,会发起重试,需确保你的回调是可以重入
  37. * @param array $data 回调解释出的参数
  38. * @param string $msg 如果回调处理失败,可以将错误信息输出到该方法
  39. * @return true回调出来完成不需要继续回调,false回调处理未完成需要继续回调
  40. */
  41. public function NotifyProcess($data, &$msg)
  42. {
  43. //Log::DEBUG("call back:" . json_encode($data));
  44. $notfiyOutput = array();
  45. if(!array_key_exists("transaction_id", $data)){
  46. $msg = "输入参数不正确";
  47. return false;
  48. }
  49. //查询订单,判断订单真实性
  50. if(!$this->Queryorder($data["transaction_id"])){
  51. $msg = "订单查询失败";
  52. return false;
  53. }
  54. return true;
  55. }
  56. //查询订单
  57. public function Queryorder($transaction_id)
  58. {
  59. $input = new WxPayOrderQuery();
  60. $input->SetTransaction_id($transaction_id);
  61. $result = WxPayApi::orderQuery($input);
  62. //Log::DEBUG("query:" . json_encode($result));
  63. if(array_key_exists("return_code", $result)
  64. && array_key_exists("result_code", $result)
  65. && $result["return_code"] == "SUCCESS"
  66. && $result["result_code"] == "SUCCESS")
  67. {
  68. return true;
  69. }
  70. return false;
  71. }
  72. public function returnValue()
  73. {
  74. return $this->returnData;
  75. }
  76. /**
  77. *
  78. * notify回调方法,该方法中需要赋值需要输出的参数,不可重写
  79. * @param array $data
  80. * @return true回调出来完成不需要继续回调,false回调处理未完成需要继续回调
  81. */
  82. final public function NotifyCallBack($data)
  83. {
  84. $msg = "OK";
  85. $result = $this->NotifyProcess($data, $msg);
  86. if($result == true){
  87. $this->returnData = $data;
  88. $this->SetReturn_code("SUCCESS");
  89. $this->SetReturn_msg("OK");
  90. } else {
  91. $this->SetReturn_code("FAIL");
  92. $this->SetReturn_msg($msg);
  93. }
  94. return $result;
  95. }
  96. /**
  97. *
  98. * 回复通知
  99. * @param bool $needSign 是否需要签名输出
  100. */
  101. final public function ReplyNotify($needSign = true)
  102. {
  103. //如果需要签名
  104. if($needSign == true &&
  105. $this->GetReturn_code() == "SUCCESS")
  106. {
  107. $this->SetSign();
  108. }
  109. WxpayApi::replyNotify($this->ToXml());
  110. }
  111. }

注意控制器要调用 

$notify->ReplyNotify(false);

来返回给微信。

改了这个文件中



这个本来是说在基类重写的,但我没有继承,所以在这修改


新增






声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/132302
推荐阅读
相关标签
  

闽ICP备14008679号