123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- namespace app\api\logic;
- use app\common\server\WatchPay;
- use app\common\model\MealOrdersModel;
- use app\common\model\PayorderModel;
- use think\Db;
- use think\Facade\Log;
- class PayLogic
- {
- //套餐订购支付单创建
- public function createmealorder($arr, $tradetype = "APP")
- {
- $fillfields = ['orderno', 'user_id'];
- foreach ($fillfields as $key => $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"; //支付回调地址
- $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);
- }
- }
- }
|