Pay.php 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789
  1. <?php
  2. namespace app\api\controller\v1;
  3. use app\api\services\AliPayServices;
  4. use app\api\services\ThirdPayServices;
  5. use app\api\services\WxPayServices;
  6. use app\common\model\ShopGoodsModel;
  7. use app\common\model\ShopOrderGoodsModel as OrderGoods;
  8. use app\common\model\ShopOrderModel;
  9. use app\common\model\UserModel;
  10. use app\common\service\PayConfigService;
  11. use app\common\service\PaymentService;
  12. use app\common\service\SystemConfigService;
  13. use app\common\service\UserBankSignService;
  14. use app\common\service\YsBankService;
  15. use app\model\UserDataModel;
  16. use app\model\VipOrderModel;
  17. use app\Request;
  18. use app\services\balancePayServices;
  19. use app\services\OfflinePayServices;
  20. use jobs\VipOrderJob;
  21. use think\Exception;
  22. use think\facade\Db;
  23. use utils\RedisCache;
  24. /**
  25. * 支付处理 by wes
  26. * Class Pay
  27. * @package app\api\controller\v1
  28. */
  29. class Pay
  30. {
  31. /**
  32. * 支付方式配置
  33. * @param Request $request
  34. * @return \think\Response
  35. */
  36. public function payconfig(Request $request)
  37. {
  38. $paySource = $request->post('app_sources', '');
  39. $orderType = $request->post('order_type');
  40. if (empty($orderType)) {
  41. return api_error_return('参数错误');
  42. }
  43. $channelList = PayConfigService::make()->getChannelList($orderType, $paySource);
  44. return api_succ_return(['msg' => '成功', 'data' => ['setting' => array_values($channelList)]]);
  45. }
  46. /**
  47. * 生成支付订单
  48. * @param Request $request
  49. * @return \think\Response
  50. */
  51. public function paymentInfo(Request $request)
  52. {
  53. $post = $request->post();
  54. $curandroid = env('app.CUR_ANDROID_VERSION', '');
  55. $curios = env('app.CUR_IOS_VERSION', '');;
  56. $curAndroidVersion = str_replace('.', '', $curandroid);
  57. $curAndroidVersion = dispRepair($curAndroidVersion, 4, '0', '0');
  58. $curIosVersion = str_replace('.', '', $curios);
  59. $curIosVersion = dispRepair($curIosVersion, 4, '0', '0');
  60. $app_sources = $request->param('app_sources');
  61. $app_version = $request->param('app_version');
  62. $app_version = str_replace('.', '', $app_version);
  63. $app_version = dispRepair($app_version, 4, '0', '0');
  64. if ($app_sources == 'ios') {
  65. if ($curIosVersion > $app_version) {
  66. return api_error_return('app版本号过低,请更新');
  67. }
  68. }
  69. if ($app_sources == 'android') {
  70. if ($curAndroidVersion > $app_version) {
  71. return api_error_return('app版本号过低,请更新');
  72. }
  73. }
  74. if (empty($app_sources) || empty($app_version)) {
  75. if ($curAndroidVersion > $app_version) {
  76. return api_error_return('app版本号过低,请更新');
  77. }
  78. }
  79. // 限制提交调起
  80. $channel = $request->data['channel']; // 支付方式 1 支付宝支付 2 微信支付 3 余额 4 线下
  81. $orderSn = $request->data['order_id'];
  82. $orderType = isset($post['order_type']) ? intval($post['order_type']) : 0;
  83. $cacheKeyLock = "caches:payment:locks:u{$request->uid}_t{$orderType}_{$channel}";
  84. if (RedisCache::get($cacheKeyLock)) {
  85. return api_error_return('您的操作过于频繁,请5秒钟后重试');
  86. }
  87. // 加锁
  88. $result = false;
  89. RedisCache::setnx($cacheKeyLock, 1, rand(2, 3));
  90. try {
  91. // 服务商订单验证
  92. if ($orderType == 6) {
  93. $userInfo = UserModel::where(['id' => $request->uid])->field('id,store_type')->findOrEmpty();
  94. $storeType = isset($userInfo['store_type']) ? $userInfo['store_type'] : 0;
  95. if ($storeType == 1) {
  96. throw new Exception('已是服务商,无需再次开通');
  97. }
  98. }
  99. $channelList = PayConfigService::make()->getChannelList($orderType, $app_sources);
  100. if(empty($channelList)){
  101. throw new Exception('支付渠道暂未开放,请先配置');
  102. }
  103. $channels = $channelList? array_keys($channelList) : [15, 22, 66];
  104. if (!in_array($channel, $channels)) {
  105. throw new Exception('支付类型错误或未开放');
  106. }
  107. $orderType = isset($post['order_type'])? intval($post['order_type']) : 0;
  108. if(!in_array($orderType, [4,6])){
  109. throw new Exception('订单类型参数错误');
  110. }
  111. if ($orderType == 4) {
  112. if (empty($post['order_id'])) {
  113. throw new Exception('参数错误');
  114. }
  115. // 验证订单是否已支付
  116. if (PaymentService::make()->checkPaymentState($request->uid, $orderSn)) {
  117. throw new Exception('订单或已支付');
  118. }
  119. // 订单状态验证
  120. if (!ShopOrderModel::where(['order_sn' => $post['order_id'], 'status' => 0])->value('order_id')) {
  121. throw new Exception('订单不存在或已支付');
  122. }
  123. // 两小时内同一个订单调起未支付数量限制
  124. $limitPayCount = SystemConfigService::make()->getConfigByName('trade_call_pay_limit', 1, 'tradeconfig');
  125. $limitPayCount = $limitPayCount ? $limitPayCount : env('PAYMENT.UNPAY_LIMIT_NUM', 5);
  126. $count = PaymentService::make()->getPaymentCountByState($request->uid, $orderSn, 4, 7, 2);
  127. if ($count >= $limitPayCount) {
  128. throw new Exception("2小时内该笔订单请求支付已超过{$limitPayCount}次,请稍后再试");
  129. }
  130. }
  131. // 支付通道处理
  132. switch ($channel) {
  133. case 1:
  134. // 微信支付
  135. $result = WxPayServices::instance()->userId($request->uid)->data($request->data)->getUnifiedOrder();
  136. break;
  137. case 2:
  138. // 支付宝支付
  139. $result = AliPayServices::instance()->uid($request->uid)->data($request->data)->getUnifiedOrder();
  140. break;
  141. case 3:
  142. // 余额支付
  143. getActionSecury($request->uid, $request->post('security_pass', ''));
  144. if(PaymentService::make()->AccountPayBack($request->uid, $request->post('order_id', ''), 3)){
  145. $result = api_succ_return(['msg' => '余额支付调用成功', 'data' => ['type'=> 'account']]);
  146. }
  147. break;
  148. case 6:
  149. // 绿色积分支付
  150. getActionSecury($request->uid, $request->post('security_pass', ''));
  151. if(PaymentService::make()->AccountPayBack($request->uid, $request->post('order_id', ''), 6)){
  152. $result = api_succ_return(['msg' => '绿色积分支付调用成功', 'data' => ['type'=> 'account']]);
  153. }
  154. break;
  155. case 14:
  156. // 第三方支付 汇付支付支付
  157. {
  158. $pay = new ThirdPayServices();
  159. $result = $pay->getHfPayInfoHF($request->uid, $request->data);
  160. }
  161. break;
  162. case 15:
  163. // 第三方支付 石区长
  164. {
  165. $pay = new ThirdPayServices();
  166. $result = $pay->getPayInfoSQZ($request->uid, $request->data);
  167. }
  168. break;
  169. case 16:
  170. // 第三方支付 支付宝 石区长
  171. {
  172. $pay = new ThirdPayServices();
  173. $result = $pay->getPayInfoSQZAlipay($request->uid, $request->data);
  174. }
  175. break;
  176. case 17:
  177. // 第三方支付 微信 石区长
  178. {
  179. $pay = new ThirdPayServices();
  180. $result = $pay->getPayInfoSQZWechat($request->uid, $request->data);
  181. }
  182. break;
  183. case 18:
  184. // 第三方支付 银联快捷 石区长 首信易
  185. {
  186. $pay = new ThirdPayServices();
  187. $result = $pay->getPayInfoSQZBankkuai($request->uid, $request->data);
  188. }
  189. break;
  190. case 19:
  191. // 第三方支付 usdt充值
  192. {
  193. $pay = new ThirdPayServices();
  194. $result = $pay->getPayInfoUsdt($request->uid, $request->data);
  195. }
  196. break;
  197. case 20:
  198. // 直连银盛 无卡快捷
  199. {
  200. $pay = new ThirdPayServices();
  201. $result = $pay->getPayInfoYSwk($request->uid, $request->data);
  202. }
  203. break;
  204. case 22:
  205. // 支付宝 电科科技支付
  206. {
  207. $pay = new ThirdPayServices();
  208. $result = $pay->getPayInfoDiankeZfb($request->uid, $request->data);
  209. }
  210. break;
  211. case 56:
  212. // 第三方支付 易票联统一支付
  213. {
  214. $pay = new ThirdPayServices();
  215. $result = $pay->getYsfPayInfoTY($request->uid, $request->data);
  216. }
  217. break;
  218. case 66:
  219. // 电科云闪付
  220. {
  221. $pay = new ThirdPayServices();
  222. $result = $pay->getPayInfoDiankeYsf($request->uid, $request->data);
  223. }
  224. break;
  225. }
  226. } catch (Exception $e) {
  227. RedisCache::clear($cacheKeyLock);
  228. RedisCache::set("caches:payment:dkysf:otn_{$orderSn}:fail", ['msg'=>$e->getMessage(),'trace'=>$e->getTrace()], 7200);
  229. return api_error_return($e->getMessage());
  230. }
  231. RedisCache::keyDel("caches:paymentCall:u{$request->uid}_ot{$orderType}*");
  232. return $result? $result : api_error_return('支付请求错误或未开放,请联系客服');
  233. }
  234. /**
  235. * 石学长 银联支付
  236. * @param Request $request
  237. * @return \think\Response
  238. */
  239. public function sylSurePay(Request $request)
  240. {
  241. Db::startTrans();
  242. try {
  243. $third_pay = new ThirdPayServices();
  244. $third_pay->sylSurePay($request->uid, $request->post());
  245. Db::commit();
  246. } catch (\Exception $e) {
  247. Db::rollback();
  248. return api_error_return($e->getMessage());
  249. }
  250. return api_succ_return('支付订单提交成功,稍后请关注订单列表');
  251. }
  252. /**
  253. * 银盛快捷确认支付
  254. * @param Request $request
  255. * @return \think\Response
  256. */
  257. public function zlysSurePay(Request $request)
  258. {
  259. $post = $request->post();
  260. if (empty($post['trade_no']) || empty($post['sms_code'])) {
  261. return api_error_return('参数错误');
  262. }
  263. Db::startTrans();
  264. try {
  265. $ser = new ThirdPayServices();
  266. $res = $ser->kjPayWithCode($post['trade_no'], $post['sms_code']);
  267. Db::commit();
  268. } catch (\Exception $e) {
  269. Db::rollback();
  270. return api_error_return($e->getMessage());
  271. }
  272. return $res;
  273. }
  274. /**
  275. * 直连银盛 支持的银行卡列表
  276. * @param Request $request
  277. * @return \think\Response
  278. * @throws \think\db\exception\DataNotFoundException
  279. * @throws \think\db\exception\DbException
  280. * @throws \think\db\exception\ModelNotFoundException
  281. */
  282. public function zlysBankList(Request $request)
  283. {
  284. try {
  285. $post = $request->post();
  286. $pageSize = isset($post['limit']) ? $post['limit'] : 0;
  287. return api_succ_return(['msg' => '成功', 'data' => YsBankService::make()->getList($post, $pageSize)]);
  288. } catch (\Exception $exception) {
  289. return api_error_return('获取错误:' . $exception->getMessage());
  290. }
  291. }
  292. /**
  293. * 银盛银行卡支付支持的银行通道
  294. * @param Request $request
  295. * @return \think\Response
  296. */
  297. public function zlysBankPayWay(Request $request)
  298. {
  299. return api_succ_return(['msg' => '成功', 'data' => [
  300. ['bank_name' => '工商银行', 'xiane' => '单笔1万、单日1万、单月5万', 'jieji' => '是', 'xinyong' => '是'],
  301. ['bank_name' => '中国银行', 'xiane' => '单笔5万,单日5万', 'jieji' => '否', 'xinyong' => '是'],
  302. ['bank_name' => '建设银行', 'xiane' => '单笔1万、单日1万、单月5万', 'jieji' => '是', 'xinyong' => '是'],
  303. ['bank_name' => '招商银行', 'xiane' => '单笔5万,单日5万', 'jieji' => '否', 'xinyong' => '是'],
  304. ['bank_name' => '光大银行', 'xiane' => '单笔0.5万、单日5万 ', 'jieji' => '是', 'xinyong' => '是'],
  305. ['bank_name' => '民生银行', 'xiane' => '2万/2万', 'jieji' => '是', 'xinyong' => '是'],
  306. ['bank_name' => '浦发银行', 'xiane' => '借单笔/日2万、贷单笔/日1万、月不限', 'jieji' => '是', 'xinyong' => '是'],
  307. ['bank_name' => '平安银行', 'xiane' => '单笔5万、单日5万、月不限', 'jieji' => '是', 'xinyong' => '否'],
  308. ['bank_name' => '广发银行', 'xiane' => '贷记卡(单笔3w,单日3w)、借记卡(单笔2w,单日2w)', 'jieji' => '是', 'xinyong' => '是'],
  309. ['bank_name' => '中信银行', 'xiane' => '单笔5万、日/月不限', 'jieji' => '是', 'xinyong' => '是'],
  310. ['bank_name' => '交通银行', 'xiane' => '单笔2万,单日2万,单月5万', 'jieji' => '否', 'xinyong' => '是'],
  311. ['bank_name' => '渤海银行', 'xiane' => '借单笔3w,单日3w;贷单笔2w,单日2w', 'jieji' => '是', 'xinyong' => '是'],
  312. ['bank_name' => '上海银行', 'xiane' => '借单笔1w单日1万;贷单笔2w,日不限', 'jieji' => '是', 'xinyong' => '是'],
  313. ['bank_name' => '华夏银行', 'xiane' => '日累计2万,月累计60万', 'jieji' => '是', 'xinyong' => '否'],
  314. ['bank_name' => '邮储银行', 'xiane' => '借记卡:无限额,以发卡测为准;贷记卡:单笔2万、单日2万', 'jieji' => '是', 'xinyong' => '是'],
  315. ['bank_name' => '浙商银行', 'xiane' => '单笔2万、单日2万', 'jieji' => '是', 'xinyong' => '是'],
  316. ['bank_name' => '区域银行', 'xiane' => '无', 'jieji' => '是', 'xinyong' => '是']]
  317. ]);
  318. }
  319. /**
  320. * 用户绑定银行卡
  321. * @param Request $request
  322. * @return \think\Response
  323. */
  324. public function userToSignBank(Request $request)
  325. {
  326. Db::startTrans();
  327. try {
  328. $third_pay = new ThirdPayServices();
  329. $sign_url = $third_pay->userBankSign($request->uid, $request->post());
  330. Db::commit();
  331. } catch (\Exception $e) {
  332. Db::rollback();
  333. return api_error_return($e->getMessage());
  334. }
  335. return api_succ_return(['msg' => '成功', 'data' => ['sign_url' => $sign_url]]);
  336. }
  337. /**
  338. * 用户解绑银行卡
  339. * @param Request $request
  340. * @return \think\Response
  341. */
  342. public function userToUnSignBank(Request $request)
  343. {
  344. Db::startTrans();
  345. try {
  346. $third_pay = new ThirdPayServices();
  347. $third_pay->userUnBankSign($request->uid, $request->post());
  348. Db::commit();
  349. } catch (\Exception $e) {
  350. Db::rollback();
  351. return api_error_return($e->getMessage());
  352. }
  353. return api_succ_return('成功');
  354. }
  355. /**
  356. * 用户绑定银行卡签名
  357. * @param Request $request
  358. * @return \think\Response
  359. * @throws \think\db\exception\DataNotFoundException
  360. * @throws \think\db\exception\DbException
  361. * @throws \think\db\exception\ModelNotFoundException
  362. */
  363. public function myBankSignList(Request $request)
  364. {
  365. $list = Db::name('user_bank_sign')->where('uid', $request->uid)
  366. ->where('status', 2)
  367. ->field('id,name,bank_card,phone')
  368. ->withAttr('bank_card', function ($val, $data) {
  369. $len = strlen($val);
  370. return substr($val, 0, 4) . '****' . substr($val, $len - 5, $len - 1);
  371. })->select()->toArray();
  372. return api_succ_return(['msg' => '成功', 'data' => $list]);
  373. }
  374. /**
  375. * 支持的银行卡
  376. * @param Request $request
  377. * @return \think\Response
  378. */
  379. public function ylBindCanSignList(Request $request)
  380. {
  381. return api_succ_return(['msg' => '成功', 'data' => [
  382. 'chuxuka' => ['中国银行', '建设银行', '工商银行', '浦发银行', '光大银行', '华夏银行', '民生银行', '平安银行', '上海银行', '交通银行', '邮政储蓄银行', '中信银行', '浙商银行', '广东省农村信用社', '山西省农村信用社', '内蒙古自治区农村信用社', '吉林农村信用社', '河南省农村信用社', '黄河农村商业银行', '深圳农村商业银行', '天津滨海农村商业银行股份有限公司', '大连农村商业银行', '鄞州银行', '天津农商银行', '辽宁省农村信用社', '湖北农信', '云南省农村信用社联合社', '陕西省农村信用社', '青海省农村信用社联合社', '湖南省农村信用社', '黑龙江省农村信用社', '广西农村信用社', '苏州银行', '四川省农村信用社', '甘肃省农村信用社', '山东省农村信用社联合社', '广西北部湾银行', '抚顺银行股份有限公司', '辽阳银行股份有限公司', '贵州银行', '晋中银行股份有限公司', '西藏银行股份有限公司', '新疆汇和银行股份有限公司', '江苏江阴农村商业银行股份有限公司', '大连银行', '阜新银行', '吉林银行', '宁夏银行', '嘉兴银行', '常熟农商银行', '江苏江南农村商业银行股份公司', '江苏长江商行', '台州银行', '温州银行', '浙江稠州商业银行', '绍兴银行', '宁波通商银行股份有限公司', '温州民商银行', '浙江民泰商业银行', '浙江泰隆商业银行', '金华银行股份有限公司', '南洋商业银行', '贵阳银行', '韩亚银行', '宜宾商业银行', '自贡市商业银行', '顺德农村商业银行', '桂林银行股份有限公司', '承德银行', '富滇银行', '昆仑银行', '新韩银行中国', '邢台银行', '张家口市商业银行', '沧州银行', '兰州银行', '友利银行', '焦作中旅银行', '泉州银行', '厦门国际银行', '营口银行', '朝阳银行股份有限公司', '广东华兴银行', '长沙银行', '锦州银行', '九江银行', '石嘴山银行股份有限公司', '哈尔滨银行', '龙江银行', '江西银行', '攀枝花市商业银行', '重庆三峡银行', '广州银行', '晋城银行', '上饶银行', '赣州银行', '长城华西银行', '盛京银行', '甘肃银行', '中原银行', '湖北银行', '郑州银行', '富邦华一银行有限公司', '星展银行', '乐山市商业银行股份有限公司', '长治银行', '上海华瑞银行', '湖南三湘银行', '海南银行', '福建海峡银行', '北京农商银行', '河北省农村信用社', '上海农村商业银行', '江苏省农村信用社联合社', '浙江农信', '安徽省农村信用社联合社', '福建省农村信用社联合社', '江西省农村信用社', '海南省农村信用社', '重庆农村商业银行', '贵州省农村信用社', '新疆自治区农村信用社', '武汉农村商业银行', '成都农商银行', '张家港农村商业银行', '江苏紫金农村商业银行', '无锡农村商业银行', '太仓农村商业银行', '昆山农村商业银行', '广东南海农村商业银行', '浙江长兴农村商业银行'],
  383. 'xinyongka' => ['招商银行', '中国银行', '中信银行', '民生银行', '浦发银行', '平安银行', '光大银行', '广东发展银行', '上海银行', '华夏银行', '工商银行', '建设银行', '交通银行', '邮政储蓄银行', '浙商银行', '北京银行']
  384. ]]);
  385. }
  386. /**
  387. * 绑定支付宝账号
  388. * @param Request $request
  389. * @param UserDataModel $model
  390. * @return \think\Response
  391. */
  392. public function bindAlipay(Request $request, UserDataModel $model)
  393. {
  394. $re_data = $request->data;
  395. if (isset($re_data['real_name']) || isset($re_data['alipay'])) {
  396. return api_error_return('参数错误--算出sign_str不要传real_name跟alipay');
  397. }
  398. [$sign_str] = $request->getMore([
  399. ['sign_str', '']
  400. ], true);
  401. if (empty($sign_str))
  402. return api_error_return('参数错误');
  403. $data = json_decode(AESjiemi($sign_str));
  404. if (empty($data))
  405. return api_error_return('参数错误');
  406. $data = object_array($data);
  407. try {
  408. return api_succ_return(['msg' => '绑定成功', 'data' => $model->bindAlipay($data, $request->uid)]);
  409. } catch (\Exception $e) {
  410. return api_error_return('绑定失败');
  411. }
  412. }
  413. /**
  414. * 解绑支付宝
  415. * @param Request $request
  416. * @param UserDataModel $model
  417. * @return \think\Response
  418. */
  419. public function unbindAlipay(Request $request, UserDataModel $model)
  420. {
  421. try {
  422. return api_succ_return(['msg' => '解绑成功', 'data' => $model->unbindAlipay($request)]);
  423. } catch (\Exception $e) {
  424. return api_error_return('解绑失败');
  425. }
  426. }
  427. /************** 支付回调处理 **************/
  428. /**
  429. * 电科支付回调处理
  430. * @param Request $request
  431. * @return string
  432. */
  433. public function thirdPayZfbNewBack(Request $request)
  434. {
  435. $params = $request->param();
  436. $service = new ThirdPayServices();
  437. $date = date('Y-m-d H:i:s');
  438. $outTradeNo = isset($params['orderId'])? trim($params['orderId']) : '';
  439. $isPay = isset($params['pay'])? trim($params['pay']) : '';
  440. $amount = isset($params['amount'])? floatval($params['amount']) : 0;
  441. $paySign = isset($params['sign'])? trim($params['sign']) : '';
  442. // if(empty($paySign)){
  443. // unset($params['sign']);
  444. // return $service->diankesign($params);
  445. // }
  446. // 加锁
  447. $key = $outTradeNo? $outTradeNo : date('YmdHis');
  448. $cacheKeyLock = "caches:payNotify:dkpay:locks:otn_{$key}";
  449. $cacheKey = "caches:payNotify:dkpay:otn_{$key}:";
  450. if(RedisCache::get($cacheKeyLock)){
  451. return 'Frequent submission';
  452. }
  453. // 回调处理
  454. RedisCache::setnx($cacheKeyLock, 1, rand(2,3));
  455. RedisCache::set($cacheKey.'callback', ['params'=> $params,'date'=> $date], 7200);
  456. if ($outTradeNo && $amount && $isPay == 'true') {
  457. // 校验签名
  458. if ($paySign) {
  459. $signData = $params;
  460. unset($signData['sign']);
  461. $sign = $service->diankesign($signData);
  462. if ($sign == $paySign) {
  463. Db::startTrans();
  464. try {
  465. PaymentService::make()->payBack($params['orderId'], $params['amount'], 22, json_encode($params));
  466. Db::commit();
  467. return 'success';
  468. } catch (\Exception $e) {
  469. Db::rollback();
  470. $error = [
  471. 'msg'=> $e->getMessage(),
  472. 'trace'=> $e->getTrace(),
  473. ];
  474. RedisCache::set($cacheKey.'fail', ['params'=> $params,'error'=> $error,'date'=> $date], 7200);
  475. RedisCache::clear($cacheKeyLock);
  476. }
  477. } else {
  478. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'签名错误','date'=> $date], 7200);
  479. }
  480. }else{
  481. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'缺少签名参数','date'=> $date], 7200);
  482. }
  483. }
  484. return 'fail';
  485. }
  486. /**
  487. * 电科支付回调处理
  488. * @param Request $request
  489. * @return string
  490. */
  491. public function thirdPayDkysfPayBack(Request $request)
  492. {
  493. $params = $request->param();
  494. $service = new ThirdPayServices();
  495. $date = date('Y-m-d H:i:s');
  496. $outTradeNo = isset($params['orderId'])? trim($params['orderId']) : '';
  497. $isPay = isset($params['pay'])? trim($params['pay']) : '';
  498. $amount = isset($params['amount'])? floatval($params['amount']) : 0;
  499. $paySign = isset($params['sign'])? trim($params['sign']) : '';
  500. if(empty($paySign)){
  501. unset($params['sign']);
  502. return $service->makeSign($params);
  503. }
  504. // 加锁
  505. $key = $outTradeNo? $outTradeNo : date('YmdHis');
  506. $cacheKeyLock = "caches:payNotify:dkysf:locks:otn_{$key}";
  507. $cacheKey = "caches:payNotify:dkysf:otn_{$key}:";
  508. if(RedisCache::get($cacheKeyLock)){
  509. return 'Frequent submission';
  510. }
  511. // 回调处理
  512. RedisCache::setnx($cacheKeyLock, 1, rand(2,3));
  513. RedisCache::set($cacheKey.'callback', ['params'=> $params,'date'=> $date], 7200);
  514. if ($outTradeNo && $amount && $isPay == 'true') {
  515. $payConfig = PayConfigService::make()->getInfoByChannel(66, 1);
  516. $signKey = isset($payConfig['sign_key'])? $payConfig['sign_key'] : '';
  517. if(empty($payConfig) || empty($signKey)){
  518. return 'Payment config error';
  519. }
  520. // 校验签名
  521. if ($paySign) {
  522. $signData = $params;
  523. unset($signData['sign']);
  524. $sign = $service->makeSign($signData, $signKey);
  525. if ($sign == $paySign) {
  526. Db::startTrans();
  527. try {
  528. PaymentService::make()->payBack($params['orderId'], $params['amount'], 66, json_encode($params));
  529. Db::commit();
  530. return 'success';
  531. } catch (\Exception $e) {
  532. Db::rollback();
  533. $error = [
  534. 'msg'=> $e->getMessage(),
  535. 'trace'=> $e->getTrace(),
  536. ];
  537. RedisCache::set($cacheKey.'fail', ['params'=> $params,'error'=> $error,'date'=> $date], 7200);
  538. RedisCache::clear($cacheKeyLock);
  539. }
  540. } else {
  541. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'签名错误','date'=> $date], 7200);
  542. }
  543. }else{
  544. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'缺少签名参数','date'=> $date], 7200);
  545. }
  546. }
  547. return 'fail';
  548. }
  549. /**
  550. * 支付宝支付回调
  551. * @param Request $request
  552. * @return mixed
  553. */
  554. public function aliResult(Request $request)
  555. {
  556. $data = $request->param();
  557. $key = isset($data['out_trade_no']) ? $data['out_trade_no'] : date("YmdHis");
  558. $cacheKey = "caches:payNotify:alipay:otn_{$key}:";
  559. RedisCache::set($cacheKey."callback", ['params'=>$data,'date'=>'Y-m-d H:i:s'], 7200);
  560. if(empty($data)){
  561. return 'fail:params error';
  562. }
  563. try{
  564. return AliPayServices::instance()->data($data)->getNotifyInfo()->afterPay(2);
  565. } catch (\Exception $exception){
  566. RedisCache::set($cacheKey.'error', ['params'=>$data,'error'=> ['msg'=> $exception->getMessage(),'trace'=>$exception->getTrace()],'date'=>'Y-m-d H:i:s'], 7200);
  567. return 'fail';
  568. }
  569. }
  570. /**
  571. * 微信支付回调
  572. * @param Request $request
  573. * @return mixed
  574. */
  575. public function wxResult(Request $request)
  576. {
  577. $data['body'] = file_get_contents('php://input');
  578. $data['header'] = $request->header();
  579. $key = isset($data['body']['out_trade_no']) ? $data['body']['out_trade_no'] : date("YmdHis");
  580. $cacheKey = "caches:payNotify:wxpay:otn_{$key}:";
  581. RedisCache::set($cacheKey."callback", ['params'=>$data,'date'=>'Y-m-d H:i:s'], 7200);
  582. if(empty($data['body'])){
  583. return 'fail:params error';
  584. }
  585. try{
  586. return \app\api\services\WxPayServices::instance()->data($data)->getNotifyInfo()->afterPay(1);
  587. } catch (\Exception $exception){
  588. RedisCache::set($cacheKey.'error', ['params'=>$data,'error'=> ['msg'=> $exception->getMessage(),'trace'=>$exception->getTrace()],'date'=>'Y-m-d H:i:s'], 7200);
  589. return 'fail';
  590. }
  591. }
  592. /**
  593. *
  594. * thirdPaySqzBack支付三方sqz回调
  595. * @param Request $request
  596. * @return string
  597. */
  598. public function thirdPaySqzBack(Request $request)
  599. {
  600. $params = $request->param();
  601. $date = date('Y-m-d H:i:s');
  602. $service = new ThirdPayServices();
  603. $outTradeNo = isset($params['orderid'])? trim($params['orderid']) : '';
  604. $isPay = isset($params['opstate'])? trim($params['opstate']) : '-1';
  605. $amount = isset($params['ovalue'])? floatval($params['ovalue']) : 0;
  606. $paySign = isset($params['sign'])? trim($params['sign']) : '';
  607. if(empty($paySign)){
  608. return $service->sqzSign($params);
  609. }
  610. // 加锁
  611. $key = $outTradeNo? $outTradeNo : date('YmdHis');
  612. $cacheKeyLock = "caches:payNotify:sqzpay:locks:otn_{$key}";
  613. $cacheKey = "caches:payNotify:sqzpay:otn_{$key}:";
  614. if(RedisCache::get($cacheKeyLock)){
  615. return 'Frequent submission';
  616. }
  617. // 回调处理
  618. RedisCache::setnx($cacheKeyLock, 1, rand(2,3));
  619. RedisCache::set($cacheKey.'callback', ['params'=> $params,'date'=> $date], 7200);
  620. if ($outTradeNo && $isPay>=0 && $amount>0) {
  621. // 校验签名
  622. if ($paySign) {
  623. $sign = $service->sqzSign($params);
  624. if ($sign === $paySign) {
  625. if ($isPay == 0) {
  626. Db::startTrans();
  627. try {
  628. PaymentService::make()->payBack($outTradeNo, $amount, 15, json_encode($params));
  629. Db::commit();
  630. } catch (\Exception $e) {
  631. Db::rollback();
  632. $error = [
  633. 'msg'=> $e->getMessage(),
  634. 'trace'=> $e->getTrace(),
  635. ];
  636. RedisCache::set($cacheKey.'fail', ['params'=> $params,'error'=> $error,'date'=> $date], 7200);
  637. RedisCache::clear($cacheKeyLock);
  638. return 'opstate=0' . $e->getMessage();
  639. }
  640. } else {
  641. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'订单未支付','date'=> $date], 7200);
  642. return 'opstate=01';
  643. }
  644. } else {
  645. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'协议绑卡签名错误','date'=> $date], 7200);
  646. return 'opstate=0';
  647. }
  648. }
  649. }else{
  650. RedisCache::set($cacheKey.'error', ['params'=> $params,'error'=>'回调参数错误','date'=> $date], 7200);
  651. }
  652. return 'opstate=0';
  653. }
  654. /**
  655. * 三方支付宝sqz回调
  656. * @param Request $request
  657. * @return string
  658. */
  659. public function thirdPaySqzAliBack(Request $request)
  660. {
  661. $params = $request->param();
  662. if (isset($params['orderid']) && isset($params['opstate']) && isset($params['ovalue'])) {
  663. // 校验签名
  664. if (isset($params['sign'])) {
  665. $sign = md5('orderid=' . $params['orderid'] . '&opstate=' . $params['opstate'] . '&ovalue=' . $params['ovalue'] . env('PAYSQZ.SIGNKEY'));
  666. if ($sign === $params['sign']) {
  667. if ($params['opstate'] == 0) {
  668. Db::startTrans();
  669. try {
  670. $service = new ThirdPayServices();
  671. $service->payBack($params['orderid'], $params['ovalue'], 16, json_encode($params));
  672. Db::commit();
  673. return 'success';
  674. } catch (\Exception $e) {
  675. Db::rollback();
  676. sr_log($e->getMessage());
  677. return 'opstate=0' . $e->getMessage();
  678. }
  679. } else {
  680. return 'opstate=01';
  681. }
  682. } else {
  683. return 'opstate=0';
  684. }
  685. }
  686. }
  687. return 'opstate=0';
  688. }
  689. /**
  690. * 支付宝支付回调 多来贝
  691. * @param Request $request
  692. * @return mixed
  693. */
  694. public function aliResultDLB(Request $request)
  695. {
  696. sr_log('----------------------支付三方回调-------------------------');
  697. sr_log($request);
  698. sr_log($request->param());
  699. sr_log('----------------------支付三方回调-------------------------');
  700. // DLB1649854201945040279940469OP
  701. $result = [
  702. 'order_id' => 'DLB1649854201945040279940469OP'
  703. ];
  704. $pay_info = Db::name('payment')->where('out_trade_no', $result['order_id'])->find();
  705. if (!$pay_info) {
  706. echo 'success';
  707. die();
  708. } else {
  709. if ($pay_info['state'] != 7) {
  710. echo 'success';
  711. die();
  712. }
  713. Db::startTrans();
  714. try {
  715. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  716. switch ($pay_info['order_type']) {
  717. case 1: // 充值
  718. break;
  719. case 3:
  720. // 充值会员
  721. //
  722. break;
  723. case 4: //购买商品
  724. // $order = Order::where(['order_sn' => explode(',', $pay_info['remarks'])])->select()->toArray();
  725. // Order::payDoneOrderCallback($order, 3, $pay_info['uid']);
  726. $m_goods = new ShopGoodsModel();
  727. $m_user = new UserModel();
  728. $m_shoporder = new ShopOrderModel();
  729. // 更改订单状态
  730. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  731. $nowTime = date('Y-m-d H:i:s', time());
  732. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  733. ->update(['pay_type' => 2, 'status' => 1, 'updated_time' => $nowTime]);
  734. // 增加销量
  735. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  736. foreach ($orderGoods as $k => $v) {
  737. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  738. }
  739. // 送积分
  740. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  741. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  742. break;
  743. }
  744. Db::commit();
  745. echo 'success';
  746. die;
  747. } catch (\Exception $e) {
  748. Db::rollback();
  749. echo 'failure';
  750. die;
  751. }
  752. }
  753. echo 'success';
  754. die();
  755. }
  756. /**
  757. * 微信支付回调 多来贝
  758. * @param Request $request
  759. * @return mixed
  760. */
  761. public function wechatResultDLB(Request $request)
  762. {
  763. sr_log('----------------------支付三方回调-------------------------');
  764. sr_log(json_encode($request->param()));
  765. sr_log('----------------------支付三方回调-------------------------');
  766. $result = $request->param();
  767. try {
  768. if (!$result || !$result['sign']) {
  769. sr_log('11111');
  770. echo 'success';
  771. die();
  772. }
  773. $sign = thirdPayGetSign($result, '897d9ea909093173b24dd89c772181e4');
  774. if ($result['sign'] != $sign) {
  775. sr_log('222222');
  776. echo 'success';
  777. die();
  778. }
  779. if ($result['status'] != 1) {
  780. sr_log('33333333');
  781. echo 'success';
  782. die();
  783. }
  784. } catch (Exception $e) {
  785. echo 'success';
  786. sr_log('aaa' . $e->getMessage());
  787. die();
  788. }
  789. $pay_info = Db::name('payment')->where('out_trade_no', $result['order_no'])->find();
  790. if (!$pay_info) {
  791. sr_log('333333333');
  792. echo 'success';
  793. die();
  794. } else {
  795. if ($pay_info['state'] != 7) {
  796. sr_log('8888' . '已经处理过了');
  797. echo 'success';
  798. die();
  799. }
  800. if ($result['total_amount'] < $pay_info['total_fee']) {
  801. sr_testDb(json_encode($pay_info), 1);
  802. sr_log('9999' . '支付金额错误');
  803. echo 'success';
  804. die();
  805. }
  806. Db::startTrans();
  807. try {
  808. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  809. switch ($pay_info['order_type']) {
  810. case 1: // 充值
  811. break;
  812. case 3:
  813. // 充值会员
  814. break;
  815. case 4: //购买商品
  816. // 更改订单状态
  817. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  818. $nowTime = date('Y-m-d H:i:s', time());
  819. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  820. ->update(['pay_type' => 2, 'status' => 1, 'updated_time' => $nowTime]);
  821. // 增加销量
  822. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  823. foreach ($orderGoods as $k => $v) {
  824. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  825. }
  826. // 送积分
  827. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  828. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  829. break;
  830. }
  831. Db::commit();
  832. echo 'success';
  833. die;
  834. } catch (\Exception $e) {
  835. Db::rollback();
  836. echo 'failure';
  837. sr_log('微信多乐宝报错:' . $e->getMessage());
  838. die;
  839. }
  840. }
  841. echo 'success';
  842. die();
  843. }
  844. /**
  845. * 微信支付回调 畅联
  846. * @param Request $request
  847. * @return mixed
  848. */
  849. public function wechatResultCL(Request $request)
  850. {
  851. sr_log('----------------------支付三方回调-------------------------');
  852. sr_log(json_encode($request->param()));
  853. sr_log('----------------------支付三方回调-------------------------');
  854. $result = $request->param();
  855. try {
  856. if (!$result || !$result['sign']) {
  857. sr_log('cl11111');
  858. echo 'success';
  859. die();
  860. }
  861. $sign = thirdPayCheckSignCL($result, 'XMLfjHMPOGexsSaadIWSVCNG0XJBClZZ');
  862. if ($result['sign'] != $sign) {
  863. sr_log('cl222222');
  864. echo 'success';
  865. die();
  866. }
  867. if ($result['callbacks'] != 'CODE_SUCCESS') {
  868. sr_log('cl33333333');
  869. echo 'success';
  870. die();
  871. }
  872. } catch (Exception $e) {
  873. echo 'success';
  874. sr_log('claaa' . $e->getMessage());
  875. die();
  876. }
  877. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->find();
  878. if (!$pay_info) {
  879. sr_log('cl333333333');
  880. echo 'success';
  881. die();
  882. } else {
  883. if ($pay_info['state'] != 7) {
  884. sr_log('cl8888' . '已经处理过了');
  885. echo 'success';
  886. die();
  887. }
  888. if ($result['amount'] < $pay_info['total_fee']) {
  889. sr_testDb(json_encode($pay_info), 1);
  890. sr_log('cl9999' . '支付金额错误');
  891. echo 'success';
  892. die();
  893. }
  894. Db::startTrans();
  895. try {
  896. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->lock(true)->find();
  897. Db::name("thirdpay_back")->insert([
  898. 'out_order_no' => $result['out_trade_no'],
  899. 'content' => json_encode($result),
  900. 'create_time' => sr_getcurtime(time()),
  901. 'type' => 1,
  902. 'uid' => $pay_info['uid']
  903. ]);
  904. if (empty($pay_info)) {
  905. throw new Exception('畅联并发了');
  906. }
  907. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  908. switch ($pay_info['order_type']) {
  909. case 1: // 充值
  910. break;
  911. case 3:
  912. // 充值会员
  913. break;
  914. case 4: //购买商品
  915. $m_user = new UserModel();
  916. // 更改订单状态
  917. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  918. $nowTime = date('Y-m-d H:i:s', time());
  919. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  920. ->update(['status' => 1, 'pay_type' => 7, 'updated_time' => $nowTime]);
  921. // 增加销量
  922. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  923. foreach ($orderGoods as $k => $v) {
  924. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  925. }
  926. // 送积分
  927. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  928. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  929. break;
  930. }
  931. Db::commit();
  932. } catch (\Exception $e) {
  933. Db::rollback();
  934. sr_log('cl微信报错:' . $e->getMessage());
  935. echo 'failure';
  936. die;
  937. }
  938. echo 'success';
  939. die();
  940. }
  941. echo 'success';
  942. die();
  943. }
  944. /**
  945. * 支付宝支付回调 畅联
  946. * @param Request $request
  947. * @return mixed
  948. */
  949. public function AliResultCL(Request $request)
  950. {
  951. sr_log('----------------------支付三方回调-------------------------');
  952. sr_log(json_encode($request->param()));
  953. sr_log('----------------------支付三方回调-------------------------');
  954. $result = $request->param();
  955. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->find();
  956. if (!$pay_info) {
  957. sr_log('cl333333333');
  958. echo 'success';
  959. die();
  960. } else {
  961. if ($pay_info['state'] != 7) {
  962. sr_log('cl8888' . '已经处理过了');
  963. echo 'success';
  964. die();
  965. }
  966. if ($result['amount'] < $pay_info['total_fee']) {
  967. sr_testDb(json_encode($pay_info), 1);
  968. sr_log('cl9999' . '支付金额错误');
  969. echo 'success';
  970. die();
  971. }
  972. $key = 'api' . $request->pathinfo() . $result['out_trade_no'];
  973. Db::startTrans();
  974. try {
  975. redisLock($key);
  976. $pay_info = Db::name('payment')->where('out_trade_no', $result['out_trade_no'])->lock(true)->find();
  977. Db::name("thirdpay_back")->insert([
  978. 'out_order_no' => $result['out_trade_no'],
  979. 'content' => json_encode($result),
  980. 'create_time' => sr_getcurtime(time()),
  981. 'type' => 1,
  982. 'uid' => $pay_info['uid']
  983. ]);
  984. if (empty($pay_info)) {
  985. throw new Exception('畅联支付宝并发了');
  986. }
  987. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  988. switch ($pay_info['order_type']) {
  989. case 1: // 充值
  990. break;
  991. case 3:
  992. // 充值会员
  993. break;
  994. case 4: //购买商品
  995. $m_user = new UserModel();
  996. // 更改订单状态
  997. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  998. $nowTime = date('Y-m-d H:i:s', time());
  999. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  1000. ->update(['status' => 1, 'pay_type' => 8, 'updated_time' => $nowTime]);
  1001. // 增加销量
  1002. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  1003. foreach ($orderGoods as $k => $v) {
  1004. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  1005. }
  1006. // 送积分
  1007. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  1008. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  1009. break;
  1010. }
  1011. Db::commit();
  1012. } catch (\Exception $e) {
  1013. Db::rollback();
  1014. if ($e->getCode() != apiPingFanCode()) {
  1015. redisFree($key);
  1016. }
  1017. sr_log('cl支付宝报错:' . $e->getMessage());
  1018. echo 'failure';
  1019. die;
  1020. }
  1021. redisFree($key);
  1022. echo 'success';
  1023. die();
  1024. }
  1025. echo 'success';
  1026. die();
  1027. }
  1028. /**
  1029. * mo宝银联回调 富友
  1030. * @param Request $request
  1031. * @return mixed
  1032. */
  1033. public function BankResultFY(Request $request)
  1034. {
  1035. $res = file_get_contents('php://input');
  1036. sr_log('----------------------支付三方富有回调-------------------------');
  1037. sr_log($res);
  1038. sr_log('----------------------支付三方富有回调-------------------------');
  1039. $result = json_decode($res);
  1040. if (isset($result->mchnt_cd) && isset($result->message) && isset($result->resp_code) && isset($result->resp_desc)) {
  1041. if ($result->resp_code == 0000) {
  1042. $res_decode = json_decode(RSA_openssl($result->message, 'decode'));
  1043. if (isset($res_decode->order_st) && $res_decode->order_st == 1) {
  1044. $out_trade_no = 'FYYL' . $res_decode->order_id;
  1045. $pay_info = Db::name('payment')->where('out_trade_no', $out_trade_no)->find();
  1046. if ($pay_info) {
  1047. if ($pay_info['state'] == 7) {
  1048. if ($res_decode->order_amt < bcmul($pay_info['total_fee'], 100, 0)) {
  1049. echo 'success';
  1050. die();
  1051. }
  1052. $key = 'api' . $request->pathinfo() . $out_trade_no;
  1053. Db::startTrans();
  1054. try {
  1055. redisLock($key);
  1056. $pay_info = Db::name('payment')->where('out_trade_no', $out_trade_no)->lock(true)->find();
  1057. Db::name("thirdpay_back")->insert([
  1058. 'out_order_no' => $out_trade_no,
  1059. 'content' => json_encode($res_decode),
  1060. 'create_time' => sr_getcurtime(time()),
  1061. 'type' => 2,
  1062. 'uid' => $pay_info['uid']
  1063. ]);
  1064. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  1065. switch ($pay_info['order_type']) {
  1066. case 1: // 充值
  1067. break;
  1068. case 3:
  1069. // 充值会员
  1070. //
  1071. break;
  1072. case 4: //购买商品
  1073. $m_user = new UserModel();
  1074. // 更改订单状态
  1075. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  1076. $nowTime = date('Y-m-d H:i:s', time());
  1077. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  1078. ->update(['status' => 1, 'pay_type' => 9, 'updated_time' => $nowTime]);
  1079. // 增加销量
  1080. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  1081. foreach ($orderGoods as $k => $v) {
  1082. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  1083. }
  1084. $user = $m_user->where('id', $pay_info['uid'])->find();
  1085. // 送积分
  1086. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  1087. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  1088. // 释放用户福利积分或者锁定积分到余额
  1089. $sf_money = intval(intval($pay_info['total_fee']) / 100) * 5;
  1090. if ($sf_money > 0) {
  1091. $is_sf = false;
  1092. if ($user['score_away'] > $sf_money && !$is_sf) {
  1093. if ($user['score_away'] <= $sf_money) {
  1094. $sf_money = intval($user['score_away']);
  1095. }
  1096. edit_user_score(24, $pay_info['uid'], $sf_money);
  1097. edit_user_scoreaway(8, $pay_info['uid'], $sf_money);
  1098. $is_sf = true;
  1099. }
  1100. if ($user['score_lock'] > $sf_money && !$is_sf) {
  1101. edit_user_score(25, $pay_info['uid'], $sf_money);
  1102. edit_user_lock_score(2, $pay_info['uid'], $sf_money);
  1103. $is_sf = true;
  1104. }
  1105. }
  1106. break;
  1107. }
  1108. Db::commit();
  1109. } catch (\Exception $e) {
  1110. Db::rollback();
  1111. if ($e->getCode() != apiPingFanCode()) {
  1112. redisFree($key);
  1113. }
  1114. sr_log('fy支付报错:' . $e->getMessage());
  1115. echo 'failure';
  1116. die;
  1117. }
  1118. }
  1119. }
  1120. }
  1121. }
  1122. }
  1123. redisFree($key);
  1124. echo 'success';
  1125. die;
  1126. }
  1127. /**
  1128. * 进件审核回调
  1129. * @param Request $request
  1130. */
  1131. public function yplApplyResult(Request $request)
  1132. {
  1133. $res = file_get_contents('php://input');
  1134. sr_log('----------------------ypl审核回调-------------------------');
  1135. sr_log($res);
  1136. sr_log('----------------------ypl审核回调-------------------------');
  1137. echo "0000";
  1138. die();
  1139. }
  1140. /**
  1141. * @param Request $request
  1142. */
  1143. public function ZfbResultYPL(Request $request)
  1144. {
  1145. $res = file_get_contents('php://input');
  1146. sr_log('----------------------ypl回调-------------------------');
  1147. sr_log($res);
  1148. sr_log('----------------------ypl回调-------------------------');
  1149. $res = json_decode($res, true);
  1150. Db::startTrans();
  1151. try {
  1152. if ($res['payState'] != '00') {
  1153. echo "0000";
  1154. die();
  1155. }
  1156. $pay_info = Db::name('payment')->where('out_trade_no', $res['outTradeNo'])->lock(true)->find();
  1157. Db::name("thirdpay_back")->insert([
  1158. 'out_order_no' => $res['outTradeNo'],
  1159. 'content' => json_encode($res),
  1160. 'create_time' => sr_getcurtime(time()),
  1161. 'type' => 3,
  1162. 'uid' => $pay_info['uid']
  1163. ]);
  1164. Db::name('payment')->where('id', $pay_info['id'])->update(['state' => 6, 'pay_at' => date('Y-m-d H:i:s')]); // 更改订单状态
  1165. switch ($pay_info['order_type']) {
  1166. case 1: // 充值
  1167. break;
  1168. case 3:
  1169. // 充值会员
  1170. break;
  1171. case 4: //购买商品
  1172. $m_user = new UserModel();
  1173. // 更改订单状态
  1174. $order = ShopOrderModel::where('order_sn', $pay_info['remarks'])->find();
  1175. $nowTime = date('Y-m-d H:i:s', time());
  1176. Db::name('shop_order')->where(['order_sn' => $pay_info['remarks']])
  1177. ->update(['status' => 1, 'pay_type' => 8, 'updated_time' => $nowTime]);
  1178. // 增加销量
  1179. $orderGoods = OrderGoods::where(['order_id' => $order['order_id']])->select()->toArray();
  1180. foreach ($orderGoods as $k => $v) {
  1181. ShopGoodsModel::where(['goods_id' => $v['goods_id']])->inc('sales_volume', $v['num'])->inc('real_sales_volume', $v['num'])->update();
  1182. }
  1183. $user = $m_user->where('id', $pay_info['uid'])->find();
  1184. // 送积分
  1185. edit_user_score(5, $order['user_id'], $order['rebate_score']);
  1186. edit_user_redscore(1, $order['user_id'], $order['rebate_lock_score']);
  1187. // 释放用户福利积分或者锁定积分到余额
  1188. $sf_money = intval(intval($pay_info['total_fee']) / 100) * 5;
  1189. if ($sf_money > 0) {
  1190. $is_sf = false;
  1191. if ($user['score_away'] > $sf_money && !$is_sf) {
  1192. if ($user['score_away'] <= $sf_money) {
  1193. $sf_money = intval($user['score_away']);
  1194. }
  1195. edit_user_score(24, $pay_info['uid'], $sf_money);
  1196. edit_user_scoreaway(8, $pay_info['uid'], $sf_money);
  1197. $is_sf = true;
  1198. }
  1199. if ($user['score_lock'] > $sf_money && !$is_sf) {
  1200. edit_user_score(25, $pay_info['uid'], $sf_money);
  1201. edit_user_lock_score(2, $pay_info['uid'], $sf_money);
  1202. $is_sf = true;
  1203. }
  1204. }
  1205. break;
  1206. }
  1207. Db::commit();
  1208. } catch (\Exception $e) {
  1209. Db::rollback();
  1210. sr_log('ypl报错:' . $e->getMessage());
  1211. echo "0000";
  1212. die();
  1213. }
  1214. echo "0000";
  1215. die();
  1216. }
  1217. /**
  1218. * @param Request $request
  1219. * @return \think\Response
  1220. */
  1221. public function ZfbResultHF(Request $request)
  1222. {
  1223. /**
  1224. * 判断支付异步回调业务处理
  1225. * User: shuaishuai.niu
  1226. * Date: 2020/11/16
  1227. * Time: 14:01
  1228. */
  1229. sr_log('----------------------汇付回调-------------------------');
  1230. sr_log($_POST['data']);
  1231. sr_log('----------------------汇付回调-------------------------');
  1232. $params = $_POST['data'];
  1233. # 加载SDK需要的文件
  1234. include_once "../extend/thirdpay/AdapaySdk/init.php";
  1235. # 加载商户的配置文件
  1236. include_once "../extend/thirdpay/config.php";
  1237. $adapay_tools = new \AdaPaySdk\AdapayTools();
  1238. $post_data = json_decode($_POST['data'], 1);
  1239. $post_data_str = json_encode($post_data, JSON_UNESCAPED_UNICODE);
  1240. $post_sign_str = isset($_POST['sign']) ? $_POST['sign'] : '';
  1241. # 先校验签名和返回的数据的签名的数据是否一致
  1242. $sign_flag = $adapay_tools->verifySign($post_data_str, $post_sign_str);
  1243. if ($sign_flag) {
  1244. Db::startTrans();
  1245. try {
  1246. if ($post_data['status'] != 'succeeded') {
  1247. sr_throw('成功1');
  1248. }
  1249. $pay_info = Db::name('payment')->where('out_trade_no', $post_data['order_no'])->lock(true)->find();
  1250. if ($pay_info['state'] != 7) {
  1251. sr_throw('成功1');
  1252. }
  1253. $service = new ThirdPayServices();
  1254. $service->payBack($post_data['order_no'], 0, 14, json_encode($params));
  1255. Db::commit();
  1256. } catch (\Exception $e) {
  1257. Db::rollback();
  1258. sr_log('汇付支付宝回调报错:' . $e->getMessage());
  1259. return api_succ_return('成功2' . $e->getMessage());
  1260. die();
  1261. }
  1262. return api_succ_return('成功');
  1263. die();
  1264. } else {
  1265. sr_log('签名不通过:[' . $post_sign_str . ']' . 'post_data_str--[' . $post_data_str . ']');
  1266. return api_succ_return('成功1');
  1267. die();
  1268. }
  1269. }
  1270. /**
  1271. * 代付回调
  1272. * @param Request $request
  1273. * @return string
  1274. */
  1275. public function thirdPayZfbNewBackdf(Request $request)
  1276. {
  1277. sr_log('----------------------三方支付宝代付电科回调-------------------------1');
  1278. sr_log($request->param());
  1279. sr_log('----------------------三方支付宝代付电科回调-------------------------2');
  1280. $params = $request->param();
  1281. $service = new ThirdPayServices();
  1282. if (isset($params['orderId']) && isset($params['amount'])) {
  1283. // 校验签名
  1284. if (isset($params['sign'])) {
  1285. $back_sign = $params['sign'];
  1286. unset($params['sign']);
  1287. $sign = $service->diankesigndf($params);
  1288. if ($sign == $back_sign) {
  1289. try {
  1290. $service->payDfBack($params['orderId'], $params['amount'], $params, json_encode($params));
  1291. } catch (Exception $e) {
  1292. sr_log('电科报错' . $e->getMessage());
  1293. return 'success';
  1294. }
  1295. } else {
  1296. return 'success';
  1297. }
  1298. }
  1299. }
  1300. return 'success';
  1301. }
  1302. /**
  1303. * 三方微信sqz回调
  1304. * @param Request $request
  1305. * @return string
  1306. */
  1307. public function thirdPaySqzWeixinBack(Request $request)
  1308. {
  1309. sr_log('----------------------三方微信sqz回调-------------------------');
  1310. sr_log($request->param());
  1311. sr_log('----------------------三方微信sqz回调-------------------------');
  1312. $params = $request->param();
  1313. if (isset($params['orderid']) && isset($params['opstate']) && isset($params['ovalue'])) {
  1314. // 校验签名
  1315. if (isset($params['sign'])) {
  1316. $sign = md5('orderid=' . $params['orderid'] . '&opstate=' . $params['opstate'] . '&ovalue=' . $params['ovalue'] . env('PAYSQZ.SIGNKEY'));
  1317. if ($sign === $params['sign']) {
  1318. if ($params['opstate'] == 0) {
  1319. Db::startTrans();
  1320. try {
  1321. $service = new ThirdPayServices();
  1322. $service->payBack($params['orderid'], $params['ovalue'], 17, json_encode($params));
  1323. Db::commit();
  1324. } catch (\Exception $e) {
  1325. Db::rollback();
  1326. sr_log($e->getMessage());
  1327. return 'opstate=0' . $e->getMessage();
  1328. }
  1329. } else {
  1330. return 'opstate=01';
  1331. }
  1332. } else {
  1333. return 'opstate=0';
  1334. }
  1335. }
  1336. }
  1337. return 'opstate=0';
  1338. }
  1339. /**
  1340. * 三方银行快捷sqz回调
  1341. * @param Request $request
  1342. * @return string
  1343. */
  1344. public function thirdPaySqzKuaiBack(Request $request)
  1345. {
  1346. sr_log('----------------------三方银行快捷sqz回调-------------------------');
  1347. sr_log($request->param());
  1348. sr_log('----------------------三方银行快捷sqz回调-------------------------');
  1349. $params = $request->param();
  1350. if (isset($params['orderid']) && isset($params['opstate']) && isset($params['ovalue'])) {
  1351. // 校验签名
  1352. if (isset($params['sign'])) {
  1353. $sign = md5('orderid=' . $params['orderid'] . '&opstate=' . $params['opstate'] . '&ovalue=' . $params['ovalue'] . env('PAYSQZ.SXY_SIGNKEY'));
  1354. if ($sign === $params['sign']) {
  1355. if ($params['opstate'] == 0) {
  1356. Db::startTrans();
  1357. try {
  1358. $service = new ThirdPayServices();
  1359. $service->payBack($params['orderid'], $params['ovalue'], 18, json_encode($params));
  1360. Db::commit();
  1361. } catch (\Exception $e) {
  1362. Db::rollback();
  1363. sr_log($e->getMessage());
  1364. return 'opstate=0' . $e->getMessage();
  1365. }
  1366. } else {
  1367. return 'opstate=01';
  1368. }
  1369. } else {
  1370. sr_log('yinsheng快捷银行签名有问题');
  1371. return 'opstate=01';
  1372. }
  1373. }
  1374. }
  1375. return 'opstate=0';
  1376. }
  1377. /**
  1378. * Ys银盛第三方支付回调
  1379. * @param Request $request
  1380. * @return string
  1381. */
  1382. public function thirdPayYsBack(Request $request)
  1383. {
  1384. $params = $request->post();
  1385. $res = $this->sign_verify($params);
  1386. $date = date('Y-m-d H:i:s');
  1387. $outTradeNo = isset($params['out_trade_no']) ? $params['out_trade_no'] : '0';
  1388. $cacheKey = "caches:payment:ysBack:{$outTradeNo}";
  1389. RedisCache::set($cacheKey . '_param', ['params' => $params, 'sign' => $res, 'date' => $date], 7200);
  1390. if ($res) {
  1391. Db::startTrans();
  1392. try {
  1393. $service = new ThirdPayServices();
  1394. $service->payBack($params['out_trade_no'], $params['settlement_amount'], 20, json_encode($params), $cacheKey);
  1395. Db::commit();
  1396. } catch (\Exception $e) {
  1397. Db::rollback();
  1398. RedisCache::set($cacheKey . '_fail', ['error' => '银盛回调报错:' . $e->getMessage(), 'params' => $params, 'sign' => $res, 'date' => $date], 7200);
  1399. return 'success';
  1400. }
  1401. } else {
  1402. RedisCache::set($cacheKey . '_signFail', ['error' => '银盛签名有问题', 'params' => $params, 'sign' => $res, 'date' => $date], 7200);
  1403. return 'success';
  1404. }
  1405. return 'success';
  1406. }
  1407. /**
  1408. * 验签转明码
  1409. * @param input check
  1410. * @param input msg
  1411. * @return data
  1412. * @return success
  1413. */
  1414. public function sign_check($sign, $data)
  1415. {
  1416. $publickeyFile = env('ZLYS.CER_PATH'); //公钥
  1417. $certificateCAcerContent = file_get_contents($publickeyFile);
  1418. $certificateCApemContent = '-----BEGIN CERTIFICATE-----' . PHP_EOL . chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL) . '-----END CERTIFICATE-----' . PHP_EOL;
  1419. // 签名验证
  1420. $success = openssl_verify($data, base64_decode($sign), openssl_get_publickey($certificateCApemContent), OPENSSL_ALGO_SHA1);
  1421. return $success;
  1422. }
  1423. /**
  1424. * 签名验证
  1425. * @param $data
  1426. * @return bool
  1427. */
  1428. public function sign_verify($data)
  1429. {
  1430. //返回的数据处理
  1431. $sign = trim($data['sign']);
  1432. unset($data['sign']);
  1433. ksort($data);
  1434. $url = "";
  1435. foreach ($data as $key => $val) {
  1436. /* 验证签名 */
  1437. if ($val) $url .= $key . '=' . $val . '&';
  1438. }
  1439. $str = trim($url, '&');
  1440. if ($this->sign_check($sign, $str) != true) {
  1441. return false;
  1442. } else {
  1443. return true;
  1444. }
  1445. }
  1446. /**
  1447. * 用户银行卡绑定回调
  1448. * @param Request $request
  1449. * @return string
  1450. * @throws \think\db\exception\DataNotFoundException
  1451. * @throws \think\db\exception\DbException
  1452. * @throws \think\db\exception\ModelNotFoundException
  1453. */
  1454. public function userSignBank(Request $request)
  1455. {
  1456. $para = $request->param();
  1457. $date = date('Y-m-d H:i:s');
  1458. $cacheKey = "caches:userBankSign:callback:";
  1459. RedisCache::set($cacheKey . 'param', ['msg' => '支付三方签约sqz回调', 'params' => $para, 'date' => $date], 7200);
  1460. if (isset($para['userno']) && $para['userno']) {
  1461. // 校验签名
  1462. if (isset($para['orderid']) && isset($para['opstate']) && isset($para['userno']) && isset($para['sign'])) {
  1463. $sign = md5('orderid=' . $para['orderid'] . '&opstate=' . $para['opstate'] . '&userno=' . $para['userno'] . env('PAYSQZ.SIGNKEY'));
  1464. if ($sign === $para['sign']) {
  1465. if (UserBankSignService::make()->checkHasBySignOrderId($para['orderid'])) {
  1466. // 获取userno 然后保存
  1467. Db::name('user_bank_sign')->where('signorder_id', $para['orderid'])->save([
  1468. 'userno' => $para['userno'],
  1469. 'status' => 2
  1470. ]);
  1471. }
  1472. return 'success';
  1473. } else {
  1474. return 'error';
  1475. }
  1476. }
  1477. }
  1478. return 'error';
  1479. }
  1480. /**
  1481. * 之前对接的支付备份
  1482. * @param Request $request
  1483. * @return \think\Response
  1484. */
  1485. private function payOldAction(Request $request)
  1486. {
  1487. $setting = [];
  1488. $appresource = $request->post('app_sources', '');
  1489. $order_type = $request->post('order_type');
  1490. if (empty($order_type)) {
  1491. return api_error_return('参数错误');
  1492. }
  1493. // 商城购买
  1494. if ($order_type == 4) {
  1495. if ($appresource == 'android') {
  1496. // 石学长 银联支付
  1497. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1498. }
  1499. if ($appresource == 'ios') {
  1500. // 石学长 银联支付
  1501. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1502. }
  1503. }
  1504. // 购买服务商
  1505. if ($order_type == 6) {
  1506. if ($appresource == 'android') {
  1507. // 石学长 银联支付
  1508. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1509. // 无卡快捷支付 直连银盛
  1510. array_push($setting, ['is_open' => 1, 'channel' => 20, 'title' => '无卡快捷银联支付(支持信用卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1511. }
  1512. if ($appresource == 'ios') {
  1513. // 石学长 银联支付
  1514. array_push($setting, ['is_open' => 1, 'channel' => 15, 'title' => '银联(协议绑卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1515. // 无卡快捷支付
  1516. array_push($setting, ['is_open' => 1, 'channel' => 20, 'title' => '无卡快捷银联支付(支持信用卡)', 'icon' => getWebUrl() . '/static/img/payconfig/ic_yinlian_pay.png']);
  1517. }
  1518. }
  1519. }
  1520. }