微信无论是微信内置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(); } } } }