JoinpayFastpayOrder.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. <?php
  2. namespace addons\JoinPay\common\models;
  3. use addons\JoinPay\common\enums\AddonsJoinPayEnum;
  4. use addons\Mch\common\models\MchWithdrawLog;
  5. use addons\Store\common\models\StoreWithdrawLog;
  6. use common\components\export\CsvTool;
  7. use common\enums\DownloadEnum;
  8. use common\enums\StatusEnum;
  9. use common\enums\WithdrawWayEnum;
  10. use common\models\common\Download;
  11. use common\models\common\PaidSinglePayLog;
  12. use common\models\common\PaymentTrade;
  13. use common\models\common\PaymentTradeOrder;
  14. use common\models\mall\MallAddons;
  15. use common\models\user\User;
  16. use common\models\user\UserWithdrawLog;
  17. use Yii;
  18. use common\enums\PayTypeEnum;
  19. use common\logic\wechat\WechatMiniProgramLogic;
  20. use common\models\order\Order;
  21. use common\models\order\OrderDetail;
  22. use common\models\order\OrderExpress;
  23. use common\models\user\UserInfo;
  24. use Exception;
  25. /**
  26. * This is the model class for table "{{%addons_joinpay_fastpay_order}}".
  27. *
  28. * @property int $id
  29. * @property int $mall_id 平台id
  30. * @property int $user_id 用户id
  31. * @property string $order_no 订单号,系统生成
  32. * @property float $amount 订单金额
  33. * @property float $pay_fee 订单金额
  34. * @property int $bank_card_id 开通快捷支付银行卡id
  35. * @property string $title 订单title
  36. * @property string $jp_order_no 汇聚平台流水号
  37. * @property int $is_sign 是否签约,1-是,0-否
  38. * @property int $status 状态[-1:删除;0:禁用;1启用]
  39. * @property int $created_at 添加时间戳
  40. * @property int $updated_at 更新时间戳
  41. */
  42. class JoinpayFastpayOrder extends \common\models\base\BaseActiveRecord
  43. {
  44. /**
  45. * {@inheritdoc}
  46. */
  47. public static function tableName()
  48. {
  49. return '{{%addons_joinpay_fastpay_order}}';
  50. }
  51. /**
  52. * {@inheritdoc}
  53. */
  54. public function rules()
  55. {
  56. return [
  57. [['mall_id', 'user_id', 'bank_card_id', 'is_sign', 'status', 'created_at', 'updated_at'], 'integer'],
  58. [['pay_fee'], 'number'],
  59. [['order_no'], 'string', 'max' => 32],
  60. [['title', 'jp_order_no'], 'string', 'max' => 64],
  61. // [['order_no'], 'unique'], // mycat 环境不能使用此规则
  62. ];
  63. }
  64. /**
  65. * {@inheritdoc}
  66. */
  67. public function attributeLabels()
  68. {
  69. return [
  70. 'id' => 'ID',
  71. 'mall_id' => '商城 ID',
  72. 'user_id' => '会员 ID',
  73. 'order_no' => '订单编号',
  74. 'pay_fee' => '订单金额',
  75. 'bank_card_id' => '开通快捷支付银行卡id',
  76. 'title' => '订单title',
  77. 'jp_order_no' => '汇聚平台流水号',
  78. 'is_sign' => '是否签约,1-是,0-否',
  79. 'status' => '状态[-1:删除;0:禁用;1启用]',
  80. 'created_at' => 'Created At',
  81. 'updated_at' => 'Updated At',
  82. ];
  83. }
  84. public static function setData(int $mall_id, array $data)
  85. {
  86. if (empty($data['id'])) {
  87. $model = new self();
  88. $model->loadDefaultValues();
  89. $model->mall_id = $mall_id;
  90. } else {
  91. $model = self::findOne(['mall_id' => $mall_id, 'id' => $data['id'], 'status' => StatusEnum::ENABLED]);
  92. if (empty($model)) throw new \Exception('数据记录异常');
  93. }
  94. foreach ($data as $key => $val) {
  95. $model->$key = $val;
  96. }
  97. if (!$model->save()) {
  98. self::$static_error = '保存数据失败:' . $model->getErrorMessage();
  99. return false;
  100. }
  101. return $model;
  102. }
  103. /**
  104. * 生成开通快捷支付订单
  105. * @param $mall_id
  106. * @param $user_id
  107. * @param $card_id
  108. * @param float $pay_fee
  109. * @return bool
  110. * @throws
  111. */
  112. public static function createOrder($mall_id,$user_id,$card_id,$pay_fee = 0.01,$is_sign=1)
  113. {
  114. $params = [
  115. 'mall_id' => $mall_id,
  116. 'user_id' => $user_id,
  117. 'order_no' => self::createMerchantOrderNo(),
  118. 'pay_fee' => $pay_fee,
  119. 'bank_card_id' => $card_id,
  120. 'title' => $is_sign == 1 ? '签约快捷支付' : '解约快捷支付',
  121. 'is_sign' => $is_sign
  122. ];
  123. $model = self::setData($mall_id, $params);
  124. if (false === $model) {
  125. return false;
  126. }
  127. return $model->id;
  128. }
  129. /**
  130. * 生成订单号
  131. * @return null|string
  132. */
  133. public static function createMerchantOrderNo()
  134. {
  135. $order_no = null;
  136. while (true) {
  137. $order_no = 'FP' . date('YmdHis') . rand(10000, 99999);
  138. $exist = self::find()->where(['order_no' => $order_no])->one();
  139. if (!$exist) {
  140. break;
  141. }
  142. }
  143. return $order_no;
  144. }
  145. //支付记录导出
  146. public static function fieldsList($field = null){
  147. $fields = [
  148. 'pay_id' => '支付ID',
  149. 'user_id' => '用户ID',
  150. 'nickname' => '用户昵称',
  151. 'user_mobile' => '用户手机号',
  152. 'order_no' => '订单编号',
  153. 'pay_trade_no' => '支付订单号',
  154. 'type' => '支付类型',
  155. 'pay_money' => '支付金额',
  156. 'status' => '状态',
  157. 'created_at' => '创建时间',
  158. ];
  159. if ($field === null) return $fields;
  160. $temp = [];
  161. foreach ($field as $val) {
  162. if (isset($fields[$val])) $temp[$val] = $fields[$val];
  163. }
  164. return $temp;
  165. }
  166. //支付记录导出
  167. public static function exportHandle(array $data) {
  168. $download_id = $data['download_id'] ?? 0;
  169. $download = Download::findOne(['id' => $download_id]);
  170. if ($download) {
  171. try {
  172. $params = json_decode($download->params,true);
  173. $filename = $download->name;
  174. $type = $download->type;
  175. //查询开始
  176. $order_no = $params['order_no'];
  177. $start_time = $params['start_time'];
  178. $end_time = $params['end_time'];
  179. $user_id = $params['user_id'];
  180. $user_keyword = $params['user_keyword'];
  181. $out_trade_no = $params['out_trade_no'];
  182. $pay_type = $params['pay_type'];
  183. $pay_records = PaymentTrade::find();
  184. $pay_records->where(['mall_id'=>$params['mall_id']]);
  185. if (empty($pay_type)) {
  186. $pay_records->andwhere(['in','pay_type',[7,8]]);
  187. } else {
  188. if (!in_array($pay_type, [7, 8])) {
  189. //return $this->error('参数错误');
  190. }
  191. $pay_records->andwhere(['=','pay_type',$pay_type]);
  192. }
  193. if (!empty($start_time)) $pay_records->andwhere(['>=', 'created_at', strtotime($start_time . '00:00:00')]);
  194. if (!empty($end_time)) $pay_records->andwhere(['<=', 'created_at', strtotime($end_time . ' 23:59:59')]);
  195. if (!empty($out_trade_no)) $pay_records->andwhere(['like', 'out_trade_no', $out_trade_no]);
  196. if (!empty($user_id)) $pay_records->andwhere(['user_id' => $user_id]);
  197. if (!empty($user_keyword)) {
  198. $users = User::find()
  199. ->select('id,nickname,mobile,avatar_url')
  200. ->where(['or', ['like', 'nickname', $user_keyword], ['like', 'mobile', $user_keyword]])
  201. ->asArray()
  202. ->indexBy('id')
  203. ->all();
  204. $user_ids = array_column($users, 'id');
  205. $pay_records->andwhere(['in','user_id',$user_ids]);
  206. }
  207. $trade_ids = [];
  208. if (!empty($order_no)) {
  209. $payment_order_logs = PaymentTradeOrder::find()
  210. ->select('trade_id,order_no')
  211. ->where(['order_no' => $order_no])
  212. ->asArray()
  213. ->indexBy('trade_id')
  214. ->all();
  215. $trade_ids = array_column($payment_order_logs, 'trade_id');
  216. $pay_records->andwhere(['in','id',$trade_ids]);
  217. }
  218. //查询结束
  219. $fields = $params['fields'];
  220. $fields_arr = self::fieldsList();
  221. $have_select_field_arr = [];
  222. foreach ($fields as $value){
  223. $have_select_field_arr[]=$fields_arr[$value];
  224. }
  225. $csv = new CsvTool();
  226. $csv->filename = $filename;
  227. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  228. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  229. $csv->header = $have_select_field_arr;
  230. // $order_status_list = OrderStatusEnum::getMap();
  231. // $payment_type_list = PayTypeEnum::getMap();
  232. // $shipping_status_list = ShippingStatusEnum::getMap();
  233. foreach ($pay_records->batch(200) as $order_details) {
  234. if (empty($users)) {
  235. $user_ids = [];
  236. foreach($order_details as $key=>$value){
  237. $user_ids[] = $value->user_id;
  238. }
  239. $users = User::find()
  240. ->select('id,nickname,mobile')
  241. ->where(['id' => $user_ids, 'status' => StatusEnum::ENABLED])
  242. ->asArray()
  243. ->indexBy('id')
  244. ->all();
  245. }
  246. if (empty($payment_order_logs)) {
  247. $trade_ids = [];
  248. foreach($order_details as $key=>$value){
  249. $trade_ids[] = $value->id;
  250. }
  251. $payment_order_logs = PaymentTradeOrder::find()
  252. ->select('trade_id,order_no')
  253. ->where(['trade_id' => $trade_ids])
  254. ->asArray()
  255. ->indexBy('trade_id')
  256. ->all();
  257. }
  258. $csv->data = array_map(function($order_detail)use($fields,$users,$payment_order_logs){
  259. $row = [];
  260. foreach ($fields as $field){
  261. // 收货人地址切割
  262. $user = $users[$order_detail['user_id']] ?? [];
  263. $payment_order_log = $payment_order_logs[$order_detail['id']] ?? [];
  264. //var_dump($order_detail);
  265. switch (true){
  266. case (in_array($field,['created_at'])):
  267. $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):'';
  268. break;
  269. case ($field == 'pay_id'):
  270. $row[] = $order_detail['id'] ?:'';
  271. break;
  272. case ($field == 'user_id'):
  273. $row[] = $user['id'] ?:'';
  274. break;
  275. case ($field == 'nickname'):
  276. $row[] = $user['nickname'] ?:'';
  277. break;
  278. case ($field=='user_mobile'):
  279. $row[] = $user['mobile'] ?:'';
  280. break;
  281. case ($field=='order_no'):
  282. $row[] = $payment_order_log['order_no'];
  283. break;
  284. case ($field=='pay_trade_no'):
  285. $row[] = $order_detail['out_trade_no'] ?:'';
  286. break;
  287. case ($field=='type'):
  288. $row[] = $order_detail['pay_type']==8?'聚合支付':'快捷支付';
  289. break;
  290. case ($field == 'pay_money'):
  291. $row[] = $order_detail['pay_fee'] ?:'';
  292. break;
  293. case ($field=='status'):
  294. $row[] = $order_detail['is_pay']==1?'已付款':'未付款';
  295. break;
  296. default:
  297. $row[] = !empty($order_detail[$field])?$order_detail[$field]:'';
  298. }
  299. //var_dump($row);
  300. }
  301. return $row;
  302. },$order_details);
  303. $csv->export();
  304. }
  305. $csv->updateDown($download,$params['mall_id']);
  306. return true;
  307. } catch (\Exception $e) {
  308. $download->status = 3;
  309. $res = $download->save();
  310. // var_dump($e->getMessage());
  311. self::setStaticError($e->getMessage());
  312. return $e->getMessage();
  313. }
  314. }
  315. }
  316. //代付记录导出
  317. public static function fieldsListPay($field = null){
  318. $fields = [
  319. 'pay_id' => '代支付ID',
  320. 'user_id' => '用户ID',
  321. 'nickname' => '用户昵称',
  322. 'user_mobile' => '用户手机号',
  323. 'receive_account' => '收款账号',
  324. 'receive_name' => '收款姓名',
  325. 'account_type_text' => '收款账号类型',
  326. 'merchant_order_no' => '订单号',
  327. 'pay_money' => '金额',
  328. 'status' => '状态',
  329. 'created_at' => '创建时间',
  330. 'updated_at' => '到账时间',
  331. ];
  332. if ($field === null) return $fields;
  333. $temp = [];
  334. foreach ($field as $val) {
  335. if (isset($fields[$val])) $temp[$val] = $fields[$val];
  336. }
  337. return $temp;
  338. }
  339. //代付记录导出
  340. public static function exportHandlePay(array $data) {
  341. $download_id = $data['download_id'] ?? 0;
  342. $download = Download::findOne(['id' => $download_id]);
  343. if ($download) {
  344. try {
  345. $params = json_decode($download->params,true);
  346. $filename = $download->name;
  347. $type = $download->type;
  348. //查询开始
  349. $order_no = $params['order_no'];
  350. $start_time = $params['start_time'];
  351. $end_time = $params['end_time'];
  352. $receive_keyword = $params['receive_keyword'];
  353. $account_type = $params['account_type'];
  354. $pay_records = PaidSinglePayLog::find();
  355. $pay_records->where(['mall_id'=>$params['mall_id']]);
  356. if (!empty($start_time)) $pay_records->andWhere(['>=', 'created_at', strtotime($start_time . '00:00:00')]);
  357. if (!empty($end_time)) $pay_records->andWhere(['<=', 'created_at', strtotime($end_time . ' 23:59:59')]);
  358. if (!empty($order_no)) $pay_records->andWhere(['like', 'merchant_order_no', $order_no]);
  359. if (!empty($receive_keyword)) {
  360. $pay_records->andWhere(['or', ['like', 'receive_name', $receive_keyword], ['like', 'receive_account', $receive_keyword]]);
  361. }
  362. if (!empty($account_type)) $pay_records->andWhere(['account_type' => $account_type]);
  363. $handle_status_map = AddonsJoinPayEnum::getHandleStatusMap();
  364. $account_type_map = AddonsJoinPayEnum::getAccountTypeMap();
  365. //查询结束
  366. $fields = $params['fields'];
  367. $fields_arr = self::fieldsList();
  368. $have_select_field_arr = [];
  369. foreach ($fields as $value){
  370. $have_select_field_arr[]=$fields_arr[$value];
  371. }
  372. $csv = new CsvTool();
  373. $csv->filename = $filename;
  374. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  375. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  376. $csv->header = $have_select_field_arr;
  377. // $order_status_list = OrderStatusEnum::getMap();
  378. // $payment_type_list = PayTypeEnum::getMap();
  379. // $shipping_status_list = ShippingStatusEnum::getMap();
  380. foreach ($pay_records->batch(200) as $order_details) {
  381. $order_nos = [];
  382. $store_withdraw_order_no_arr = [];
  383. $mch_withdraw_order_no_arr = [];
  384. foreach ($order_details['list'] as $item){
  385. switch ($item['source']){
  386. case '2':
  387. $store_withdraw_order_no_arr[]=$item['order_no'];
  388. break;
  389. case '3':
  390. $mch_withdraw_order_no_arr[]=$item['order_no'];
  391. break;
  392. default:
  393. $order_nos[]=$item['order_no'];
  394. }
  395. }
  396. $user_ids = [];
  397. $withdraw_logs = [];
  398. $store_withdraw_logs = [];
  399. if(!empty($order_nos)){
  400. $withdraw_logs = UserWithdrawLog::find()
  401. ->select('order_no,user_id')
  402. ->where(['mall_id' => $params['mall_id'], 'order_no' => $order_nos, 'type' => WithdrawWayEnum::JOINPAY])
  403. ->indexBy('order_no')
  404. ->asArray()
  405. ->all();
  406. $user_ids = array_merge($user_ids,array_column($withdraw_logs, 'user_id'));
  407. }
  408. if(!empty($store_withdraw_order_no_arr)){
  409. if(MallAddons::isInstall($download->mall_id,'Store')){
  410. $store_withdraw_logs = StoreWithdrawLog::lists(['where'=>[['order_no'=>$store_withdraw_order_no_arr]],'index'=>'order_no']);
  411. $user_ids = array_merge($user_ids,array_column($store_withdraw_logs, 'user_id'));
  412. }
  413. }
  414. if(!empty($mch_withdraw_order_no_arr)){
  415. if(MallAddons::isInstall($download->mall_id,'Mch')){
  416. $mch_withdraw_logs = MchWithdrawLog::lists(['where'=>[['order_no'=>$store_withdraw_order_no_arr]],'index'=>'order_no']);
  417. $user_ids = array_merge($user_ids,array_column($mch_withdraw_logs, 'user_id'));
  418. }
  419. }
  420. $users = User::find()
  421. ->select('id,nickname,mobile')
  422. ->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED, 'id' =>$user_ids])
  423. ->indexBy('id')
  424. ->asArray()
  425. ->all();
  426. $handle_status_map = AddonsJoinPayEnum::getHandleStatusMap();
  427. $account_type_map = AddonsJoinPayEnum::getAccountTypeMap();
  428. $csv->data = array_map(function($order_detail)use($fields,$users,$withdraw_logs,$store_withdraw_logs,$mch_withdraw_logs,$handle_status_map,$account_type_map){
  429. $row = [];
  430. //var_dump($order_detail);
  431. foreach ($fields as $field){
  432. // 收货人地址切割
  433. switch ($order_detail['source']){
  434. case '2':
  435. $withdraw_log = $store_withdraw_logs[$order_detail['order_no']] ?? [];
  436. break;
  437. case '3':
  438. $withdraw_log = $mch_withdraw_logs[$order_detail['order_no']] ?? [];
  439. break;
  440. default:
  441. $withdraw_log = $withdraw_logs[$order_detail['order_no']] ?? [];
  442. }
  443. $user_id = $withdraw_log['user_id'] ?? 0;
  444. $user = $users[$user_id] ?? [];
  445. // var_dump($user);
  446. switch (true){
  447. case (in_array($field,['created_at'])):
  448. $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):'';
  449. break;
  450. case ($field == 'pay_id'):
  451. $row[] = $order_detail['id'] ?:'';
  452. break;
  453. case ($field == 'user_id'):
  454. $row[] = $user['id'] ?:'';
  455. break;
  456. case ($field == 'nickname'):
  457. $row[] = $user['nickname'] ?:'';
  458. break;
  459. case ($field=='user_mobile'):
  460. $row[] = $user['mobile'] ?:'';
  461. break;
  462. case ($field=='receive_account'):
  463. $row[] = $order_detail['receive_account'];
  464. break;
  465. case ($field=='receive_name'):
  466. $row[] = $order_detail['receive_name'] ?:'';
  467. break;
  468. case ($field=='account_type_text'):
  469. $row[] = $account_type_map[$order_detail['account_type']] ?:'';
  470. break;
  471. case ($field == 'merchant_order_no'):
  472. $row[] = $order_detail['merchant_order_no'] ?:'';
  473. break;
  474. case ($field == 'pay_money'):
  475. $row[] = floatval($order_detail['amount']) ?:'';
  476. break;
  477. case ($field == 'updated_at'):
  478. $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):'';
  479. break;
  480. case ($field=='status'):
  481. $row[] = $handle_status_map[$order_detail['status']];
  482. break;
  483. default:
  484. $row[] = !empty($order_detail[$field])?$order_detail[$field]:'';
  485. }
  486. //var_dump($row);
  487. }
  488. return $row;
  489. },$order_details);
  490. $csv->export();
  491. }
  492. $csv->updateDown($download,$params['mall_id']);
  493. return true;
  494. } catch (\Exception $e) {
  495. $download->status = 3;
  496. $res = $download->save();
  497. //var_dump($e->getMessage());
  498. self::setStaticError($e->getMessage());
  499. return $e->getMessage();
  500. }
  501. }
  502. }
  503. public static function uploadShippingInfo($order_express_id){
  504. try {
  505. $order_express_model = OrderExpress::findOne(['id'=>$order_express_id]);
  506. if(empty($order_express_model)) throw new \Exception("order_express_id:{$order_express_id},商品订单物流信息不存在");
  507. $order_model = Order::findOne(['id'=>$order_express_model['order_id']]);
  508. if(empty($order_model)) throw new Exception("order_id:".$order_express_model['order_id'].",order_model不存在");
  509. $mall_id = $order_model['mall_id'];
  510. $order_detail_ids = $order_express_model['order_detail_ids'];
  511. $order_detail_list = OrderDetail::lists(['where'=>[['id'=>$order_detail_ids]]]);
  512. if(empty($order_detail_list)) throw new Exception("order_detail_ids:".$order_express_model['order_detail_ids'].",订单详情不存在");
  513. $payment_trade_order_model = PaymentTradeOrder::findOne(['order_no'=>$order_model['order_no'],'is_pay'=>1]);
  514. if(empty($payment_trade_order_model)) throw new Exception("order_no:".$order_model['order_no'].",payment_trade_order_model不存在");
  515. $pay_type = [PayTypeEnum::JOINPAY];
  516. $trade_type = ['WEIXIN_XCX'];
  517. $payment_trade_model = PaymentTrade::findOne(['id'=>$payment_trade_order_model['trade_id']]);
  518. if($payment_trade_model['is_pay_group']){
  519. //组合支付,查询对应的子流水
  520. $payment_trade_model = PaymentTrade::findOne(['parent_trade_id'=>$payment_trade_order_model['trade_id'],'pay_type'=>$pay_type,'trade_type'=>$trade_type]);
  521. }else{
  522. $payment_trade_model = PaymentTrade::findOne(['id'=>$payment_trade_order_model['trade_id'],'pay_type'=>$pay_type,'trade_type'=>$trade_type]);
  523. }
  524. if(empty($payment_trade_model)) throw new Exception("trade_id:".$payment_trade_order_model['trade_id'].",payment_trade_model不存在");
  525. switch ($payment_trade_model['pay_type']){
  526. case PayTypeEnum::JOINPAY:
  527. $pay_type = \addons\JoinPay\common\enums\JoinPayTypeEnum::action(\addons\JoinPay\common\enums\JoinPayTypeEnum::JOINPAY);
  528. $config =\addons\JoinPay\common\global_func\payment\Payment::getConfig($mall_id, $pay_type);
  529. $pay = \Yii::$app->payment->joinpay($config);
  530. $result = $pay->query($order_model['out_trade_no']);
  531. if(empty($result['r6_BankTrxNo'])){
  532. return true;
  533. }
  534. $payment_trade_model['third_trade_no'] = $result['r6_BankTrxNo'];
  535. //微信支付
  536. $delivery_mode = 1;
  537. $order_detail_rows = OrderDetail::lists(['where'=>[['order_id'=>$order_model['id']]]]);
  538. if(count($order_detail_rows)!=count($order_detail_ids)){
  539. $delivery_mode = 2;
  540. }
  541. $user_info_model = UserInfo::findOne(['mall_id'=>$mall_id,'user_id'=>$payment_trade_model['user_id'],'platform'=>'mp-wx','status' => StatusEnum::ENABLED]);
  542. if(empty($user_info_model))throw new Exception("user_id,mp-wx:".$payment_trade_model['user_id'].",user_info_model不存在");
  543. $openid = $user_info_model['openid'];
  544. $item_desc = '';
  545. foreach ($order_detail_list as $item){
  546. $item_desc.=$item['goods_name'].',';
  547. }
  548. $is_all_delivered = false;
  549. if($delivery_mode==2){
  550. $order_detail_id_arr = [];
  551. $order_express_list = OrderExpress::lists(['where'=>[['order_id'=>$order_express_model['order_id']]]]);
  552. foreach ($order_express_list as $val){
  553. $temp = json_decode($val['order_detail_ids'],true);
  554. $order_detail_id_arr = array_merge($order_detail_id_arr,$temp);
  555. }
  556. if(count($order_detail_rows)==count($order_detail_id_arr)){
  557. $is_all_delivered = true;
  558. }
  559. }
  560. $item_desc =trim($item_desc,',');
  561. $params['mall_id'] = $mall_id;
  562. $params['openid'] = $openid;
  563. $params['third_trade_no'] = $payment_trade_model['third_trade_no'];
  564. $params['delivery_mode'] = $delivery_mode;
  565. $params['is_all_delivered'] = $is_all_delivered;
  566. if(!empty($order_express_model['express_no'])){
  567. $logistics_type =1;
  568. $params['tracking_no'] = $order_express_model['express_no'];
  569. $params['express_company'] = $order_express_model['express_name'];
  570. }else{
  571. $logistics_type = 4;
  572. }
  573. $params['logistics_type'] = $logistics_type;
  574. $params['receiver_contact'] = substr_replace($order_model['mobile'], '****', 3, 4);
  575. $params['item_desc'] = mb_substr($item_desc,0,120);
  576. WechatMiniProgramLogic::uploadShippingInfoWechat($params);
  577. break;
  578. }
  579. }catch (\Exception $e){
  580. var_dump('uploadShippingInfo:'.$e->getMessage());
  581. }
  582. }
  583. }