$value) { if (!isset($arr[$value]) || empty($arr[$value])) { return backarr(0, "参数缺少"); } } $orderno = $arr['orderno']; $userid = $arr['user_id']; $m_mo = new MealOrdersModel(); $where = [ 'orderno' => $orderno, 'user_id' => $userid, 'status' => 0, ]; $moinfo = $m_mo->getInfo($where); if (empty($moinfo)) { return backarr(0, "订单信息不存在"); } //$notify_url = "https://app.tjzhxx.cn:11443/index.php/api/pay/paycallback_mealorder"; //支付回调地址] $notify_url = "https://app.tjzhxx.cn:4200/index.php/api/meal/paycallback_mealorder"; $trade_type = $tradetype; $total_fee = bcmul($moinfo['money'], 100); $body = '套餐订购'; $orderinfo = [ 'body' => $body, 'total_fee' => $total_fee, 'notify_url' => $notify_url, 'orderNo' => $moinfo['orderno'], 'trade_type' => $trade_type, ]; $s_wp = new WatchPay(); switch ($tradetype) { case 'APP': $appid = $s_wp->getConfig('appidApp'); break; case 'JSAPI': $appid = $s_wp->getConfig('appid'); break; default: //默认app $appid = $s_wp->getConfig('appidApp'); break; } $orderinfo['appid'] = $appid; $result = $s_wp->crateOrder($orderinfo); if (empty($result)) { return backarr(0, "微信订单创建失败"); } $return_msg = $result['return_msg']; if ('OK' != $return_msg) { return backarr(0, $return_msg); } //下单成功 Db::startTrans(); try { $m_p = new PayorderModel(); $insertData = [ 'type' => 1, 'kind' => 1, 'ref_id' => $moinfo['id'], 'user_id' => $userid, 'payfee' => $total_fee, 'outorderno' => $orderinfo['orderNo'], 'status' => 0, 'cratetime' => date('Y-m-d H:i:s'), ]; $pid = $m_p->insertData($insertData); if (empty($pid)) { throw new \Exception("支付单创建失败"); } $prepayid = $result['prepay_id']; $returnData = [ 'appid' => $result['appid'], //应用id 'partnerid' => $result['mch_id'], //商户号 'prepayid' => $prepayid, //预支付交易会话ID //'package' => 'Sign=WXPay', //订单详情扩展字符串 'noncestr' => $result['nonce_str'], //随机字符串 'timestamp' => time() . "", //'sign' => '', //签名 ]; switch ($tradetype) { case 'APP': $returnData['package'] = 'Sign=WXPay'; break; case 'JSAPI': $returnData['package'] = "prepay_id=" . $prepayid; break; default: //默认app $returnData['package'] = 'Sign=WXPay'; break; } $sign = $s_wp->getsign($returnData); $returnData['sign'] = $sign; $pupdateData = [ 'prepay_id' => $result['prepay_id'], ]; $row = $m_p->updateinfo(['id' => $pid], $pupdateData); if (empty($row)) { Log::error("支付单修改失败"); } $returnData['orderid'] = $moinfo['id']; Db::commit(); return backarr(1, "订单创建成功", $returnData); } catch (\Exception $e) { Db::rollback(); $msg = $e->getMessage(); //var_dump($msg, $e->getTraceAsString()); return backarr(0, $msg); } } /** * 套餐订购单回调 * * @return void * @author wj * @date 2022-12-02 */ public function paycallback_mealorder($arr) { $reurnData = [ "return_code" => "SUCCESS", "return_msg" => "OK", ]; Db::startTrans(); try { $orderstatus = 2; //2支付失败 1支付成功 $ispay = 0; //是否已支付 0否 1是 $mostatus = -1; //订购单支付状态 1成功 -1失败 //app 可能返回 trade_state if (isset($arr['trade_state'])) { $paystatus = $arr['trade_state']; } else { $paystatus = $arr['result_code']; } if ("SUCCESS" == $paystatus) { $orderstatus = 1; $ispay = 1; $mostatus = 1; } $orderno = $arr['out_trade_no']; $m_mo = new MealOrdersModel(); $moinfo = $m_mo->getInfo(['orderno' => $orderno]); if (empty($moinfo)) { throw new \Exception("无订单信息"); } if (1 == $moinfo['status']) { throw new \Exception("订购单已支付", 2); } $moid = $moinfo['id']; $m_p = new PayorderModel(); $pinfo = $m_p->getInfo(['ref_id' => $moid, 'kind' => 1, 'type' => 1]); if (empty($pinfo)) { throw new \Exception("无支付单信息"); } if (1 == $pinfo['status']) { throw new \Exception("支付单已支付", 2); } $pid = $pinfo['id']; $time = date('Y-m-d H:i:s'); $moupdateData = [ 'status' => $mostatus, 'paytime' => $time, ]; $row = $m_mo->updateinfo(['id' => $moid], $moupdateData); if (empty($row)) { throw new \Exception("套餐订购单修改失败"); } $pupdateData = [ 'status' => $orderstatus, 'is_pay' => $ispay, 'paytime' => $time, 'is_rect_back' => 1, ]; $row = $m_p->updateinfo(['id' => $pid], $pupdateData); if (empty($row)) { throw new \Exception("套餐订购支付单修改失败"); } Db::commit(); Log::info("commit"); $xml = arrtoxml($reurnData); exit($xml); } catch (\Exception $e) { $code = $e->getCode(); $reurnData['return_msg'] = $e->getMessage(); if (2 == $code) { $reurnData['return_code'] = "SUCCESS"; } else { $reurnData['return_code'] = "FAIL"; } Db::rollback(); Log::info("rollback"); $xml = arrtoxml($reurnData); exit($xml); } } public function paycallback_front_mealorder($arr) { $fillfields = ['status', 'orderno']; foreach ($fillfields as $key => $value) { if (!isset($arr[$value]) || empty($arr[$value])) { return backarr(0, "参数缺少"); } } $status = $arr['status']; $orderno = $arr['orderno']; Db::startTrans(); try { $orderstatus = 2; //2支付失败 1支付成功 $ispay = 0; //是否已支付 0否 1是 $mostatus = -1; //订购单支付状态 1成功 -1失败 if (1 == $status) { $orderstatus = 1; $ispay = 1; $mostatus = 1; } $m_mo = new MealOrdersModel(); $moinfo = $m_mo->getInfo(['orderno' => $orderno]); if (empty($moinfo)) { throw new \Exception("无订单信息"); } if (1 == $moinfo['status']) { throw new \Exception("订购单已支付", 2); } $moid = $moinfo['id']; $m_p = new PayorderModel(); $pinfo = $m_p->getInfo(['ref_id' => $moid, 'kind' => 1, 'type' => 1]); if (empty($pinfo)) { throw new \Exception("无支付单信息"); } if (1 == $pinfo['status']) { throw new \Exception("支付单已支付", 2); } $pid = $pinfo['id']; $time = date('Y-m-d H:i:s'); $moupdateData = [ 'status' => $mostatus, 'paytime' => $time, ]; $row = $m_mo->updateinfo(['id' => $moid], $moupdateData); if (empty($row)) { throw new \Exception("套餐订购单修改失败"); } $pupdateData = [ 'status' => $orderstatus, 'is_pay' => $ispay, 'paytime' => $time, 'is_front_back' => 1, ]; $row = $m_p->updateinfo(['id' => $pid], $pupdateData); if (empty($row)) { throw new \Exception("套餐订购支付单修改失败"); } Db::commit(); Log::info("commit"); return backarr(1, "操作成功", ['moid' => $moid, 'pid' => $pid]); } catch (\Exception $e) { $code = $e->getCode(); $errmsg = $e->getMessage(); Db::rollback(); Log::info("rollback"); if (2 == $code) { return backarr(1, $errmsg); } return backarr(0, $errmsg); } } }