AdapayNotifyController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\common\controllers;
  8. use app\models\ReOrder;
  9. use app\modules\common\models\NotifyForm;
  10. use app\utils\OrderNo;
  11. use app\utils\Wechat\Wechat;
  12. use app\utils\Wechat\WechatProfit;
  13. use app\utils\Wechat\WechatShare;
  14. use EasyWeChat\Kernel\Exceptions\Exception;
  15. use EasyWeChat\Kernel\BaseClient;
  16. use yii\web\Controller;
  17. use app\utils\IotCloudHelper;
  18. use app\models\Store;
  19. use app\models\OrderUnion;
  20. use app\models\Order;
  21. use app\models\WechatConfig;
  22. use app\utils\Adapay\Adapay;
  23. use app\utils\Adapay\AdapayV2;
  24. /**
  25. * 微信回调类
  26. * Class WechatNotifyController
  27. * @package app\modules\common\controllers
  28. */
  29. class AdapayNotifyController extends Controller
  30. {
  31. public static $plugins = [
  32. 'SC' => '\app\plugins\scanCodePay\controllers\CallbackController::execute'
  33. ];
  34. public function actionTest() {
  35. $order = Order::findOne(['order_no' => 'ML20230522140611637863']);
  36. \app\utils\Adapay\Adapay::paymentConfirmQueryList($order);die;
  37. $out_trade_no = input_params('out_trade_no');
  38. $data = [
  39. 'order_no' => $out_trade_no,
  40. ];
  41. $this->notify($data, 317);
  42. }
  43. public function actionH5() {
  44. $this->redirect(\Yii::$app->request->hostInfo . '/h5/static/h5/webview.html');
  45. // $this->redirect('http://192.168.0.159:8080/h5/static/h5/webview.html');
  46. }
  47. /**
  48. * 入口文件
  49. * @throws \Exception
  50. */
  51. public function actionIndex() {
  52. $store_id = get_params('store_id');
  53. \Yii::error(['ADAPAY NOTIFY INDEX <==========> ', \Yii::$app->request->getRawBody()]);
  54. $post = all_params();
  55. // $post = [
  56. // 'created_time' => '1684142110',
  57. // 'data' => "{\"app_id\":\"app_9aa823b9-d959-4307-a931-23ba8780f9aa\",\"created_time\":\"20230515171510\",\"description\":\"\",\"end_time\":\"20230515171620\",\"expend\":{\"bank_type\":\"CMB\",\"open_id\":\"o8jhotynrwBGRepP0IKKJ-5zuykY\",\"sub_open_id\":\"oNiCd4gweWf2Irg2K5WfTFWFGEts\"},\"fee_amt\":\"0.00\",\"id\":\"002212023051517151010504112702133735424\",\"order_no\":\"ML20230515171505384756\",\"out_trans_id\":\"4200001875202305153971501223\",\"party_order_id\":\"02212305156211026504784\",\"pay_amt\":\"0.01\",\"pay_channel\":\"wx_lite\",\"real_amt\":\"0.01\",\"share_eq\":\"Y\",\"status\":\"succeeded\",\"wx_user_id\":\"\"}",
  58. // 'prod_mode' => 'true',
  59. // 'sign' => 'ZaWpAQfqOzgRE6OUYDY/pt8jQRnMJ1K1YQkCukLRVlS8N9MycpP022pbaTvWovJY3a+do4lyWsFaKS16CfXcdAj1/4zHTh4YDO7PLYMf3c86cna/VrhuD9aIedPVUe0tkdarODPS7M3W3lt90iPRJ8LsuvLQjrD+go2hXr6NKak=',
  60. // 'id' => '002210504112997909880832',
  61. // 'type' => 'payment.succeeded',
  62. // 'app_id' => 'app_9aa823b9-d959-4307-a931-23ba8780f9aa',
  63. // 'object' => 'payment',
  64. //];
  65. if(isset($post['resp_code']) && $post['resp_code'] == 0){
  66. $this->notify($post, $store_id, 1);
  67. die;
  68. }
  69. if(empty($post['data'])){
  70. throw new \Exception('data参数为空');
  71. }
  72. var_dump($post['data']);
  73. $data = json_decode($post['data'], true);
  74. if($data['status'] !== 'succeeded'){
  75. return;
  76. }
  77. $orderNoHead = substr($data['order_no'], 0, 2);
  78. $this->notify($data, $store_id);
  79. }
  80. /**
  81. * @param $data
  82. * @param $store_id
  83. * 回调逻辑处理
  84. */
  85. private function notify($data, $store_id, $isV2 = false) {
  86. \Yii::error(['ADAPAY NOTIFY INDEX <==========> ', $store_id, $data]);
  87. try {
  88. $notify = new NotifyForm();
  89. if($isV2){
  90. // $data = [
  91. // 'store_id' => '84',
  92. // 'resp_desc' => '交易成功[000]',
  93. // 'resp_code' => '00000000',
  94. // 'sign' => 'p+Ys1lpCaEKhDON/+Bxj9fvLPAd/Xi54JmbQFs63yiT9jTM9SDV4TA5I6wssEGLT5WYdJFSj/yd5qz8b5SEIt6kw5bAeGpvcpY7YUb2Ffq/XY/1+HnXf+xESD9bUUgL7tNGom0d8MoLzsAEzS9lBiazJFuV7ueBQtKd2RpWSTiSt42JNQ2iMGvAsjGXc+oOfIqKu483LZVCuv/V7Ce5qkq8qEzQ1b/Vt1v01GYQugUdCvkqKagUnxq8/rTpjcOzUPWtGYVUeH3XBdeozZdv20TtJ/6dAnQBMVw6Ny1SfTLuZ5S+6gI4QINdkJSPXx7AmgcuTZPkszrGlN1lifEAcOA==',
  95. // 'resp_data' => '{"acct_date":"20230922","acct_id":"F01813225","acct_split_bunch":{"acct_infos":[{"acct_id":"F01813225","div_amt":"0.01","huifu_id":"6666000139854172"}],"fee_acct_id":"F01813225","fee_amt":"0.00","fee_huifu_id":"6666000139854172"},"acct_stat":"S","avoid_sms_flag":"","bagent_id":"6666000131001671","bagent_name":"招商银行","bank_code":"00","bank_desc":"成功[0000000]","bank_extend_param":{"bank_id":"03080000","pyer_acct_id":"622588******2233","pyer_acct_nm":"刘晓波"},"bank_id":"03080000","bank_message":"成功[0000000]","bank_name":"招商银行","base_acct_id":"F01813225","channel_type":"U","combinedpay_data":[],"combinedpay_fee_amt":"0.00","debit_flag":"D","debit_type":"0","delay_acct_flag":"N","div_flag":"0","end_time":"20230922171457","fee_amount":"0.00","fee_amt":"0.00","fee_flag":2,"fee_rec_type":"1","fee_type":"INNER","gate_id":"SA","hf_seq_id":"00470topo1A230922171302P644ac136a1f00000","huifu_id":"6666000139854172","is_delay_acct":"0","is_div":"0","mer_name":"瑞峰奇会科技(重庆)有限公司","mer_ord_id":"20230922ML20230922170657200680","mypaytsf_discount":"0.00","need_big_object":true,"notify_type":2,"order_type":"P","org_auth_no":"","org_huifu_seq_id":"","org_trans_date":"","pay_card_id":"622588******2233","pay_scene":"","product_id":"EDUARK","req_date":"20230922","req_seq_id":"ML20230922170657200680","resp_code":"00000000","resp_desc":"交易成功","risk_check_data":{"ip_addr":"8.140.144.252"},"risk_check_info":{"client_ip":"8.140.144.252"},"settlement_amt":"0.01","sub_resp_code":"00000000","sub_resp_desc":"交易成功","sys_id":"6666000139854172","trans_amt":"0.01","trans_date":"20230922","trans_order_info":{"acct_finish_time":1695374097000,"acct_id":"F01813225","acct_stat":"S","acct_trans_date":"20230922","agent_id":"6666000131001671","bagent_id":"6666000131001671","bagent_name":"蒋永春","bank_id":"03080000","bank_name":"招商银行","bank_resp_code":"00","bank_resp_desc":"成功[0000000]","card_bank_id":"03080000","card_channel_type":"","card_sign":"","cash_req_date":"20230922","cash_resp_code":"00000001","cash_resp_desc":"部分成功","cashier_version":"V2","channel_finish_time":1695374097000,"channel_stat":"S","channel_type":"U","check_cash_flag":"I","close_trans_stat":"","create_time":1695374015000,"creator":"","credit_fee_amt":0.00,"credit_type":"","db_unit":"1","dc_type":"D","debit_fee_amt":0.00,"double_limit_amt":0.00,"fee_acct_id":"F01813225","fee_amt":0.00,"fee_flag":2,"fee_formula":"","fee_huifu_id":"6666000139854172","fee_real_acct_id":"F01813225","fee_real_cust_id":"6666000139854172","fee_rec_type":1,"fee_source":"\'SERVER\'","fee_split_type":"","gate_id":"SA","goods_desc":"Apple/苹果 AirPods (第三","hf_seq_id":"00470topo1A230922171302P644ac136a1f00000","huifu_id":"6666000139854172","icc_data":"","id":3922522470,"is_acct_div":0,"is_acct_div_param":0,"is_delay_acct":0,"is_deleted":0,"is_route":"","iss_inst_id":"","maze_bg_date":"","maze_bg_seq_id":"","maze_pnr_dev_id":"","maze_resp_code":"","maze_resp_desc":"","mcc":"","mer_name":"瑞峰奇会科技(重庆)有限公司","mer_ord_id":"20230922ML20230922170657200680","modifier":"","modify_time":1695374097000,"mypaytsf_discount":0.00,"ord_amt":0.01,"ord_id":"20230922171335topo1_Ait527545501","org_acct_id":"F01813225","org_auth_no":"","org_huifu_seq_id":"","org_trans_date":"","pa_mer_id":"SSP001","pay_card_id":"622588******2233","pay_card_id_enc":"#011gGHN02tS7uIxBegcfZneJg==","pay_channel":"","pay_scene":"","pay_type":"QUICK_PAY","product_id":"EDUARK","real_acct_id":"F01813225","real_cust_id":"6666000139854172","real_gate_id":"SA","real_pay_type":"3003","ref_amt":0.01,"ref_cnt":0,"ref_fee_amt":0.00,"region_id":"topo1_A","req_date":"20230922","req_seq_id":"ML20230922170657200680","settle_amt":0.01,"settle_trans_stat":"","sn_code":"","subsidy_amt":0.00,"subsidy_ref_amt":0.00,"sys_id":"6666000139854172","sys_trace_audit_num":"","term_div_coupon_type":3,"time_expire":"20230923051302","trans_date":"20230922","trans_finish_time":1695374097000,"trans_notify_url":"virgo://https://chidian.cyyvip.com/index.php/adapay/notify/84","trans_stat":"S","trans_type":"3004","un_scene_info":"","unconfirm_amt":0.01,"unconfirm_fee_amt":0.00,"version":4},"trans_stat":"S","trans_time":"171335","trans_type":"QUICK_PAY","ts_encash_detail":[],"user_huifu_id":"6666000140145254"}',
  96. // ];
  97. $resp_data = json_decode($data['resp_data'], true);
  98. if($resp_data['trans_stat'] != 'S'){
  99. return $resp_data;
  100. }
  101. $verifySign = AdapayV2::verifySign($store_id, $data['sign'], $data['resp_data']);
  102. if($verifySign['code'] != 0){
  103. return $verifySign;
  104. }
  105. $notify = new NotifyForm();
  106. if(strstr($resp_data['trans_type'], 'QUICK_PAY')){
  107. $notify->pay_type = Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY;
  108. }
  109. if(strstr($resp_data['trans_type'], 'T_JSAPI')){
  110. $notify->pay_type = Order::PAY_TYPE_HUIFU_V2_JSPAY_WX;
  111. }
  112. if (isset($resp_data['trans_amt'])) {
  113. $store = Store::findOne($store_id);
  114. if ($store && !empty($store->device_name)) {
  115. $total_fee = $resp_data['trans_amt'];
  116. IotCloudHelper::sendMessage($store_id, '{"cmd":"voice","msg":"' . '收款'.$total_fee.'元","msgid":"'.$store_id. time() .'"}');
  117. }
  118. }
  119. $orderNoHead = substr($resp_data['req_seq_id'], 0, 2);
  120. $message = array_merge([
  121. 'out_trade_no' => AdapayV2::req_seq_id2order_no($resp_data['req_seq_id']),
  122. 'transaction_id' => '',
  123. 'out_batch_no' => '',
  124. 'batch_status' => '',
  125. 'fail_count' => '',
  126. 'batch_status' => '',
  127. 'batch_status' => '',
  128. ], $resp_data);
  129. }else{
  130. if(strstr($data['pay_channel'], 'wx_')){
  131. $notify->pay_type = Order::PAY_TYPE_ADAPAY_WX;
  132. $channelName = '微信';
  133. }
  134. if(strstr($data['pay_channel'], 'alipay')){
  135. $notify->pay_type = Order::PAY_TYPE_ADAPAY_ALIPAY;
  136. $channelName = '支付宝';
  137. }
  138. if (isset($data['pay_amt'])) {
  139. $store = Store::findOne($store_id);
  140. if ($store && !empty($store->device_name)) {
  141. $total_fee = $data['pay_amt'];
  142. IotCloudHelper::sendMessage($store_id, '{"cmd":"voice","msg":"' . $channelName . '收款'.$total_fee.'元","msgid":"'.$store_id. time() .'"}');
  143. }
  144. }
  145. $orderNoHead = substr($data['order_no'], 0, 2);
  146. $message = array_merge([
  147. 'out_trade_no' => $data['order_no'],
  148. 'transaction_id' => '',
  149. 'out_batch_no' => '',
  150. 'batch_status' => '',
  151. 'fail_count' => '',
  152. 'batch_status' => '',
  153. 'batch_status' => '',
  154. ], $data);
  155. }
  156. switch ($orderNoHead) {
  157. case 'UN':
  158. // 合并支付的订单
  159. $notify->UnionOrderNotify($message);
  160. break;
  161. case 'RG':
  162. // 充值订单
  163. $notify->RechargeOrderNotify($message);
  164. case OrderNo::INTEGRAL_RECHARGE:
  165. // 充值订单
  166. $notify->IntegralRechargeOrderNotify($message);
  167. break;
  168. case 'LV':
  169. // 会员购买
  170. $notify->LevelOrderNotify($message);
  171. break;
  172. case 'ML':
  173. // 商城订单
  174. $notify->MallOrderNotify($message);
  175. break;
  176. case 'SC':
  177. // 当面付订单
  178. $notify->ScanOrderNotify($message);
  179. break;
  180. case 'PC':
  181. // 联盟佣金提现订单
  182. $notify->saasProfitCash($message);
  183. break;
  184. case 'FO':
  185. // 点餐订单
  186. $notify->FoodNotify($message);
  187. break;
  188. case 'SG':
  189. // 店铺充值订单
  190. $notify->StoreReOrderNotify($message);
  191. break;
  192. case 'AM':
  193. //商盟会员卡订单
  194. $notify->BusinessMemberOrderNotify($message);
  195. break;
  196. case 'AL':
  197. //商盟会员购物订单
  198. $notify->BusinessNotify($message);
  199. break;
  200. case 'AD':
  201. // 认养费用
  202. $notify->AdoptCostOrderNotify($message);
  203. break;
  204. case 'AP':
  205. // 采购员订单
  206. $notify->APOrderNotify($message);
  207. break;
  208. case 'PR':
  209. \Yii::error([__METHOD__, 'PROrderNotify', $message]);
  210. // 采购员充值
  211. $notify->PROrderNotify($message);
  212. break;
  213. case 'LP':
  214. // 联盟券充值
  215. $notify->LPorderNotify($message);
  216. break;
  217. case 'PT':
  218. // 充值订单
  219. $notify->ptActivityOrderNotify($message);
  220. break;
  221. default:
  222. break;
  223. }
  224. return true; // 返回处理完成
  225. } catch (\Exception $e) {
  226. \Yii::warning(['ADAPAY NOTIFY EXCEPTION <==========> ', $e->getMessage()]);
  227. \Yii::error($e);
  228. }
  229. }
  230. }