php对微信支付回调处理的方法(合集)
程序员文章站
2022-05-16 12:06:14
微信无论是微信内置JSAPI支付、H5外部浏览器支付、扫码支付,都需要通过异步回调接收支付结果。 本文简介如何获取微信支付通知。 仅需要一个在之前设置好的回调地址的方法里写上如下: 对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能 ......
微信无论是微信内置jsapi支付、h5外部浏览器支付、扫码支付,都需要通过异步回调接收支付结果。
本文简介如何获取微信支付通知。
仅需要一个在之前设置好的回调地址的方法里写上如下:
//处理微信支付回调 public function notify(){ $testxml = file_get_contents("php://input"); $jsonxml = json_encode(simplexml_load_string($testxml, 'simplexmlelement', libxml_nocdata)); $result = json_decode($jsonxml, true);//转成数组, if($result){ //如果成功返回了 $out_trade_no = $result['out_trade_no']; if($result['return_code'] == 'success' && $result['result_code'] == 'success'){ //执行业务逻辑 //查询创建订单表 where("out_trade_no='".$out_trade_no."' and status=1") status为1表示待支付状态 1 待支付 //查询出来有该订单 就改变支付状态 status=2 2表示支付成功 } } }
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,
微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。
(通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
结束微信重新通知用代码:echo 'success';
附上:
微信支付返回的xml转化为json格式如下:
{ "appid": "12345", "attach": "pay", "bank_type": "cft", "cash_fee": "1", "fee_type": "cny", "is_subscribe": "y", "mch_id": "12345", "nonce_str": "dzyfpadyrpf5rwhv", "openid": "onhwf1hiutuyskcsrv21a6mctt5q", "out_trade_no": "sh201808222055598628", "result_code": "success", "return_code": "success", "sign": "5a019f52bef1c3a98ae0f1ff29d01574", "time_end": "20180822205606", "total_fee": "1", "trade_type": "mweb", "transaction_id": "4200000171201808221550954201" }
//详细流程如下
public function wycz(){//我要充值 if(session('uid') ==null || session('uid') == "" || session('uid') == false){ //没有登录 跳转到登录页 $this->redirect('/login/login');exit; }else { //接受参数 if($_post){ $total_fee = trim(i("post.fotal_fee")); if(!empty($total_fee)){ if($total_fee<=0){ //提示输入正整数金额 $arr['code'] = "301"; $arr['msg'] = "输入正整数"; echo json_encode($arr);exit(); }else{ session("total_fee",$total_fee); $arr['code'] = "200"; $arr['msg'] = "确认充值吗?"; echo json_encode($arr);exit(); } }else{ //提示输入正整数金额 $arr['code'] = "302"; $arr['msg'] = "输入充值金额"; echo json_encode($arr);exit(); } } $this->display(); } } //充值确认页面 public function confirmpay(){ if(session('uid') ==null || session('uid') == "" || session('uid') == false){ //没有登录 跳转到登录页 $this->redirect('/login/login');exit; }else { $result = $this->wappay(); $this->assign('jsapiparameters',$result['jsapiparameters']); $this->assign('editaddress', $result['editaddress']); $this->display(); } } //操作充值 public function wappay($total_fee) { /** * * example目录下为简单的支付样例,仅能用于搭建快速体验微信支付使用 * 样例的作用仅限于指导如何使用sdk,在安全上面仅做了简单处理, 复制使用样例代码时请慎重 * 请勿直接直接使用样例对外提供服务 * **/ vendor('wxpaysdk.lib.wxpay#api'); vendor('wxpaysdk.example.wxpay#jsapipay'); // vendor('wxpaysdk.example.wxpay#config'); //①、获取用户openid $tools = new \jsapipay(); $openid = $tools->getopenid(); $total_fee = session("total_fee")*100; //$total_fee = session("total_fee"); //②、统一下单 $input = new \wxpayunifiedorder(); $input->setbody("vip充值"); $input->setattach("vip充值"); $input->setout_trade_no("klkq".date("ymdhis")); $input->settotal_fee($total_fee); $input->settime_start(date("ymdhis")); $input->settime_expire(date("ymdhis", time() + 600)); $input->setgoods_tag("vip充值"); //$input->setnotify_url("http://paysdk.weixin.qq.com/notify.php"); $input->setnotify_url("http://wap.yuming.com/member/notify"); $input->settrade_type("jsapi"); $input->setopenid($openid); $config = new \wxpayconfig(); $order = \wxpayapi::unifiedorder($config, $input); //echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>'; //printf_info($order); $jsapiparameters = $tools->getjsapiparameters($order); //获取共享收货地址js函数参数 $editaddress = $tools->geteditaddressparameters(); $data['jsapiparameters'] = $jsapiparameters; $data['editaddress'] = $editaddress; //写入订单表对应数据 $arr = array( 'w_mid'=>session('uid'), 'w_openid'=>$openid, 'w_title'=>'vip充值', 'w_time_create'=>date("ymdhis"), 'w_times_create'=>date("y-m-d h:i:s"), 'w_out_trade_no'=>"klkq".date("ymdhis"), ); m('wxpay_order')->add($arr); return $data; } //处理微信支付回调 public function notify(){ $testxml = file_get_contents("php://input"); $jsonxml = json_encode(simplexml_load_string($testxml,'simplexmlelement',libxml_nocdata)); $result = json_decode($jsonxml,true); if($result){ $out_trade_no = $result['out_trade_no']; if($result['return_code'] == 'success' && $result['result_code'] =='success'){ //先判断订单状态是否已经改变 $orderdata = m("wxpay_order")->where("w_out_trade_no='".$result['out_trade_no']."' and w_status=1")->find(); if(!empty($orderdata)){ //支付成功改变支付状态 $arr = array( 'w_id'=>$orderdata['w_id'], 'w_openid'=>$result['openid'], 'w_transaction_id'=>$result['transaction_id'], 'w_time_end'=>$result['time_end'], 'w_times_end'=>$result['time_end'], 'w_total_fee'=>$result['total_fee']/100, 'w_status'=>2,//支付成功 1 待支付 2支付成功 3 支付失败 ); m('wxpay_order')->save($arr); //操作积分 $uid = $orderdata['w_mid']; //对该人增加$result['total_fee']积分 $zz_grade = m('grade'); $g_integral = $zz_grade->where("g_mid=".$uid)->getfield('g_integral'); $zz_grade->g_integral = $g_integral + intval($result['total_fee']/100); //更新积分 $giddd = $zz_grade->where("g_mid=".$uid)->save(); //操作积分日志表 $zz_grade_log = m('grade_log'); $zz_grade_log->g_gcontent = '充值'.intval($result['total_fee']/100).'积分'; $zz_grade_log->g_mid = $uid;//邀请者会员id $zz_grade_log->g_gnum = intval($result['total_fee']/100);//充值积分 $zz_grade_log->g_gdate = date('y-m-d');//注册日期 $zz_grade_log->g_gtime = date('y-m-d h:i:s');//注册时间 //写入数据库 $liddd = $zz_grade_log->add(); } } } }