return_success();exit; // $xml = $GLOBALS['HTTP_RAW_POST_DATA']; file_put_contents('./xcxPay.txt', "[_initialize] 方法开始执行\r\n", FILE_APPEND); $xml = file_get_contents('php://input'); file_put_contents('./xcxPay.txt', "[_initialize] 获取到原始XML数据长度: " . strlen($xml) . "\r\n", FILE_APPEND); $extend_content = json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));//转换格式 file_put_contents('./xcxPay.txt', 'xcx_post: ' . $extend_content . "\r\n", FILE_APPEND); file_put_contents('./xcxPay.txt', "[_initialize] XML转换为JSON成功\r\n", FILE_APPEND); $post = json_decode($extend_content, true); file_put_contents('./xcxPay.txt', "[_initialize] JSON解析结果: " . json_encode($post) . "\r\n", FILE_APPEND); if (empty($post['out_trade_no'])) { file_put_contents('./xcxPay.txt', "[_initialize] 错误: out_trade_no为空,请求有误\r\n", FILE_APPEND); $this->return_error('请求有误'); } file_put_contents('./xcxPay.txt', "[_initialize] out_trade_no: " . $post['out_trade_no'] . "\r\n", FILE_APPEND); $PayOrderModel = D('RetailPayOrder'); $payOrder = $PayOrderModel->getFind(array($PayOrderModel::OUT_TRADE_NO => strval($post['out_trade_no']))); file_put_contents('./xcxPay.txt', "[_initialize] 查询支付订单结果: " . json_encode($payOrder) . "\r\n", FILE_APPEND); if (empty($payOrder)) { file_put_contents('./xcxPay.txt', "[_initialize] 错误: 订单不存在\r\n", FILE_APPEND); $this->return_error('订单不存在'); } /* * 首先判断,订单是否已经更新为ok,因为微信会总共发送8次回调确认 * 其次,订单已经为ok的,直接返回SUCCESS * 最后,订单没有为ok的,更新状态为ok,返回SUCCESS */ file_put_contents('./xcxPay.txt', "[_initialize] 检查订单状态: " . $payOrder[$PayOrderModel::ORDER_STATE] . "\r\n", FILE_APPEND); if ($payOrder[$PayOrderModel::ORDER_STATE] == 'SUCCESS') { file_put_contents('./xcxPay.txt', "[_initialize] 订单已经是SUCCESS状态,直接返回成功\r\n", FILE_APPEND); $this->return_success(); } $PaySetModel = D('RetailPaySet'); $paySet = $PaySetModel->getFindMerchantConfig($payOrder[$PayOrderModel::MERCHANT_ID], 3); file_put_contents('./xcxPay.txt', "[_initialize] 获取商户支付配置: " . json_encode($paySet) . "\r\n", FILE_APPEND); $payConfig = $paySet['config']; $postSign = $post['sign']; file_put_contents('./xcxPay.txt', "[_initialize] 微信回调签名: " . $postSign . "\r\n", FILE_APPEND); unset($post['sign']); /* 微信官方提醒: * 商户系统对于支付结果通知的内容一定要做【签名验证】, * 并校验返回的【订单金额是否与商户侧的订单金额】一致, * 防止数据泄漏导致出现"假通知",造成资金损失。 */ file_put_contents('./xcxPay.txt', "[_initialize] 支付类型: " . $payOrder[$PayOrderModel::M_PAY_TYPE] . "\r\n", FILE_APPEND); if ($payOrder[$PayOrderModel::M_PAY_TYPE] == 1) { //普通商户模式 $wx_key = $payConfig[$PaySetModel::XCX_SECRET_KEY]; file_put_contents('./xcxPay.txt', "[_initialize] 使用普通商户模式密钥\r\n", FILE_APPEND); } else { //服务商模式 $SystemConfigModel = D('SystemConfig'); $wx_key = $payConfig['systemConfig'][$SystemConfigModel::WX_KEY]; file_put_contents('./xcxPay.txt', "[_initialize] 使用服务商模式密钥\r\n", FILE_APPEND); } $user_sign = createSign($post, $wx_key); //再次生成签名,与$postSign比较 file_put_contents('./xcxPay.txt', "[_initialize] 本地生成签名: " . $user_sign . "\r\n", FILE_APPEND); file_put_contents('./xcxPay.txt', "[_initialize] 签名验证结果: " . ($postSign == $user_sign ? '通过' : '失败') . "\r\n", FILE_APPEND); file_put_contents('./xcxPay.txt', "[_initialize] return_code: " . $post['return_code'] . ", result_code: " . $post['result_code'] . "\r\n", FILE_APPEND); if ($post['return_code'] == 'SUCCESS' && $post['result_code'] == 'SUCCESS' && $postSign == $user_sign) { //未进行更新订单 file_put_contents('./xcxPay.txt', "[_initialize] 支付成功且签名验证通过,开始更新订单\r\n", FILE_APPEND); define('IsPayToUpdateOrder', 'YES');//存入常量 $updateData = array( $PayOrderModel::ORDER_STATE => 'SUCCESS', $PayOrderModel::EXTEND_CONTENT => json_encode($extend_content), $PayOrderModel::TRADE_DATE => time(), $PayOrderModel::TRADE_NO => $post['transaction_id'], ); file_put_contents('./xcxPay.txt', "[_initialize] 准备更新订单数据: " . json_encode($updateData) . "\r\n", FILE_APPEND); if (!empty($post['promotion_detail']) || $post['coupon_count'] > 0) { file_put_contents('./xcxPay.txt', "[_initialize] 检测到代金券使用,开始处理\r\n", FILE_APPEND); //代金券使用状态修改,微信暂无该文档 if(!empty($post['promotion_detail'])){ file_put_contents('./xcxPay.txt', "[_initialize] 处理promotion_detail代金券\r\n", FILE_APPEND); $promotion_detail = json_decode($post['promotion_detail'], true)['promotion_detail']; if(!empty($promotion_detail) && !empty($promotion_detail[0]['promotion_id'])){ $pay_info = [ 'coupon_count' => 1, 'coupon_id_0' => $promotion_detail[0]['promotion_id'], 'coupon_fee' => $promotion_detail[0]['amount'], 'cash_fee' => $post['cash_fee'] ]; file_put_contents('./xcxPay.txt', "[_initialize] promotion_detail代金券信息: " . json_encode($pay_info) . "\r\n", FILE_APPEND); } }else if($post['coupon_count'] > 0){ file_put_contents('./xcxPay.txt', "[_initialize] 处理coupon_count代金券,数量: " . $post['coupon_count'] . "\r\n", FILE_APPEND); $pay_info = $post; } if(!empty($pay_info)){ file_put_contents('./xcxPay.txt', "[_initialize] 开始代金券验证,参数: " . json_encode($pay_info) . "\r\n", FILE_APPEND); $PayCouponClass = new PayCoupon(); $couponResult = $PayCouponClass->couponVerification_v1(json_encode([ 'pay_info' => $pay_info, 'use_type' => $payOrder['order_type'], 'order_id' => $payOrder['bill_id'] ? $payOrder['bill_id'] : $payOrder['id'], 'store_id' => $payOrder['store_id'], 'use_scene' => 1, 'merchant_id' => $payOrder['merchant_id'], 'coupon_way' => 1 ]));//修改代金券使用状态 file_put_contents('./xcxPay.txt', "[_initialize] 代金券验证结果: " . json_encode($couponResult) . "\r\n", FILE_APPEND); if ($couponResult['status'] == 1) { file_put_contents('./xcxPay.txt', "[_initialize] 代金券验证成功,更新订单金额\r\n", FILE_APPEND); $updateData['trade_amount'] = $couponResult['data']['cash_fee']; $updateData['pay_coupon_id_str'] = $couponResult['data']['pay_coupon_id_str']; $updateData['pay_coupon_fee'] = $couponResult['data']['pay_coupon_fee']; if (!empty($payOrder['bill_id'])) { file_put_contents('./xcxPay.txt', "[_initialize] 存在bill_id,更新订单金额,bill_id: " . $payOrder['bill_id'] . "\r\n", FILE_APPEND); //如果存在订单id修改订单金额 $BillOrderModel = new RetailBillOrderModel(); $BillDiscountModel = new RetailBillDiscountModel(); $BillOrderModel->toSetDec([ 'id' => $payOrder['bill_id'] ], 'all_money', $updateData['pay_coupon_fee']); $BillOrderModel->toSetDec([ 'id' => $payOrder['bill_id'] ], 'amount_received', $updateData['pay_coupon_fee']); $discountInfo = $BillDiscountModel->getFind([ 'bill_id' => $payOrder['bill_id'] ], 'pay_coupon_id_str,pay_coupon_fee'); file_put_contents('./xcxPay.txt', "[_initialize] 查询折扣信息: " . json_encode($discountInfo) . "\r\n", FILE_APPEND); if (empty($discountInfo['pay_coupon_id_str'])) { $dis_pay_coupon_id_str = $updateData['pay_coupon_id_str']; } else { $dis_pay_coupon_id_str = $discountInfo['pay_coupon_id_str'] . ',' . $updateData['pay_coupon_id_str']; } if ($discountInfo['pay_coupon_fee'] > 0) { $dis_pay_coupon_fee = round($discountInfo['pay_coupon_fee'] + $updateData['pay_coupon_fee'], 2); } else { $dis_pay_coupon_fee = $updateData['pay_coupon_fee']; } $BillDiscountModel->updateOrder([ 'bill_id' => $payOrder['bill_id'] ], [ 'pay_coupon_id_str' => $dis_pay_coupon_id_str, 'pay_coupon_fee' => $dis_pay_coupon_fee, ]); file_put_contents('./xcxPay.txt', "[_initialize] 更新折扣信息完成,代金券ID: " . $dis_pay_coupon_id_str . ", 金额: " . $dis_pay_coupon_fee . "\r\n", FILE_APPEND); } $payOrder['pay_coupon_id_str'] = $couponResult['data']['pay_coupon_id_str']; $payOrder['pay_coupon_fee'] = $couponResult['data']['pay_coupon_fee']; } else { file_put_contents('./xcxPay.txt', "[_initialize] 代金券验证失败\r\n", FILE_APPEND); } } else { file_put_contents('./xcxPay.txt', "[_initialize] 无代金券信息需要处理\r\n", FILE_APPEND); } } $PayOrderModel->updateOrder(array($PayOrderModel::ID => $payOrder[$PayOrderModel::ID]), $updateData); //更新pay_order表 file_put_contents('./xcxPay.txt', "[_initialize] 订单更新完成,订单ID: " . $payOrder[$PayOrderModel::ID] . "\r\n", FILE_APPEND); $this::$bill_id = $payOrder[$PayOrderModel::BILL_ID]; $this::$pay_order_id = $payOrder[$PayOrderModel::ID]; $this::$pay_order = $payOrder; file_put_contents('./xcxPay.txt', "[_initialize] 设置静态变量 - bill_id: " . $this::$bill_id . ", pay_order_id: " . $this::$pay_order_id . "\r\n", FILE_APPEND); } else { file_put_contents('./xcxPay.txt', "[_initialize] 支付验证失败或状态异常,直接返回成功\r\n", FILE_APPEND); $this->return_success(); } file_put_contents('./xcxPay.txt', "[_initialize] 方法执行完成\r\n", FILE_APPEND); } /** * 普通下单回调接口 */ public function normal_order_notify_url_v1() { $pay = A('PayApi/Order')->paySuccess($this::$bill_id); // file_put_contents('./xcxPay.txt', 'update_bill: ' . json_encode($pay) . "\r\n", FILE_APPEND); $this->return_success(); } /** * 购买礼品卡回调接口 */ public function gift_notify_url_v1() { A('PayApi/Pay')->gift_continent_pay_v1($this::$pay_order_id); $this->return_success(); } /** * 购买plus会员回调接口 */ public function plus_notify_url_v1() { A('PayApi/Pay')->plus_continent_pay_v1($this::$pay_order_id); $this->return_success(); } /** * 购买plus会员回调接口 */ public function plus_notify_url_v2() { A('PayApi/Pay')->plus_continent_pay_v2($this::$pay_order_id); $this->return_success(); } /** *拼团订单回调 */ public function group_notify_url() { A('PayApi/ActivityOrder')->groupOrderContinentPay($this::$pay_order); $this->return_success(); } /** * 秒杀订单回调 */ public function spike_notify_url() { A('PayApi/ActivityOrder')->spikeOrderContinentPay($this::$pay_order); $this->return_success(); } /** * 预售回调 */ public function advance_notify_url() { A('PayApi/ActivityOrder')->advance_pay_notify($this::$pay_order); $this->return_success(); } /** * 小程序充值回调 */ public function recharge_notify_url() { A('PayApi/Recharge')->updateOrder($this::$pay_order); $this->return_success(); } /** * 购买次卡 */ public function card_notify_url() { A('Api/SubCard')->updataCardOrder($this::$pay_order); $this->return_success(); } /** * 2019-11-12 普通下单回调接口 plus会员时长套餐自定义版 */ public function normal_order_notify_url_v2() { $pay = A('PayApi/Order')->paySuccess_v1($this::$bill_id); file_put_contents('./xcxPay.txt', 'update_bill: ' . json_encode($pay) . "\r\n", FILE_APPEND); $this->return_success(); } private function return_success() { $xml_post = ' SUCCESS OK '; echo $xml_post; exit; } private function return_error($msg) { $xml_post = ' FAIL ' . $msg . ' '; echo $xml_post; exit; } }