经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
php对微信支付回调处理的方法(合集)
来源:cnblogs  作者:子钦加油  时间:2019/7/26 9:03:07  对本文有异议

微信无论是微信内置JSAPI支付、H5外部浏览器支付、扫码支付,都需要通过异步回调接收支付结果。

本文简介如何获取微信支付通知。

仅需要一个在之前设置好的回调地址的方法里写上如下:

  1. //处理微信支付回调
  2. public function notify(){
  3. $testxml = file_get_contents("php://input");
  4. $jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));
  5. $result = json_decode($jsonxml, true);//转成数组,
  6. if($result){
  7. //如果成功返回了
  8. $out_trade_no = $result['out_trade_no'];
  9. if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
  10.       //执行业务逻辑
  11.           //查询创建订单表 where("out_trade_no='".$out_trade_no."' and status=1") status为1表示待支付状态 1 待支付
  12.           //查询出来有该订单 就改变支付状态 status=2 2表示支付成功
  13. }
  14. }
  15. }

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 
(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)    
    
结束微信重新通知用代码:echo 'SUCCESS';

附上:
微信支付返回的xml转化为json格式如下: 

  1. {
  2. "appid": "12345",
  3. "attach": "pay",
  4. "bank_type": "CFT",
  5. "cash_fee": "1",
  6. "fee_type": "CNY",
  7. "is_subscribe": "Y",
  8. "mch_id": "12345",
  9. "nonce_str": "dZYFpaDYRpF5rwhv",
  10. "openid": "onhwF1hiutUySKCsrV21A6MCtT5Q",
  11. "out_trade_no": "SH201808222055598628",
  12. "result_code": "SUCCESS",
  13. "return_code": "SUCCESS",
  14. "sign": "5A019F52BEF1C3A98AE0F1FF29D01574",
  15. "time_end": "20180822205606",
  16. "total_fee": "1",
  17. "trade_type": "MWEB",
  18. "transaction_id": "4200000171201808221550954201"
  19. }

 

//详细流程如下

  1. public function wycz(){//我要充值
  2. if(session('uid') ==NULL || session('uid') == "" || session('uid') == false){
  3. //没有登录 跳转到登录页
  4. $this->redirect('/Login/login');exit;
  5. }else {
  6. //接受参数
  7. if($_POST){
  8. $Total_fee = trim(I("post.fotal_fee"));
  9. if(!empty($Total_fee)){
  10. if($Total_fee<=0){
  11. //提示输入正整数金额
  12. $arr['code'] = "301";
  13. $arr['msg'] = "输入正整数";
  14. echo json_encode($arr);exit();
  15. }else{
  16. session("total_fee",$Total_fee);
  17. $arr['code'] = "200";
  18. $arr['msg'] = "确认充值吗?";
  19. echo json_encode($arr);exit();
  20. }
  21. }else{
  22. //提示输入正整数金额
  23. $arr['code'] = "302";
  24. $arr['msg'] = "输入充值金额";
  25. echo json_encode($arr);exit();
  26. }
  27. }
  28. $this->display();
  29. }
  30. }
  31. //充值确认页面
  32. public function confirmPay(){
  33. if(session('uid') ==NULL || session('uid') == "" || session('uid') == false){
  34. //没有登录 跳转到登录页
  35. $this->redirect('/Login/login');exit;
  36. }else {
  37. $result = $this->wapPay();
  38. $this->assign('jsApiParameters',$result['jsApiParameters']);
  39. $this->assign('editAddress', $result['editAddress']);
  40. $this->display();
  41. }
  42. }
  43. //操作充值
  44. public function wapPAy($Total_fee)
  45. {
  46. /**
  47. *
  48. * example目录下为简单的支付样例,仅能用于搭建快速体验微信支付使用
  49. * 样例的作用仅限于指导如何使用sdk,在安全上面仅做了简单处理, 复制使用样例代码时请慎重
  50. * 请勿直接直接使用样例对外提供服务
  51. *
  52. **/
  53. Vendor('Wxpaysdk.lib.WxPay#Api');
  54. Vendor('Wxpaysdk.example.WxPay#JsApiPay');
  55. // Vendor('Wxpaysdk.example.WxPay#Config');
  56. //①、获取用户openid
  57. $tools = new \JsApiPay();
  58. $openId = $tools->GetOpenid();
  59. $Total_fee = session("total_fee")*100;
  60. //$Total_fee = session("total_fee");
  61. //②、统一下单
  62. $input = new \WxPayUnifiedOrder();
  63. $input->SetBody("vip充值");
  64. $input->SetAttach("vip充值");
  65. $input->SetOut_trade_no("klkq".date("YmdHis"));
  66. $input->SetTotal_fee($Total_fee);
  67. $input->SetTime_start(date("YmdHis"));
  68. $input->SetTime_expire(date("YmdHis", time() + 600));
  69. $input->SetGoods_tag("vip充值");
  70. //$input->SetNotify_url("http://paysdk.weixin.qq.com/notify.php");
  71. $input->SetNotify_url("http://wap.yuming.com/Member/notify");
  72. $input->SetTrade_type("JSAPI");
  73. $input->SetOpenid($openId);
  74. $config = new \WxPayConfig();
  75. $order = \WxPayApi::unifiedOrder($config, $input);
  76. //echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
  77. //printf_info($order);
  78. $jsApiParameters = $tools->GetJsApiParameters($order);
  79. //获取共享收货地址js函数参数
  80. $editAddress = $tools->GetEditAddressParameters();
  81. $data['jsApiParameters'] = $jsApiParameters;
  82. $data['editAddress'] = $editAddress;
  83. //写入订单表对应数据
  84. $arr = array(
  85. 'w_mId'=>session('uid'),
  86. 'w_openid'=>$openId,
  87. 'w_title'=>'vip充值',
  88. 'w_time_create'=>date("YmdHis"),
  89. 'w_times_create'=>date("Y-m-d H:i:s"),
  90. 'w_out_trade_no'=>"klkq".date("YmdHis"),
  91. );
  92. M('wxpay_order')->add($arr);
  93. return $data;
  94. }
  95. //处理微信支付回调
  96. public function notify(){
  97. $testxml = file_get_contents("php://input");
  98. $jsonxml = json_encode(simplexml_load_string($testxml,'SimpleXMLElement',LIBXML_NOCDATA));
  99. $result = json_decode($jsonxml,true);
  100. if($result){
  101. $out_trade_no = $result['out_trade_no'];
  102. if($result['return_code'] == 'SUCCESS' && $result['result_code'] =='SUCCESS'){
  103. //先判断订单状态是否已经改变
  104. $orderData = M("wxpay_order")->where("w_out_trade_no='".$result['out_trade_no']."' and w_status=1")->find();
  105. if(!empty($orderData)){
  106. //支付成功改变支付状态
  107. $arr = array(
  108. 'w_id'=>$orderData['w_id'],
  109. 'w_openid'=>$result['openid'],
  110. 'w_transaction_id'=>$result['transaction_id'],
  111. 'w_time_end'=>$result['time_end'],
  112. 'w_times_end'=>$result['time_end'],
  113. 'w_total_fee'=>$result['total_fee']/100,
  114. 'w_status'=>2,//支付成功 1 待支付 2支付成功 3 支付失败
  115. );
  116. M('wxpay_order')->save($arr);
  117. //操作积分
  118. $uid = $orderData['w_mId'];
  119. //对该人增加$result['total_fee']积分
  120. $zz_grade = M('grade');
  121. $g_Integral = $zz_grade->where("g_mId=".$uid)->getField('g_Integral');
  122. $zz_grade->g_Integral = $g_Integral + intval($result['total_fee']/100);
  123. //更新积分
  124. $giddd = $zz_grade->where("g_mId=".$uid)->save();
  125. //操作积分日志表
  126. $zz_grade_log = M('grade_log');
  127. $zz_grade_log->g_gContent = '充值'.intval($result['total_fee']/100).'积分';
  128. $zz_grade_log->g_mId = $uid;//邀请者会员id
  129. $zz_grade_log->g_gNum = intval($result['total_fee']/100);//充值积分
  130. $zz_grade_log->g_gDate = date('Y-m-d');//注册日期
  131. $zz_grade_log->g_gTime = date('Y-m-d H:i:s');//注册时间
  132. //写入数据库
  133. $liddd = $zz_grade_log->add();
  134. }
  135. }
  136. }
  137. }

 

原文链接:http://www.cnblogs.com/zmdComeOn/p/11244656.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号