下面的代码是上面的支付发起的中配置的让微信通知到的回调地址: <?php require_once RPC_DIR . '/pay/weixin/WxPayPubHelper/WxPayPubHelper.php'; //引入微信sdk类 include_once RPC_DIR . '/tool/Aliyun/MNS/mqs.class.php'; //引入队列类 class pay extends wx { //回调微信油站加油结果 function pay_gas_station_result() { libxml_disable_entity_loader(true); //安全控制 $log = ''; $xml = $GLOBALS['HTTP_RAW_POST_DATA']; //接收服务器返回的信息 $return = $this->xmlToArray($xml); //转化成数组 $merchant = $this->GetMerchantWxPayConf($return); //获取使用了哪种支付!!然后替换相应的配置 $config_array = array( "appid" => $return['appid'], "appsecret" => $merchant['appsecret'], "mchid" => $return['mch_id'], "mchkey" => $merchant['mchkey'], "curltimeout" => 30, "sslsert_path" => '', "sslkey_path" => ''); $notify = new Notify_pub($config_array); //支付通知接口 $notify->saveData($xml); //各种微信服务器返回的数据的判断!! if ($notify->checkSign() == FALSE) { $notify->setReturnParameter("return_code", "FAIL");//返回状态码 $notify->setReturnParameter("return_msg", "签名失败");//返回信息 } else { $notify->setReturnParameter("return_code", "SUCCESS");//设置返回码 } if ($notify->checkSign() == TRUE) { if ($notify->data["return_code"] == "FAIL") { //通信出错 $log = '交易号' . $return['out_trade_no'] . '出现异常'; } elseif ($notify->data["result_code"] == "FAIL") { $log = '交易号' . $return['out_trade_no'] . '业务错误'; } elseif ($notify->data["result_code"] == "SUCCESS") { $out_trade_no = $return['out_trade_no']; $pay_money = $return['total_fee'] / 100; $order = $this->DB('slave1')->query("SELECT O.*,S.point_method,S.name,T.oil_name,V.level_name FROM " . TABLE_ORDER_WXGZH_TEMP . " AS O " . " LEFT JOIN " . TABLE_STORE . " AS S ON O.store_id=S.id" . " LEFT JOIN " . TABLE_SYS_OIL_TYPE . " AS T ON O.oil_type_id=T.id" . " LEFT JOIN " . TABLE_VIP_LEVEL . " AS V ON O.user_level_id=V.vip_level" . " WHERE O.orderid='" . $out_trade_no . "'")->fetch(\PDO::FETCH_ASSOC); //假如订单已经支付了,直接停止回调 if (!empty($order) && $order['order_status'] == 3) { $ok = $this->DB('slave1')->get(TABLE_ORDER_WXGZH, ["id"], ["orderid" => $out_trade_no]); if (!empty($ok)) { $this->AliyunMnsSent($ok['id'] . ',1,' . $return['is_subscribe']);//打印小票,发模板等处理 } die($notify->returnXml()); //告知微信服务器我系统已经成功接收到了信息,让其停止发送 } if (!empty($order) && $order['order_status'] == 1) { $this->DB('master')->pdo->beginTransaction(); $coupon_money = $err_status = 0; //是否使用了优惠券 // if (false) { if ($order['coupon_money'] > 0 && (!empty($order['coupon_id']))) { //获取优惠券信息 $coupon_data = $this->DB('slave1')->get(TABLE_COUPON, '*', [ 'AND' => [ 'id' => $order['coupon_id'], 'use_status' => 0 ] ]); if (empty($coupon_data)) { $err_status = 1; $this->AddLogAlert('一键支付优惠券使用异常', '优惠券(' . $order['coupon_id'] . ')找不到或者已经被使用'); } $coupon_money = $order['coupon_money']; $order['need_payment'] = $order['money'] - $coupon_money; //核销开始 $this->DB('master')->update(TABLE_COUPON, [ 'use_status' => 1, 'use_time' => date("Y-m-d H:i:s"), 'orderid' => $order['orderid'] ], [ 'id' => $order['coupon_id'] ]); } //计算会员获取的积分 $point = $this->GetPointMethed($order['point_method'], array("oil_type_id" => $order['oil_type_id'], "oil_lit" => $order['oil_lit'], "fee" => $pay_money)); $this->WX_AddPointLog(3, $point, $order['userid'], $return['out_trade_no'], $order['wx_id']); $this->DB('master')->insert(TABLE_ORDER_WXGZH, [ 'orderid' => $order['orderid'], 'order_time' => $order['order_time'], 'pay_time' => date("Y-m-d H:i:s", strtotime($return['time_end'])), 'other_money' => $order['other_money'], 'oil_money' => $order['oil_money'], 'pay_money' => $pay_money, 'order_money' => $order['money'], 'order_status' => 3, 'openid' => $order['openid'], 'pay_openid' => $return['openid'], 'pay_type' => 1, 'err_status' => $err_status, 'store_id' => $order['store_id'], 'tax_number' => $order['tax_number'], 'fapiao' => $order['fapiao'], 'gun_id' => $order['gun_id'], 'oil_type_id' => $order['oil_type_id'], 'coupon_id' => $order['coupon_id'], 'coupon_money' => $coupon_money, 'discount' => $order['discount'], 'discount_money' => $order['discount_money'], 'userid' => $order['userid'], 'wx_id' => $order['wx_id'], 'transaction_id' => $return['transaction_id'], 'pay_method' => 1, 'oil_lit' => $order['oil_lit'], 'point' => $point, 'use_oil_price' => $order['use_oil_price'], 'merchant_discount' => $order['merchant_discount'], 'merchant_oil_price' => $order['merchant_oil_price'], 'who_discount' => $order['who_discount'], 'poundage'=>round($pay_money * 0.003) //财付通规定了支付税率千分之三 ]); $id = $this->DB('master')->id(); if ($id) { $this->DB('master')->update(TABLE_ORDER_WXGZH_TEMP, [ 'order_status' => 3, 'weixin_payment' => $pay_money, 'need_payment' => $order['need_payment'], 'transaction_id' => $return['transaction_id'], 'pay_time' => date("Y-m-d H:i:s", strtotime($return['time_end'])) ], [ 'id' => $order['id'] ]); $this->DB('master')->pdo->commit(); $mns_result = $this->AliyunMnsSent($id . ',1,' . $return['is_subscribe']); if ($mns_result) { die($notify->returnXml()); //再通知一遍微信服务器系统接收到信息了 } else { $log .= '发送轮询失败'; } } else { $log .= '交易号' . $return['out_trade_no'] . '更新失败提交回滚!'; $this->DB('master')->pdo->rollBack(); } } else { //修复订单号变化不出票找不到订单的问题 $this->DB('master')->update(TABLE_ORDER_WXGZH_TEMP, ["orderid"=>$return['out_trade_no']], ["id"=>$return['attach'],"order_status"=>1]); $log .= '交易号' . $return['out_trade_no'] . '结果为空,数据为:' . addslashes(json_encode($return)); } } $this->AddLogAlert("一键支付结果回调异常", $log); } } /** * 阿里云支付后二次回调,作用消息发送,小票打印数据! */ private function AliyunMnsSent($str = '') { $sentClass = new Message(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ALIYUN_ID, ALIYUN_URL); //只要这里的参考不同,就可以实现兼容各个端的打印和模板通知等处理 $_message = [ 'port' => 'weixin', 'model' => 'wx_pay_order_mns_notify', 'data' => $str ]; $sent = $sentClass->SendMessage('oilpaynotifymns', json_encode($_message)); //data参数传输中间的1代表是微信公众号端 if ($sent['state'] == "ok") { return true; } else { return false; } } //转化xml成数组 private function xmlToArray($xml) { //将XML转为array $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data; } //获取配置信息,传入本次支付的 private function GetMerchantWxPayConf($array = array()) { $merchant = $this->GetMerchant(); if (isset($array['mch_id'])) { if ($array['mch_id'] == $merchant['wxmch_id']) { //本商户收款 return array("appsecret" => $merchant['appsecret'], "mchkey" => $merchant['wxmchkey']); } elseif ($array['mch_id'] == $merchant['wxfws_mch_id']) { //子商户收款 return array("appsecret" => $merchant['appsecret'], "mchkey" => $merchant['wxfws_mchkey']); } else { $this->AddLogAlert('微信支付回调配置信息错误', addslashes(json_encode($array))); } } return array(); } }
微信支付回调处理(结合队列实现)
最新推荐文章于 2024-08-21 10:29:02 发布