微信支付回调处理(结合队列实现)

下面的代码是上面的支付发起的中配置的让微信通知到的回调地址:
<?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();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值